]> git.saurik.com Git - cycript.git/blobdiff - Cycript.y.in
Progress on autoconf doom!
[cycript.git] / Cycript.y.in
index 1789d47b7aff735022da699a2e1390b08513df37..3b7d21f982d3b4fb461a62d275cfd51f478811df 100644 (file)
@@ -67,6 +67,7 @@ typedef struct {
         CYBoolean *boolean_;
         CYClause *clause_;
         cy::Syntax::Catch *catch_;
+        CYComment *comment_;
         CYComprehension *comprehension_;
         CYCompound *compound_;
         CYDeclaration *declaration_;
@@ -98,6 +99,7 @@ typedef struct {
         CYField *field_;
         CYMessage *message_;
         CYMessageParameter *messageParameter_;
+        CYProtocol *protocol_;
         CYSelectorPart *selector_;
 @end
 
@@ -153,11 +155,14 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %token SlashRight "/>"
 %token LeftSlash "</"
 
-%token At "@"
 %token ColonColon "::"
 %token PeriodPeriod ".."
 @end
 
+@begin E4X ObjectiveC
+%token At "@"
+@end
+
 %token Ampersand "&"
 %token AmpersandAmpersand "&&"
 %token AmpersandEqual "&="
@@ -206,6 +211,8 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %token SemiColon ";"
 %token NewLine "\n"
 
+%token <comment_> Comment
+
 %token OpenParen "("
 %token CloseParen ")"
 
@@ -311,7 +318,6 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 
 %type <expression_> AdditiveExpression
 %type <expression_> AdditiveExpressionNoBF
-%type <expression_> AdditiveExpressionNoWC
 %type <argument_> ArgumentList
 %type <argument_> ArgumentList_
 %type <argument_> ArgumentListOpt
@@ -319,27 +325,22 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <literal_> ArrayLiteral
 %type <expression_> AssigneeExpression
 %type <expression_> AssigneeExpressionNoBF
-%type <expression_> AssigneeExpressionNoWC
 %type <expression_> AssignmentExpression
 %type <assignment_> AssignmentExpression_
 %type <expression_> AssignmentExpressionNoBF
 %type <expression_> AssignmentExpressionNoIn
-%type <expression_> AssignmentExpressionNoWC
 %type <expression_> BitwiseANDExpression
 %type <expression_> BitwiseANDExpressionNoBF
 %type <expression_> BitwiseANDExpressionNoIn
-%type <expression_> BitwiseANDExpressionNoWC
 %type <statement_> Block
 %type <statement_> Block_
 %type <boolean_> BooleanLiteral
 %type <expression_> BitwiseORExpression
 %type <expression_> BitwiseORExpressionNoBF
 %type <expression_> BitwiseORExpressionNoIn
-%type <expression_> BitwiseORExpressionNoWC
 %type <expression_> BitwiseXORExpression
 %type <expression_> BitwiseXORExpressionNoBF
 %type <expression_> BitwiseXORExpressionNoIn
-%type <expression_> BitwiseXORExpressionNoWC
 %type <statement_> BreakStatement
 %type <expression_> CallExpression
 %type <expression_> CallExpressionNoBF
@@ -352,7 +353,6 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <expression_> ConditionalExpression
 %type <expression_> ConditionalExpressionNoBF
 %type <expression_> ConditionalExpressionNoIn
-%type <expression_> ConditionalExpressionNoWC
 %type <statement_> ContinueStatement
 %type <clause_> DefaultClause
 %type <statement_> DoWhileStatement
@@ -365,7 +365,6 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <expression_> EqualityExpression
 %type <expression_> EqualityExpressionNoBF
 %type <expression_> EqualityExpressionNoIn
-%type <expression_> EqualityExpressionNoWC
 %type <expression_> Expression
 %type <expression_> ExpressionOpt
 %type <compound_> Expression_
@@ -385,7 +384,6 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <statement_> FunctionBody
 %type <statement_> FunctionDeclaration
 %type <expression_> FunctionExpression
-%type <expression_> FunctionExpression_
 %type <identifier_> Identifier
 %type <identifier_> IdentifierOpt
 %type <comprehension_> IfComprehension
@@ -398,7 +396,6 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <statement_> LabelledStatement
 %type <expression_> LeftHandSideExpression
 %type <expression_> LeftHandSideExpressionNoBF
-%type <expression_> LeftHandSideExpressionNoWC
 //%type <statement_> LetStatement
 %type <literal_> Literal
 %type <literal_> LiteralNoRE
@@ -406,36 +403,26 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <expression_> LogicalANDExpression
 %type <expression_> LogicalANDExpressionNoBF
 %type <expression_> LogicalANDExpressionNoIn
-%type <expression_> LogicalANDExpressionNoWC
 %type <expression_> LogicalORExpression
 %type <expression_> LogicalORExpressionNoBF
 %type <expression_> LogicalORExpressionNoIn
-%type <expression_> LogicalORExpressionNoWC
 %type <member_> MemberAccess
 %type <expression_> MemberExpression
 %type <expression_> MemberExpression_
 %type <expression_> MemberExpressionNoBF
-%type <expression_> MemberExpressionNoWC
 %type <expression_> MultiplicativeExpression
 %type <expression_> MultiplicativeExpressionNoBF
-%type <expression_> MultiplicativeExpressionNoWC
 %type <expression_> NewExpression
 %type <expression_> NewExpression_
 %type <expression_> NewExpressionNoBF
-%type <expression_> NewExpressionNoWC
 %type <null_> NullLiteral
 %type <literal_> ObjectLiteral
 %type <expression_> PostfixExpression
 %type <expression_> PostfixExpressionNoBF
-%type <expression_> PostfixExpressionNoWC
 %type <expression_> PrimaryExpression
 %type <expression_> PrimaryExpressionNo
 %type <expression_> PrimaryExpressionNoBF
-%type <expression_> PrimaryExpressionNoWC
-%type <expression_> PrimaryExpressionNoWC_
-@begin E4X
-%type <expression_> PrimaryExpressionWC
-@end
+%type <expression_> PrimaryExpressionNoRE
 %type <expression_> PrimaryExpressionBF
 %type <statement_> Program
 %type <propertyName_> PropertyName
@@ -447,12 +434,10 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <infix_> RelationalExpression_
 %type <expression_> RelationalExpressionNoBF
 %type <expression_> RelationalExpressionNoIn
-%type <expression_> RelationalExpressionNoWC
 %type <infix_> RelationalExpressionNoIn_
 %type <statement_> ReturnStatement
 %type <expression_> ShiftExpression
 %type <expression_> ShiftExpressionNoBF
-%type <expression_> ShiftExpressionNoWC
 %type <statement_> SourceElement
 %type <statement_> SourceElement_
 %type <statement_> SourceElements
@@ -463,11 +448,9 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <statement_> SwitchStatement
 %type <statement_> ThrowStatement
 %type <statement_> TryStatement
-%type <expression_> UnaryAssigneeExpression
 %type <expression_> UnaryExpression
 %type <expression_> UnaryExpression_
 %type <expression_> UnaryExpressionNoBF
-%type <expression_> UnaryExpressionNoWC
 %type <declaration_> VariableDeclaration
 %type <declaration_> VariableDeclarationNoIn
 %type <declarations_> VariableDeclarationList
@@ -478,6 +461,17 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <statement_> WhileStatement
 %type <statement_> WithStatement
 
+@begin C
+%type <expression_> AssigneeExpressionNoRE
+%type <expression_> CallExpressionNoRE
+%type <expression_> LeftHandSideExpressionNoRE
+%type <expression_> MemberExpressionNoRE
+%type <expression_> NewExpressionNoRE
+%type <expression_> PostfixExpressionNoRE
+%type <expression_> UnaryAssigneeExpression
+%type <expression_> UnaryExpressionNoRE
+@end
+
 @begin ObjectiveC
 %type <statement_> CategoryStatement
 %type <expression_> ClassExpression
@@ -488,6 +482,9 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <message_> ClassMessageDeclarationListOpt
 %type <className_> ClassName
 %type <className_> ClassNameOpt
+%type <protocol_> ClassProtocolListOpt
+%type <protocol_> ClassProtocols
+%type <protocol_> ClassProtocolsOpt
 %type <expression_> MessageExpression
 %type <messageParameter_> MessageParameter
 %type <messageParameter_> MessageParameters
@@ -527,8 +524,6 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <expression_> XMLInitialiser
 @end
 
-%token WC
-
 %nonassoc Identifier_ "abstract" "boolean" "break" "byte" "case" "catch" "char" "class" "const" "continue" "debugger" "default" "delete" "do" "double" "each" "enum" "export" "extends" "false" "final" "finally" "float" /*"for"*/ "function" "goto" "implements" "import" /*"in"*/ /*"instanceof"*/ "int" "interface" "let" "long" "namespace" "native" "new" "null" "package" "private" "protected" "public" "return" "short" "super" "static" "switch" "synchronized" "this" "throw" "throws" "transient" "true" "try" "typeof" "var" "void" "volatile" "while" "with" "xml" "yield"
 
 %nonassoc "if"
@@ -703,28 +698,18 @@ BooleanLiteral
 
 /* 11.1 Primary Expressions {{{ */
 PrimaryExpression
-    : PrimaryExpressionNoWC { $$ = $1; }
-@begin E4X
-    | LexSetRegExp PrimaryExpressionWC { $$ = $2; }
-@end
+    : LexSetRegExp PrimaryExpressionNoRE { $$ = $2; }
     ;
 
 PrimaryExpressionNoBF
     : PrimaryExpressionNo { $$ = $1; }
-@begin E4X
-    | PrimaryExpressionWC { $$ = $1; }
-@end
     ;
 
-PrimaryExpressionNoWC_
+PrimaryExpressionNoRE
     : PrimaryExpressionBF { $$ = $1; }
     | PrimaryExpressionNo { $$ = $1; }
     ;
 
-PrimaryExpressionNoWC
-    : LexSetRegExp PrimaryExpressionNoWC_ { $$ = $2; }
-    ;
-
 PrimaryExpressionNo
     : "this" { $$ = $1; }
     | Identifier { $$ = new(driver.pool_) CYVariable($1); }
@@ -803,7 +788,7 @@ MemberAccess
 
 MemberExpression
     : PrimaryExpression { $$ = $1; }
-    | FunctionExpression { $$ = $1; }
+    | LexSetRegExp FunctionExpression { $$ = $2; }
     | MemberExpression MemberAccess { $2->SetLeft($1); $$ = $2; }
     | LexSetRegExp MemberExpression_ { $$ = $2; }
     ;
@@ -814,12 +799,14 @@ MemberExpressionNoBF
     | MemberExpression_ { $$ = $1; }
     ;
 
-MemberExpressionNoWC
-    : PrimaryExpression { $$ = $1; }
+@begin C
+MemberExpressionNoRE
+    : PrimaryExpressionNoRE { $$ = $1; }
     | FunctionExpression { $$ = $1; }
-    | MemberExpression MemberAccess { $2->SetLeft($1); $$ = $2; }
-    | LexSetRegExp MemberExpression_ { $$ = $2; }
+    | MemberExpressionNoRE MemberAccess { $2->SetLeft($1); $$ = $2; }
+    | MemberExpression_ { $$ = $1; }
     ;
+@end
 
 NewExpression_
     : "new" NewExpression { $$ = new(driver.pool_) CYNew($2, NULL); }
@@ -835,13 +822,15 @@ NewExpressionNoBF
     | NewExpression_ { $$ = $1; }
     ;
 
-NewExpressionNoWC
-    : MemberExpressionNoWC { $$ = $1; }
-    | LexSetRegExp NewExpression_ { $$ = $2; }
+@begin C
+NewExpressionNoRE
+    : MemberExpressionNoRE { $$ = $1; }
+    | NewExpression_ { $$ = $1; }
     ;
+@end
 
 CallExpression
-    : PrimaryExpressionNoWC Arguments { $$ = new(driver.pool_) CYCall($1, $2); }
+    : MemberExpression Arguments { $$ = new(driver.pool_) CYCall($1, $2); }
     | CallExpression Arguments { $$ = new(driver.pool_) CYCall($1, $2); }
     | CallExpression MemberAccess { $2->SetLeft($1); $$ = $2; }
     ;
@@ -852,6 +841,14 @@ CallExpressionNoBF
     | CallExpressionNoBF MemberAccess { $2->SetLeft($1); $$ = $2; }
     ;
 
+@begin C
+CallExpressionNoRE
+    : MemberExpressionNoRE Arguments { $$ = new(driver.pool_) CYCall($1, $2); }
+    | CallExpressionNoRE Arguments { $$ = new(driver.pool_) CYCall($1, $2); }
+    | CallExpressionNoRE MemberAccess { $2->SetLeft($1); $$ = $2; }
+    ;
+@end
+
 ArgumentList_
     : "," ArgumentList { $$ = $2; }
     | { $$ = NULL; }
@@ -880,10 +877,12 @@ LeftHandSideExpressionNoBF
     | CallExpressionNoBF { $$ = $1; }
     ;
 
-LeftHandSideExpressionNoWC
-    : NewExpressionNoWC { $$ = $1; }
-    | CallExpression { $$ = $1; }
+@begin C
+LeftHandSideExpressionNoRE
+    : NewExpressionNoRE { $$ = $1; }
+    | CallExpressionNoRE { $$ = $1; }
     ;
+@end
 /* }}} */
 /* 11.3 Postfix Expressions {{{ */
 PostfixExpression
@@ -898,11 +897,13 @@ PostfixExpressionNoBF
     | LeftHandSideExpressionNoBF "--" { $$ = new(driver.pool_) CYPostDecrement($1); }
     ;
 
-PostfixExpressionNoWC
-    : AssigneeExpressionNoWC { $$ = $1; }
-    | LeftHandSideExpression "++" { $$ = new(driver.pool_) CYPostIncrement($1); }
-    | LeftHandSideExpression "--" { $$ = new(driver.pool_) CYPostDecrement($1); }
+@begin C
+PostfixExpressionNoRE
+    : AssigneeExpressionNoRE { $$ = $1; }
+    | LeftHandSideExpressionNoRE "++" { $$ = new(driver.pool_) CYPostIncrement($1); }
+    | LeftHandSideExpressionNoRE "--" { $$ = new(driver.pool_) CYPostDecrement($1); }
     ;
+@end
 /* }}} */
 /* 11.4 Unary Operators {{{ */
 UnaryExpression_
@@ -929,10 +930,12 @@ UnaryExpressionNoBF
     | UnaryExpression_ { $$ = $1; }
     ;
 
-UnaryExpressionNoWC
-    : PostfixExpressionNoWC { $$ = $1; }
-    | LexSetRegExp UnaryExpression_ { $$ = $2; }
+@begin C
+UnaryExpressionNoRE
+    : PostfixExpressionNoRE { $$ = $1; }
+    | UnaryExpression_ { $$ = $1; }
     ;
+@end
 /* }}} */
 /* 11.5 Multiplicative Operators {{{ */
 MultiplicativeExpression
@@ -948,13 +951,6 @@ MultiplicativeExpressionNoBF
     | MultiplicativeExpressionNoBF "/" UnaryExpression { $$ = new(driver.pool_) CYDivide($1, $3); }
     | MultiplicativeExpressionNoBF "%" UnaryExpression { $$ = new(driver.pool_) CYModulus($1, $3); }
     ;
-
-MultiplicativeExpressionNoWC
-    : UnaryExpressionNoWC { $$ = $1; }
-    | MultiplicativeExpression "*" UnaryExpression { $$ = new(driver.pool_) CYMultiply($1, $3); }
-    | MultiplicativeExpression "/" UnaryExpression { $$ = new(driver.pool_) CYDivide($1, $3); }
-    | MultiplicativeExpression "%" UnaryExpression { $$ = new(driver.pool_) CYModulus($1, $3); }
-    ;
 /* }}} */
 /* 11.6 Additive Operators {{{ */
 AdditiveExpression
@@ -968,12 +964,6 @@ AdditiveExpressionNoBF
     | AdditiveExpressionNoBF "+" MultiplicativeExpression { $$ = new(driver.pool_) CYAdd($1, $3); }
     | AdditiveExpressionNoBF "-" MultiplicativeExpression { $$ = new(driver.pool_) CYSubtract($1, $3); }
     ;
-
-AdditiveExpressionNoWC
-    : MultiplicativeExpressionNoWC { $$ = $1; }
-    | AdditiveExpression "+" MultiplicativeExpression { $$ = new(driver.pool_) CYAdd($1, $3); }
-    | AdditiveExpression "-" MultiplicativeExpression { $$ = new(driver.pool_) CYSubtract($1, $3); }
-    ;
 /* }}} */
 /* 11.7 Bitwise Shift Operators {{{ */
 ShiftExpression
@@ -989,13 +979,6 @@ ShiftExpressionNoBF
     | ShiftExpressionNoBF ">>" AdditiveExpression { $$ = new(driver.pool_) CYShiftRightSigned($1, $3); }
     | ShiftExpressionNoBF ">>>" AdditiveExpression { $$ = new(driver.pool_) CYShiftRightUnsigned($1, $3); }
     ;
-
-ShiftExpressionNoWC
-    : AdditiveExpressionNoWC { $$ = $1; }
-    | ShiftExpression "<<" AdditiveExpression { $$ = new(driver.pool_) CYShiftLeft($1, $3); }
-    | ShiftExpression ">>" AdditiveExpression { $$ = new(driver.pool_) CYShiftRightSigned($1, $3); }
-    | ShiftExpression ">>>" AdditiveExpression { $$ = new(driver.pool_) CYShiftRightUnsigned($1, $3); }
-    ;
 /* }}} */
 /* 11.8 Relational Operators {{{ */
 RelationalExpressionNoIn_
@@ -1025,11 +1008,6 @@ RelationalExpressionNoBF
     : ShiftExpressionNoBF { $$ = $1; }
     | RelationalExpressionNoBF RelationalExpression_ { $2->SetLeft($1); $$ = $2; }
     ;
-
-RelationalExpressionNoWC
-    : ShiftExpressionNoWC { $$ = $1; }
-    | RelationalExpression RelationalExpression_ { $2->SetLeft($1); $$ = $2; }
-    ;
 /* }}} */
 /* 11.9 Equality Operators {{{ */
 EqualityExpression
@@ -1055,14 +1033,6 @@ EqualityExpressionNoBF
     | EqualityExpressionNoBF "===" RelationalExpression { $$ = new(driver.pool_) CYIdentical($1, $3); }
     | EqualityExpressionNoBF "!==" RelationalExpression { $$ = new(driver.pool_) CYNotIdentical($1, $3); }
     ;
-
-EqualityExpressionNoWC
-    : RelationalExpressionNoWC { $$ = $1; }
-    | EqualityExpression "==" RelationalExpression { $$ = new(driver.pool_) CYEqual($1, $3); }
-    | EqualityExpression "!=" RelationalExpression { $$ = new(driver.pool_) CYNotEqual($1, $3); }
-    | EqualityExpression "===" RelationalExpression { $$ = new(driver.pool_) CYIdentical($1, $3); }
-    | EqualityExpression "!==" RelationalExpression { $$ = new(driver.pool_) CYNotIdentical($1, $3); }
-    ;
 /* }}} */
 /* 11.10 Binary Bitwise Operators {{{ */
 BitwiseANDExpression
@@ -1080,11 +1050,6 @@ BitwiseANDExpressionNoBF
     | BitwiseANDExpressionNoBF "&" EqualityExpression { $$ = new(driver.pool_) CYBitwiseAnd($1, $3); }
     ;
 
-BitwiseANDExpressionNoWC
-    : EqualityExpressionNoWC { $$ = $1; }
-    | BitwiseANDExpression "&" EqualityExpression { $$ = new(driver.pool_) CYBitwiseAnd($1, $3); }
-    ;
-
 BitwiseXORExpression
     : BitwiseANDExpression { $$ = $1; }
     | BitwiseXORExpression "^" BitwiseANDExpression { $$ = new(driver.pool_) CYBitwiseXOr($1, $3); }
@@ -1100,11 +1065,6 @@ BitwiseXORExpressionNoBF
     | BitwiseXORExpressionNoBF "^" BitwiseANDExpression { $$ = new(driver.pool_) CYBitwiseXOr($1, $3); }
     ;
 
-BitwiseXORExpressionNoWC
-    : BitwiseANDExpressionNoWC { $$ = $1; }
-    | BitwiseXORExpression "^" BitwiseANDExpression { $$ = new(driver.pool_) CYBitwiseXOr($1, $3); }
-    ;
-
 BitwiseORExpression
     : BitwiseXORExpression { $$ = $1; }
     | BitwiseORExpression "|" BitwiseXORExpression { $$ = new(driver.pool_) CYBitwiseOr($1, $3); }
@@ -1119,11 +1079,6 @@ BitwiseORExpressionNoBF
     : BitwiseXORExpressionNoBF { $$ = $1; }
     | BitwiseORExpressionNoBF "|" BitwiseXORExpression { $$ = new(driver.pool_) CYBitwiseOr($1, $3); }
     ;
-
-BitwiseORExpressionNoWC
-    : BitwiseXORExpressionNoWC { $$ = $1; }
-    | BitwiseORExpression "|" BitwiseXORExpression { $$ = new(driver.pool_) CYBitwiseOr($1, $3); }
-    ;
 /* }}} */
 /* 11.11 Binary Logical Operators {{{ */
 LogicalANDExpression
@@ -1141,11 +1096,6 @@ LogicalANDExpressionNoBF
     | LogicalANDExpressionNoBF "&&" BitwiseORExpression { $$ = new(driver.pool_) CYLogicalAnd($1, $3); }
     ;
 
-LogicalANDExpressionNoWC
-    : BitwiseORExpressionNoWC { $$ = $1; }
-    | LogicalANDExpression "&&" BitwiseORExpression { $$ = new(driver.pool_) CYLogicalAnd($1, $3); }
-    ;
-
 LogicalORExpression
     : LogicalANDExpression { $$ = $1; }
     | LogicalORExpression "||" LogicalANDExpression { $$ = new(driver.pool_) CYLogicalOr($1, $3); }
@@ -1160,11 +1110,6 @@ LogicalORExpressionNoBF
     : LogicalANDExpressionNoBF { $$ = $1; }
     | LogicalORExpressionNoBF "||" LogicalANDExpression { $$ = new(driver.pool_) CYLogicalOr($1, $3); }
     ;
-
-LogicalORExpressionNoWC
-    : LogicalANDExpressionNoWC { $$ = $1; }
-    | LogicalORExpression "||" LogicalANDExpression { $$ = new(driver.pool_) CYLogicalOr($1, $3); }
-    ;
 /* }}} */
 /* 11.12 Conditional Operator ( ? : ) {{{ */
 ConditionalExpression
@@ -1181,11 +1126,6 @@ ConditionalExpressionNoBF
     : LogicalORExpressionNoBF { $$ = $1; }
     | LogicalORExpressionNoBF "?" AssignmentExpression ":" AssignmentExpression { $$ = new(driver.pool_) CYCondition($1, $3, $5); }
     ;
-
-ConditionalExpressionNoWC
-    : LogicalORExpressionNoWC { $$ = $1; }
-    | LogicalORExpression "?" AssignmentExpression ":" AssignmentExpression { $$ = new(driver.pool_) CYCondition($1, $3, $5); }
-    ;
 /* }}} */
 /* 11.13 Assignment Operators {{{ */
 AssignmentExpression_
@@ -1205,18 +1145,24 @@ AssignmentExpression_
 
 AssigneeExpression
     : LeftHandSideExpression { $$ = $1; }
+@begin C
     | LexSetRegExp UnaryAssigneeExpression { $$ = $2; }
+@end
     ;
 
 AssigneeExpressionNoBF
     : LeftHandSideExpressionNoBF { $$ = $1; }
+@begin C
     | UnaryAssigneeExpression { $$ = $1; }
+@end
     ;
 
-AssigneeExpressionNoWC
-    : LeftHandSideExpressionNoWC { $$ = $1; }
-    | LexSetRegExp UnaryAssigneeExpression { $$ = $2; }
+@begin C
+AssigneeExpressionNoRE
+    : LeftHandSideExpressionNoRE { $$ = $1; }
+    | UnaryAssigneeExpression { $$ = $1; }
     ;
+@end
 
 AssignmentExpression
     : ConditionalExpression { $$ = $1; }
@@ -1243,11 +1189,6 @@ AssignmentExpressionNoBF
     : ConditionalExpressionNoBF { $$ = $1; }
     | AssigneeExpressionNoBF AssignmentExpression_ { $2->SetLeft($1); $$ = $2; }
     ;
-
-AssignmentExpressionNoWC
-    : ConditionalExpressionNoWC { $$ = $1; }
-    | AssigneeExpression AssignmentExpression_ { $2->SetLeft($1); $$ = $2; }
-    ;
 /* }}} */
 /* 11.14 Comma Operator {{{ */
 Expression_
@@ -1507,12 +1448,8 @@ FunctionDeclaration
     : "function" Identifier "(" FormalParameterList ")" "{" FunctionBody "}" { $$ = new(driver.pool_) CYFunctionStatement($2, $4, $7); }
     ;
 
-FunctionExpression_
-    : "function" IdentifierOpt "(" FormalParameterList ")" "{" FunctionBody "}" { $$ = new(driver.pool_) CYFunctionExpression($2, $4, $7); }
-    ;
-
 FunctionExpression
-    : LexSetRegExp FunctionExpression_ { $$ = $2; }
+    : "function" IdentifierOpt "(" FormalParameterList ")" "{" FunctionBody "}" { $$ = new(driver.pool_) CYFunctionExpression($2, $4, $7); }
     ;
 
 FormalParameterList_
@@ -1608,12 +1545,27 @@ ClassNameOpt
     | { $$ = NULL; }
     ;
 
+// XXX: this should be AssignmentExpressionNoRight
+ClassProtocols
+    : ShiftExpression ClassProtocolsOpt { $$ = new(driver.pool_) CYProtocol($1, $2); }
+    ;
+
+ClassProtocolsOpt
+    : "," ClassProtocols { $$ = $2; }
+    | { $$ = NULL; }
+    ;
+
+ClassProtocolListOpt
+    : "<" ClassProtocols ">" { $$ = $2; }
+    | { $$ = NULL; }
+    ;
+
 ClassExpression
-    : "@class" ClassNameOpt ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYClassExpression($2, $3, $4, $5); }
+    : "@class" ClassNameOpt ClassSuperOpt ClassProtocolListOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYClassExpression($2, $3, $4, $5, $6); }
     ;
 
 ClassStatement
-    : "@class" ClassName ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYClassStatement($2, $3, $4, $5); }
+    : "@class" ClassName ClassSuperOpt ClassProtocolListOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYClassStatement($2, $3, $4, $5, $6); }
     ;
 
 CategoryStatement
@@ -1650,7 +1602,7 @@ SelectorList
     ;
 
 MessageExpression
-    : "[" AssignmentExpressionNoWC SelectorList "]" { $$ = new(driver.pool_) CYSendDirect($2, $3); }
+    : "[" AssignmentExpression SelectorList "]" { $$ = new(driver.pool_) CYSendDirect($2, $3); }
     | "[" LexSetRegExp "super" SelectorList "]" { $$ = new(driver.pool_) CYSendSuper($4); }
     ;
 
@@ -1678,7 +1630,7 @@ PrimaryExpressionNo
 @begin C
 /* Cycript (C): Pointer Indirection/Addressing {{{ */
 UnaryAssigneeExpression
-    : "*" UnaryExpression { $$ = new(driver.pool_) CYIndirect($2); }
+    : "*" UnaryExpressionNoRE { $$ = new(driver.pool_) CYIndirect($2); }
     ;
 
 UnaryExpression_
@@ -1692,6 +1644,12 @@ MemberAccess
 /* }}} */
 @end
 
+/* YUI: Documentation Comments {{{ */
+Statement_
+    : Comment { $$ = $1; }
+    ;
+/* }}} */
+
 @begin E4X
 /* Lexer State {{{ */
 LexPushRegExp
@@ -1738,7 +1696,7 @@ XMLMarkup
     ;
 /* }}} */
 /* 11.1 Primary Expressions {{{ */
-PrimaryExpressionWC
+PrimaryExpressionNo
     : PropertyIdentifier { $$ = new(driver.pool_) CYPropertyVariable($1); }
     | XMLInitialiser { $$ = $1; }
     | XMLListInitialiser { $$ = $1; }