X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/9b5527f0b979deba030328eb11c355b5785aceb5..1e7ce5572cfc83d260cbe73d66814f54e5760c37:/Cycript.y diff --git a/Cycript.y b/Cycript.y index 7b1399d..7fdc172 100644 --- a/Cycript.y +++ b/Cycript.y @@ -52,12 +52,15 @@ typedef struct { union { bool bool_; + CYDriver::Condition condition_; + CYArgument *argument_; CYAssignment *assignment_; CYBoolean *boolean_; CYClause *clause_; CYCatch *catch_; CYClassName *className_; + CYComprehension *comprehension_; CYCompound *compound_; CYDeclaration *declaration_; CYDeclarations *declarations_; @@ -65,6 +68,7 @@ typedef struct { CYExpression *expression_; CYFalse *false_; CYField *field_; + CYFinally *finally_; CYForInitialiser *for_; CYForInInitialiser *forin_; CYFunctionParameter *functionParameter_; @@ -76,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_; @@ -105,12 +109,16 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %defines -%debug +//%glr-parser +//%expect 1 + %error-verbose %parse-param { CYDriver &driver } %lex-param { void *scanner } +%token At "@" + %token Ampersand "&" %token AmpersandAmpersand "&&" %token AmpersandEqual "&=" @@ -172,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" @@ -180,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" @@ -188,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" @@ -201,41 +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 Identifier +// 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 @@ -255,6 +282,7 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type BitwiseANDExpressionNoBF %type BitwiseANDExpressionNoIn %type Block +%type Block_ %type BooleanLiteral %type BitwiseORExpression %type BitwiseORExpressionNoBF @@ -269,12 +297,17 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type CaseClause %type CaseClausesOpt %type CatchOpt -%type ClassDeclaration +%type CategoryStatement +%type ClassExpression %type ClassMessageDeclaration %type ClassMessageDeclarationListOpt %type ClassName +%type ClassNameOpt +%type ClassStatement %type ClassSuperOpt %type ClassFieldList +%type ComprehensionList +%type ComprehensionListOpt %type ConditionalExpression %type ConditionalExpressionNoBF %type ConditionalExpressionNoIn @@ -298,17 +331,20 @@ 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 %type ForInStatement %type ForInStatementInitialiser %type FormalParameterList %type FormalParameterList_ -%type FunctionBody -%type FunctionDeclaration +%type FunctionBody +%type FunctionDeclaration %type FunctionExpression +%type Identifier %type IdentifierOpt +%type IfComprehension %type IfStatement %type Initialiser %type InitialiserOpt @@ -318,6 +354,7 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type LabelledStatement %type LeftHandSideExpression %type LeftHandSideExpressionNoBF +//%type LetStatement %type Literal %type LogicalANDExpression %type LogicalANDExpressionNoBF @@ -346,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 @@ -362,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 @@ -412,22 +452,29 @@ 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 +/*CommaOpt : "," | - ; + ;*/ NewLineOpt : "\n" @@ -441,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; } @@ -455,63 +498,88 @@ 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; } + + | "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 : Identifier { $$ = $1; } | { $$ = 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 @@ -572,7 +640,7 @@ ObjectLiteral PropertyNameAndValueList_ : "," PropertyNameAndValueList { $$ = $2; } - | CommaOpt { $$ = NULL; } + | { $$ = NULL; } ; PropertyNameAndValueListOpt @@ -591,6 +659,7 @@ PropertyName ; /* }}} */ +/* 11.2 Left-Hand-Side Expressions {{{ */ MemberExpression_ : "new" MemberExpression Arguments { $$ = new(driver.pool_) CYNew($2, $3); } ; @@ -666,7 +735,8 @@ LeftHandSideExpressionNoBF : NewExpressionNoBF { $$ = $1; } | CallExpressionNoBF { $$ = $1; } ; - +/* }}} */ +/* 11.3 Postfix Expressions {{{ */ PostfixExpression : AssigneeExpression { $$ = $1; } | LeftHandSideExpression "++" { $$ = new(driver.pool_) CYPostIncrement($1); } @@ -678,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); } @@ -687,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); } @@ -702,7 +773,8 @@ UnaryExpressionNoBF : PostfixExpressionNoBF { $$ = $1; } | UnaryExpression_ { $$ = $1; } ; - +/* }}} */ +/* 11.5 Multiplicative Operators {{{ */ MultiplicativeExpression : UnaryExpression { $$ = $1; } | MultiplicativeExpression "*" UnaryExpression { $$ = new(driver.pool_) CYMultiply($1, $3); } @@ -716,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); } @@ -728,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); } @@ -742,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); } @@ -770,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); } @@ -794,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); } @@ -839,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); } @@ -869,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); } @@ -884,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); } @@ -935,7 +1015,8 @@ AssignmentExpressionNoBF : ConditionalExpressionNoBF { $$ = $1; } | AssigneeExpressionNoBF AssignmentExpression_ { $2->SetLeft($1); $$ = $2; } ; - +/* }}} */ +/* 11.14 Comma Operator {{{ */ Expression_ : "," Expression { $$ = new(driver.pool_) CYCompound($2); } | { $$ = NULL; } @@ -967,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; } @@ -985,8 +1068,17 @@ Statement | TryStatement { $$ = $1; } ; +Statement + : Statement_ { $$ = $1; } + ; +/* }}} */ +/* 12.1 Block {{{ */ +Block_ + : "{" StatementListOpt "}" { $$ = $2; } + ; + Block - : "{" StatementListOpt "}" { $$ = $2 ?: new(driver.pool_) CYEmpty(); } + : Block_ { if ($1) $$ = new(driver.pool_) CYBlock($1); else $$ = new(driver.pool_) CYEmpty(); } ; StatementList @@ -997,9 +1089,10 @@ StatementListOpt : StatementList { $$ = $1; } | { $$ = NULL; } ; - +/* }}} */ +/* 12.2 Variable Statement {{{ */ VariableStatement - : "var" VariableDeclarationList Terminator { $$ = $2; } + : "var" VariableDeclarationList Terminator { $$ = new(driver.pool_) CYVar($2); } ; VariableDeclarationList_ @@ -1045,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; } @@ -1062,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); } ; @@ -1086,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); } ; @@ -1095,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); } ; @@ -1133,35 +1242,40 @@ 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); } + : "try" Block_ CatchOpt FinallyOpt { $$ = new(driver.pool_) CYTry($2, $3, $4); } ; CatchOpt - : "catch" "(" Identifier ")" Block { $$ = new(driver.pool_) CYCatch($3, $5); } + : "catch" "(" Identifier ")" Block_ { $$ = new(driver.pool_) CYCatch($3, $5); } | { $$ = NULL; } ; 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_ @@ -1177,9 +1291,10 @@ FormalParameterList FunctionBody : SourceElements { $$ = $1; } ; - +/* }}} */ +/* 14 Program {{{ */ Program - : SourceElements { driver.source_ = $1; } + : SourceElements { driver.program_ = new(driver.pool_) CYProgram($1); } ; SourceElements @@ -1188,11 +1303,12 @@ SourceElements ; SourceElement - : Statement { $$ = $1; } + : Statement_ { $$ = $1; } | FunctionDeclaration { $$ = $1; } ; +/* }}} */ -/* Objective-C Extensions {{{ */ +/* Cycript: @class Declaration {{{ */ ClassSuperOpt : ":" MemberExpressionNoBF { $$ = $2; } | { $$ = NULL; } @@ -1213,7 +1329,7 @@ TypeOpt ; MessageParameter - : Word ":" TypeOpt Identifier { $$ = new CYMessageParameter($1, $3, $4); } + : Word ":" TypeOpt Identifier { $$ = new(driver.pool_) CYMessageParameter($1, $3, $4); } ; MessageParameterListOpt @@ -1227,11 +1343,11 @@ MessageParameterList MessageParameters : MessageParameterList { $$ = $1; } - | Word { $$ = new CYMessageParameter($1, NULL, NULL); } + | Word { $$ = new(driver.pool_) CYMessageParameter($1, NULL, NULL); } ; ClassMessageDeclaration - : MessageScope TypeOpt MessageParameters "{" FunctionBody "}" { $$ = new CYMessage($1, $2, $3, $5); } + : MessageScope TypeOpt MessageParameters "{" FunctionBody "}" { $$ = new(driver.pool_) CYMessage($1, $2, $3, $5); } ; ClassMessageDeclarationListOpt @@ -1244,15 +1360,33 @@ ClassName | "(" AssignmentExpression ")" { $$ = $2; } ; -ClassDeclaration - : "@class" Identifier ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new CYClass($2, $3, $4, $5); } - | "@class" ClassName ClassMessageDeclarationListOpt "@end" { $$ = new CYCategory($2, $3); } +ClassNameOpt + : ClassName { $$ = $1; } + | { $$ = NULL; } + ; + +ClassExpression + : "@class" ClassNameOpt ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYClassExpression($2, $3, $4, $5); } ; -SourceElement - : ClassDeclaration { $$ = $1; } +ClassStatement + : "@class" ClassName ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYClassStatement($2, $3, $4, $5); } ; +CategoryStatement + : "@class" ClassName ClassMessageDeclarationListOpt "@end" { $$ = new(driver.pool_) CYCategory($2, $3); } + ; + +PrimaryExpression + : ClassExpression { $$ = $1; } + ; + +Statement_ + : ClassStatement { $$ = $1; } + | CategoryStatement { $$ = $1; } + ; +/* }}} */ +/* Cycript: Send Message {{{ */ VariadicCall : "," AssignmentExpression VariadicCall { $$ = new(driver.pool_) CYArgument(NULL, $2, $3); } | { $$ = NULL; } @@ -1292,10 +1426,10 @@ SelectorExpression PrimaryExpression_ : MessageExpression { $$ = $1; } - | "@selector" "(" SelectorExpression ")" { $$ = new CYSelector($3); } + | "@selector" "(" SelectorExpression ")" { $$ = new(driver.pool_) CYSelector($3); } ; /* }}} */ - +/* Cycript: Pointer Indirection/Addressing {{{ */ AssigneeExpression_ : "*" UnaryExpression { $$ = new(driver.pool_) CYIndirect($2); } ; @@ -1305,7 +1439,57 @@ 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 {{{ */ +PropertyNameAndValueList_ + : "," { $$ = NULL; } ; +/* }}} */ +/* JavaScript 1.7: Array Comprehensions {{{ */ +IfComprehension + : "if" "(" Expression ")" { $$ = new(driver.pool_) CYIfComprehension($3); } + ; + +ForComprehension + : "for" "(" Identifier "in" Expression ")" { $$ = new(driver.pool_) CYForInComprehension($3, $5); } + | "for" "each" "(" Identifier "in" Expression ")" { $$ = new(driver.pool_) CYForEachInComprehension($4, $6); } + ; + +ComprehensionListOpt + : ComprehensionList { $$ = $1; } + | IfComprehension { $$ = $1; } + | { $$ = NULL; } + ; + +ComprehensionList + : ForComprehension ComprehensionListOpt { $1->SetNext($2); $$ = $1; } + ; + +PrimaryExpression_ + : "[" AssignmentExpression ComprehensionList "]" { $$ = new(driver.pool_) CYArrayComprehension($2, $3); } + ; +/* }}} */ +/* JavaScript 1.7: for each {{{ */ +ForInStatement + : "for" "each" "(" ForInStatementInitialiser "in" Expression ")" Statement { $$ = new(driver.pool_) CYForEachIn($4, $6, $8); } + ; +/* }}} */ +/* JavaScript 1.7: let Statements {{{ *//* +LetStatement + : "let" "(" VariableDeclarationList ")" Block_ { $$ = new(driver.pool_) CYLet($3, $5); } + ; + +Statement + : LetStatement + ; +*//* }}} */ +/* JavaScript FTW: Function Statements {{{ */ +Statement + : FunctionDeclaration { driver.Warning(yylloc, "warning, FunctionDeclaration is a SourceElement, not a Statement"); } { $$ = $1; } + ; +/* }}} */ %%