X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/cac61857bcc00ddc1e354756e11b24e93b8edbf3..1e7ce5572cfc83d260cbe73d66814f54e5760c37:/Cycript.y diff --git a/Cycript.y b/Cycript.y index 6a304b3..7fdc172 100644 --- a/Cycript.y +++ b/Cycript.y @@ -52,12 +52,13 @@ typedef struct { union { bool bool_; + CYDriver::Condition condition_; + CYArgument *argument_; CYAssignment *assignment_; CYBoolean *boolean_; CYClause *clause_; CYCatch *catch_; - CYClass *class_; CYClassName *className_; CYComprehension *comprehension_; CYCompound *compound_; @@ -67,6 +68,7 @@ typedef struct { CYExpression *expression_; CYFalse *false_; CYField *field_; + CYFinally *finally_; CYForInitialiser *for_; CYForInInitialiser *forin_; CYFunctionParameter *functionParameter_; @@ -78,10 +80,10 @@ typedef struct { CYMessageParameter *messageParameter_; CYNull *null_; CYNumber *number_; + CYProgram *program_; CYProperty *property_; CYPropertyName *propertyName_; CYSelectorPart *selector_; - CYSource *source_; CYStatement *statement_; CYString *string_; CYThis *this_; @@ -107,16 +109,16 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %defines -%glr-parser -%expect 1 - -%debug +//%glr-parser +//%expect 1 %error-verbose %parse-param { CYDriver &driver } %lex-param { void *scanner } +%token At "@" + %token Ampersand "&" %token AmpersandAmpersand "&&" %token AmpersandEqual "&=" @@ -178,6 +180,11 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %token AtSelector "@selector" %token AtEnd "@end" +%token False "false" +%token Null "null" +%token True "true" + +// ES3/ES5/WIE/JSC Reserved %token Break "break" %token Case "case" %token Catch "catch" @@ -186,7 +193,6 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %token Delete "delete" %token Do "do" %token Else "else" -%token False "false" %token Finally "finally" %token For "for" %token Function "function" @@ -194,12 +200,10 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %token In "in" %token InstanceOf "instanceof" %token New "new" -%token Null "null" %token Return "return" %token Switch "switch" %token This "this" %token Throw "throw" -%token True "true" %token Try "try" %token TypeOf "typeof" %token Var "var" @@ -207,44 +211,58 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %token While "while" %token With "with" -%token Abstract "abstract" -%token Boolean "boolean" -%token Byte "byte" -%token Char "char" -%token Class "class" -%token Const "const" +// ES3/IE6 Future, ES5/JSC Reserved %token Debugger "debugger" -%token Double "double" + +// ES3/ES5/IE6 Future, JSC Reserved +%token Const "const" + +// ES3/ES5/IE6/JSC Future +%token Class "class" %token Enum "enum" %token Export "export" %token Extends "extends" -%token Final "final" -%token Float "float" -%token Goto "goto" -%token Implements "implements" %token Import "import" -%token Int "int" -%token Interface "interface" -%token Long "long" -%token Native "native" -%token Package "package" -%token Private "private" -%token Protected "protected" -%token Public "public" -%token Short "short" -%token Static "static" %token Super "super" -%token Synchronized "synchronized" -%token Throws "throws" -%token Transient "transient" -%token Volatile "volatile" -%token Each "each" +// ES3 Future, ES5 Strict Future +%token Implements "implements" +%token Interface "interface" +%token Package "package" +%token Private "private" +%token Protected "protected" +%token Public "public" +%token Static "static" + +// ES3 Future +%token Abstract "abstract" +%token Boolean "boolean" +%token Byte "byte" +%token Char "char" +%token Double "double" +%token Final "final" +%token Float "float" +%token Goto "goto" +%token Int "int" +%token Long "long" +%token Native "native" +%token Short "short" +%token Synchronized "synchronized" +%token Throws "throws" +%token Transient "transient" +%token Volatile "volatile" + +// ES5 Strict %token Let "let" +%token Yield "yield" + +// Woah?! +%token Each "each" %token Identifier_ %token NumericLiteral %token StringLiteral +%token RegularExpressionLiteral %type AdditiveExpression %type AdditiveExpressionNoBF @@ -280,11 +298,12 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type CaseClausesOpt %type CatchOpt %type CategoryStatement -%type ClassDefinition +%type ClassExpression %type ClassMessageDeclaration %type ClassMessageDeclarationListOpt %type ClassName %type ClassNameOpt +%type ClassStatement %type ClassSuperOpt %type ClassFieldList %type ComprehensionList @@ -312,7 +331,7 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type ExpressionNoIn_ %type ExpressionNoInOpt %type ExpressionStatement -%type FinallyOpt +%type FinallyOpt %type ForComprehension %type ForStatement %type ForStatementInitialiser @@ -320,8 +339,8 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type ForInStatementInitialiser %type FormalParameterList %type FormalParameterList_ -%type FunctionBody -%type FunctionDeclaration +%type FunctionBody +%type FunctionDeclaration %type FunctionExpression %type Identifier %type IdentifierOpt @@ -335,7 +354,7 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type LabelledStatement %type LeftHandSideExpression %type LeftHandSideExpressionNoBF -%type LetStatement +//%type LetStatement %type Literal %type LogicalANDExpression %type LogicalANDExpressionNoBF @@ -364,11 +383,13 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type PrimaryExpression %type PrimaryExpression_ %type PrimaryExpressionNoBF -%type Program +%type Program %type PropertyName %type PropertyNameAndValueList %type PropertyNameAndValueList_ %type PropertyNameAndValueListOpt +%type RegularExpressionLiteral_ +%type RegularExpressionToken %type RelationalExpression %type RelationalExpression_ %type RelationalExpressionNoBF @@ -380,9 +401,10 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type SelectorExpressionOpt %type ShiftExpression %type ShiftExpressionNoBF -%type SourceElement -%type SourceElements +%type SourceElement +%type SourceElements %type Statement +%type Statement_ %type StatementList %type StatementListOpt %type SwitchStatement @@ -430,16 +452,23 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %% -TerminatorOpt +StrictSemi + : { driver.Warning(yylloc, "warning, automatic semi-colon insertion required"); } + ; + +Terminator_ : ";" - | "\n" - | error { yyerrok; driver.errors_.pop_back(); } + | "\n" StrictSemi + ; + +TerminatorOpt + : Terminator_ + | error { yyerrok; driver.errors_.pop_back(); } StrictSemi ; Terminator - : ";" - | "\n" - | error { if (yychar != 0 && yychar != cy::parser::token::CloseBrace && !yylval.newline_) YYABORT; else { yyerrok; driver.errors_.pop_back(); } } + : Terminator_ + | error { if (yychar != 0 && yychar != cy::parser::token::CloseBrace && !yylval.newline_) YYABORT; else { yyerrok; driver.errors_.pop_back(); } } StrictSemi ; /*CommaOpt @@ -459,13 +488,9 @@ WordOpt Word : Identifier { $$ = $1; } - | "abstract" { $$ = $1; } - | "boolean" { $$ = $1; } | "break" NewLineOpt { $$ = $1; } - | "byte" { $$ = $1; } | "case" { $$ = $1; } | "catch" { $$ = $1; } - | "char" { $$ = $1; } | "class" { $$ = $1; } | "const" { $$ = $1; } | "continue" NewLineOpt { $$ = $1; } @@ -473,57 +498,66 @@ Word | "default" { $$ = $1; } | "delete" { $$ = $1; } | "do" { $$ = $1; } - | "double" { $$ = $1; } | "else" { $$ = $1; } | "enum" { $$ = $1; } | "export" { $$ = $1; } | "extends" { $$ = $1; } | "false" { $$ = $1; } - | "final" { $$ = $1; } | "finally" { $$ = $1; } - | "float" { $$ = $1; } | "for" { $$ = $1; } | "function" { $$ = $1; } - | "goto" { $$ = $1; } | "if" { $$ = $1; } - | "implements" { $$ = $1; } | "import" { $$ = $1; } /* XXX: | "in" { $$ = $1; } */ /* XXX: | "instanceof" { $$ = $1; } */ - | "int" { $$ = $1; } - | "interface" { $$ = $1; } - | "long" { $$ = $1; } - | "native" { $$ = $1; } | "new" { $$ = $1; } | "null" { $$ = $1; } - | "package" { $$ = $1; } - | "private" { $$ = $1; } - | "protected" { $$ = $1; } - | "public" { $$ = $1; } | "return" NewLineOpt { $$ = $1; } - | "short" { $$ = $1; } - | "static" { $$ = $1; } | "super" { $$ = $1; } | "switch" { $$ = $1; } - | "synchronized" { $$ = $1; } | "this" { $$ = $1; } | "throw" NewLineOpt { $$ = $1; } - | "throws" { $$ = $1; } - | "transient" { $$ = $1; } | "true" { $$ = $1; } | "try" { $$ = $1; } | "typeof" { $$ = $1; } | "var" { $$ = $1; } | "void" { $$ = $1; } - | "volatile" { $$ = $1; } | "while" { $$ = $1; } | "with" { $$ = $1; } ; Identifier : Identifier_ { $$ = $1; } - | "each" { $$ = $1; } + + | "implements" { $$ = $1; } + | "interface" { $$ = $1; } + | "package" { $$ = $1; } + | "private" { $$ = $1; } + | "protected" { $$ = $1; } + | "public" { $$ = $1; } + | "static" { $$ = $1; } + + | "abstract" { $$ = $1; } + | "boolean" { $$ = $1; } + | "byte" { $$ = $1; } + | "char" { $$ = $1; } + | "double" { $$ = $1; } + | "final" { $$ = $1; } + | "float" { $$ = $1; } + | "goto" { $$ = $1; } + | "int" { $$ = $1; } + | "long" { $$ = $1; } + | "native" { $$ = $1; } + | "short" { $$ = $1; } + | "synchronized" { $$ = $1; } + | "throws" { $$ = $1; } + | "transient" { $$ = $1; } + | "volatile" { $$ = $1; } + | "let" { $$ = $1; } + | "yield" { $$ = $1; } + + | "each" { $$ = $1; } ; IdentifierOpt @@ -531,11 +565,21 @@ IdentifierOpt | { $$ = NULL; } ; +RegularExpressionToken + : "/" { $$ = CYDriver::RegExStart; } + | "/=" { $$ = CYDriver::RegExRest; } + ; + +RegularExpressionLiteral_ + : RegularExpressionToken { driver.SetCondition($1); } RegularExpressionLiteral { $$ = $3; } + ; + Literal : NullLiteral { $$ = $1; } | BooleanLiteral { $$ = $1; } | NumericLiteral { $$ = $1; } | StringLiteral { $$ = $1; } + | RegularExpressionLiteral_ { $$ = $1; } ; NullLiteral @@ -615,6 +659,7 @@ PropertyName ; /* }}} */ +/* 11.2 Left-Hand-Side Expressions {{{ */ MemberExpression_ : "new" MemberExpression Arguments { $$ = new(driver.pool_) CYNew($2, $3); } ; @@ -690,7 +735,8 @@ LeftHandSideExpressionNoBF : NewExpressionNoBF { $$ = $1; } | CallExpressionNoBF { $$ = $1; } ; - +/* }}} */ +/* 11.3 Postfix Expressions {{{ */ PostfixExpression : AssigneeExpression { $$ = $1; } | LeftHandSideExpression "++" { $$ = new(driver.pool_) CYPostIncrement($1); } @@ -702,7 +748,8 @@ PostfixExpressionNoBF | LeftHandSideExpressionNoBF "++" { $$ = new(driver.pool_) CYPostIncrement($1); } | LeftHandSideExpressionNoBF "--" { $$ = new(driver.pool_) CYPostDecrement($1); } ; - +/* }}} */ +/* 11.4 Unary Operators {{{ */ UnaryExpression_ : "delete" UnaryExpression { $$ = new(driver.pool_) CYDelete($2); } | "void" UnaryExpression { $$ = new(driver.pool_) CYVoid($2); } @@ -711,7 +758,7 @@ UnaryExpression_ | "\n++" UnaryExpression { $$ = new(driver.pool_) CYPreIncrement($2); } | "--" UnaryExpression { $$ = new(driver.pool_) CYPreDecrement($2); } | "\n--" UnaryExpression { $$ = new(driver.pool_) CYPreDecrement($2); } - | "+" UnaryExpression { $$ = $2; } + | "+" UnaryExpression { $$ = new(driver.pool_) CYAffirm($2); } | "-" UnaryExpression { $$ = new(driver.pool_) CYNegate($2); } | "~" UnaryExpression { $$ = new(driver.pool_) CYBitwiseNot($2); } | "!" UnaryExpression { $$ = new(driver.pool_) CYLogicalNot($2); } @@ -726,7 +773,8 @@ UnaryExpressionNoBF : PostfixExpressionNoBF { $$ = $1; } | UnaryExpression_ { $$ = $1; } ; - +/* }}} */ +/* 11.5 Multiplicative Operators {{{ */ MultiplicativeExpression : UnaryExpression { $$ = $1; } | MultiplicativeExpression "*" UnaryExpression { $$ = new(driver.pool_) CYMultiply($1, $3); } @@ -740,7 +788,8 @@ MultiplicativeExpressionNoBF | MultiplicativeExpressionNoBF "/" UnaryExpression { $$ = new(driver.pool_) CYDivide($1, $3); } | MultiplicativeExpressionNoBF "%" UnaryExpression { $$ = new(driver.pool_) CYModulus($1, $3); } ; - +/* }}} */ +/* 11.6 Additive Operators {{{ */ AdditiveExpression : MultiplicativeExpression { $$ = $1; } | AdditiveExpression "+" MultiplicativeExpression { $$ = new(driver.pool_) CYAdd($1, $3); } @@ -752,7 +801,8 @@ AdditiveExpressionNoBF | AdditiveExpressionNoBF "+" MultiplicativeExpression { $$ = new(driver.pool_) CYAdd($1, $3); } | AdditiveExpressionNoBF "-" MultiplicativeExpression { $$ = new(driver.pool_) CYSubtract($1, $3); } ; - +/* }}} */ +/* 11.7 Bitwise Shift Operators {{{ */ ShiftExpression : AdditiveExpression { $$ = $1; } | ShiftExpression "<<" AdditiveExpression { $$ = new(driver.pool_) CYShiftLeft($1, $3); } @@ -766,7 +816,8 @@ ShiftExpressionNoBF | ShiftExpressionNoBF ">>" AdditiveExpression { $$ = new(driver.pool_) CYShiftRightSigned($1, $3); } | ShiftExpressionNoBF ">>>" AdditiveExpression { $$ = new(driver.pool_) CYShiftRightUnsigned($1, $3); } ; - +/* }}} */ +/* 11.8 Relational Operators {{{ */ RelationalExpressionNoIn_ : "<" ShiftExpression { $$ = new(driver.pool_) CYLess(NULL, $2); } | ">" ShiftExpression { $$ = new(driver.pool_) CYGreater(NULL, $2); } @@ -794,7 +845,8 @@ RelationalExpressionNoBF : ShiftExpressionNoBF { $$ = $1; } | RelationalExpressionNoBF RelationalExpression_ { $2->SetLeft($1); $$ = $2; } ; - +/* }}} */ +/* 11.9 Equality Operators {{{ */ EqualityExpression : RelationalExpression { $$ = $1; } | EqualityExpression "==" RelationalExpression { $$ = new(driver.pool_) CYEqual($1, $3); } @@ -818,7 +870,8 @@ EqualityExpressionNoBF | EqualityExpressionNoBF "===" RelationalExpression { $$ = new(driver.pool_) CYIdentical($1, $3); } | EqualityExpressionNoBF "!==" RelationalExpression { $$ = new(driver.pool_) CYNotIdentical($1, $3); } ; - +/* }}} */ +/* 11.10 Binary Bitwise Operators {{{ */ BitwiseANDExpression : EqualityExpression { $$ = $1; } | BitwiseANDExpression "&" EqualityExpression { $$ = new(driver.pool_) CYBitwiseAnd($1, $3); } @@ -863,7 +916,8 @@ BitwiseORExpressionNoBF : BitwiseXORExpressionNoBF { $$ = $1; } | BitwiseORExpressionNoBF "|" BitwiseXORExpression { $$ = new(driver.pool_) CYBitwiseOr($1, $3); } ; - +/* }}} */ +/* 11.11 Binary Logical Operators {{{ */ LogicalANDExpression : BitwiseORExpression { $$ = $1; } | LogicalANDExpression "&&" BitwiseORExpression { $$ = new(driver.pool_) CYLogicalAnd($1, $3); } @@ -893,7 +947,8 @@ LogicalORExpressionNoBF : LogicalANDExpressionNoBF { $$ = $1; } | LogicalORExpressionNoBF "||" LogicalANDExpression { $$ = new(driver.pool_) CYLogicalOr($1, $3); } ; - +/* }}} */ +/* 11.12 Conditional Operator ( ? : ) {{{ */ ConditionalExpression : LogicalORExpression { $$ = $1; } | LogicalORExpression "?" AssignmentExpression ":" AssignmentExpression { $$ = new(driver.pool_) CYCondition($1, $3, $5); } @@ -908,7 +963,8 @@ ConditionalExpressionNoBF : LogicalORExpressionNoBF { $$ = $1; } | LogicalORExpressionNoBF "?" AssignmentExpression ":" AssignmentExpression { $$ = new(driver.pool_) CYCondition($1, $3, $5); } ; - +/* }}} */ +/* 11.13 Assignment Operators {{{ */ AssignmentExpression_ : "=" AssignmentExpression { $$ = new(driver.pool_) CYAssign(NULL, $2); } | "*=" AssignmentExpression { $$ = new(driver.pool_) CYMultiplyAssign(NULL, $2); } @@ -959,7 +1015,8 @@ AssignmentExpressionNoBF : ConditionalExpressionNoBF { $$ = $1; } | AssigneeExpressionNoBF AssignmentExpression_ { $2->SetLeft($1); $$ = $2; } ; - +/* }}} */ +/* 11.14 Comma Operator {{{ */ Expression_ : "," Expression { $$ = new(driver.pool_) CYCompound($2); } | { $$ = NULL; } @@ -991,8 +1048,10 @@ ExpressionNoIn ExpressionNoBF : AssignmentExpressionNoBF Expression_ { if ($2) { $2->AddPrev($1); $$ = $2; } else $$ = $1; } ; +/* }}} */ -Statement +/* 12 Statements {{{ */ +Statement_ : Block { $$ = $1; } | VariableStatement { $$ = $1; } | EmptyStatement { $$ = $1; } @@ -1009,6 +1068,11 @@ Statement | TryStatement { $$ = $1; } ; +Statement + : Statement_ { $$ = $1; } + ; +/* }}} */ +/* 12.1 Block {{{ */ Block_ : "{" StatementListOpt "}" { $$ = $2; } ; @@ -1025,7 +1089,8 @@ StatementListOpt : StatementList { $$ = $1; } | { $$ = NULL; } ; - +/* }}} */ +/* 12.2 Variable Statement {{{ */ VariableStatement : "var" VariableDeclarationList Terminator { $$ = new(driver.pool_) CYVar($2); } ; @@ -1073,15 +1138,18 @@ Initialiser InitialiserNoIn : "=" AssignmentExpressionNoIn { $$ = $2; } ; - +/* }}} */ +/* 12.3 Empty Statement {{{ */ EmptyStatement : ";" { $$ = new(driver.pool_) CYEmpty(); } ; - +/* }}} */ +/* 12.4 Expression Statement {{{ */ ExpressionStatement : ExpressionNoBF Terminator { $$ = new(driver.pool_) CYExpress($1); } ; - +/* }}} */ +/* 12.5 The if Statement {{{ */ ElseStatementOpt : "else" Statement { $$ = $2; } | %prec "if" { $$ = NULL; } @@ -1090,22 +1158,27 @@ ElseStatementOpt IfStatement : "if" "(" Expression ")" Statement ElseStatementOpt { $$ = new(driver.pool_) CYIf($3, $5, $6); } ; +/* }}} */ +/* 12.6 Iteration Statements {{{ */ IterationStatement : DoWhileStatement { $$ = $1; } | WhileStatement { $$ = $1; } | ForStatement { $$ = $1; } | ForInStatement { $$ = $1; } ; - +/* }}} */ +/* 12.6.1 The do-while Statement {{{ */ DoWhileStatement : "do" Statement "while" "(" Expression ")" TerminatorOpt { $$ = new(driver.pool_) CYDoWhile($5, $2); } ; - +/* }}} */ +/* 12.6.2 The while Statement {{{ */ WhileStatement : "while" "(" Expression ")" Statement { $$ = new(driver.pool_) CYWhile($3, $5); } ; - +/* }}} */ +/* 12.6.3 The for Statement {{{ */ ForStatement : "for" "(" ForStatementInitialiser ";" ExpressionOpt ";" ExpressionOpt ")" Statement { $$ = new(driver.pool_) CYFor($3, $5, $7, $9); } ; @@ -1114,7 +1187,8 @@ ForStatementInitialiser : ExpressionNoInOpt { $$ = $1; } | "var" VariableDeclarationListNoIn { $$ = $2; } ; - +/* }}} */ +/* 12.6.4 The for-in Statement {{{ */ ForInStatement : "for" "(" ForInStatementInitialiser "in" Expression ")" Statement { $$ = new(driver.pool_) CYForIn($3, $5, $7); } ; @@ -1123,23 +1197,30 @@ ForInStatementInitialiser : LeftHandSideExpression { $$ = $1; } | "var" VariableDeclarationNoIn { $$ = $2; } ; +/* }}} */ +/* 12.7 The continue Statement {{{ */ ContinueStatement : "continue" IdentifierOpt Terminator { $$ = new(driver.pool_) CYContinue($2); } ; - +/* }}} */ +/* 12.8 The break Statement {{{ */ BreakStatement : "break" IdentifierOpt Terminator { $$ = new(driver.pool_) CYBreak($2); } ; - +/* }}} */ +/* 12.9 The return Statement {{{ */ ReturnStatement : "return" ExpressionOpt Terminator { $$ = new(driver.pool_) CYReturn($2); } ; - +/* }}} */ +/* 12.10 The with Statement {{{ */ WithStatement : "with" "(" Expression ")" Statement { $$ = new(driver.pool_) CYWith($3, $5); } ; +/* }}} */ +/* 12.11 The switch Statement {{{ */ SwitchStatement : "switch" "(" Expression ")" CaseBlock { $$ = new(driver.pool_) CYSwitch($3, $5); } ; @@ -1161,15 +1242,18 @@ CaseClause DefaultClause : "default" ":" StatementListOpt { $$ = new(driver.pool_) CYClause(NULL, $3); } ; - +/* }}} */ +/* 12.12 Labelled Statements {{{ */ LabelledStatement - : Identifier ":" Statement { $3->AddLabel($1); $$ = $3; } + : Identifier ":" Statement { $$ = new(driver.pool_) CYLabel($1, $3); } ; - +/* }}} */ +/* 12.13 The throw Statement {{{ */ ThrowStatement : "throw" Expression Terminator { $$ = new(driver.pool_) CYThrow($2); } ; - +/* }}} */ +/* 12.14 The try Statement {{{ */ TryStatement : "try" Block_ CatchOpt FinallyOpt { $$ = new(driver.pool_) CYTry($2, $3, $4); } ; @@ -1180,16 +1264,18 @@ CatchOpt ; FinallyOpt - : "finally" Block_ { $$ = $2; } + : "finally" Block_ { $$ = new(driver.pool_) CYFinally($2); } | { $$ = NULL; } ; +/* }}} */ +/* 13 Function Definition {{{ */ FunctionDeclaration - : "function" Identifier "(" FormalParameterList ")" "{" FunctionBody "}" { $$ = new(driver.pool_) CYFunction($2, $4, $7); } + : "function" Identifier "(" FormalParameterList ")" "{" FunctionBody "}" { $$ = new(driver.pool_) CYFunctionStatement($2, $4, $7); } ; FunctionExpression - : "function" IdentifierOpt "(" FormalParameterList ")" "{" FunctionBody "}" { $$ = new(driver.pool_) CYLambda($2, $4, $7); } + : "function" IdentifierOpt "(" FormalParameterList ")" "{" FunctionBody "}" { $$ = new(driver.pool_) CYFunctionExpression($2, $4, $7); } ; FormalParameterList_ @@ -1205,9 +1291,10 @@ FormalParameterList FunctionBody : SourceElements { $$ = $1; } ; - +/* }}} */ +/* 14 Program {{{ */ Program - : SourceElements { driver.source_ = $1; } + : SourceElements { driver.program_ = new(driver.pool_) CYProgram($1); } ; SourceElements @@ -1216,9 +1303,10 @@ SourceElements ; SourceElement - : Statement { $$ = $1; } + : Statement_ { $$ = $1; } | FunctionDeclaration { $$ = $1; } ; +/* }}} */ /* Cycript: @class Declaration {{{ */ ClassSuperOpt @@ -1277,8 +1365,12 @@ ClassNameOpt | { $$ = NULL; } ; -ClassDefinition - : "@class" ClassNameOpt ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYClass($2, $3, $4, $5); } +ClassExpression + : "@class" ClassNameOpt ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYClassExpression($2, $3, $4, $5); } + ; + +ClassStatement + : "@class" ClassName ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYClassStatement($2, $3, $4, $5); } ; CategoryStatement @@ -1286,11 +1378,11 @@ CategoryStatement ; PrimaryExpression - : ClassDefinition { $$ = $1; } + : ClassExpression { $$ = $1; } ; -Statement - : ClassDefinition { $$ = $1; } +Statement_ + : ClassStatement { $$ = $1; } | CategoryStatement { $$ = $1; } ; /* }}} */ @@ -1347,7 +1439,8 @@ UnaryExpression_ ; MemberAccess - : "->" Identifier { $$ = new(driver.pool_) CYIndirectMember(NULL, new(driver.pool_) CYString($2)); } + : "->" "[" Expression "]" { $$ = new(driver.pool_) CYIndirectMember(NULL, $3); } + | "->" Identifier { $$ = new(driver.pool_) CYIndirectMember(NULL, new(driver.pool_) CYString($2)); } ; /* }}} */ /* ECMAScript5: Object Literal Trailing Comma {{{ */ @@ -1384,7 +1477,7 @@ ForInStatement : "for" "each" "(" ForInStatementInitialiser "in" Expression ")" Statement { $$ = new(driver.pool_) CYForEachIn($4, $6, $8); } ; /* }}} */ -/* JavaScript 1.7: Let Statements {{{ */ +/* JavaScript 1.7: let Statements {{{ *//* LetStatement : "let" "(" VariableDeclarationList ")" Block_ { $$ = new(driver.pool_) CYLet($3, $5); } ; @@ -1392,6 +1485,11 @@ LetStatement Statement : LetStatement ; +*//* }}} */ +/* JavaScript FTW: Function Statements {{{ */ +Statement + : FunctionDeclaration { driver.Warning(yylloc, "warning, FunctionDeclaration is a SourceElement, not a Statement"); } { $$ = $1; } + ; /* }}} */ %%