@if Bison24 %code top {
#define cyscanner driver.scanner_
#define YYSTACKEXPANDABLE 1
-#define yyerrok (yyerrstatus_ = 0)
+@if Bison23 #define yyerrok (yyerrstatus_ = 0)
@if Bison24 }
@if Bison24 %code requires {
CYProgram *program_;
CYProperty *property_;
CYPropertyName *propertyName_;
+ CYRubyProc *rubyProc_;
CYStatement *statement_;
CYString *string_;
CYThis *this_;
%token CloseParen ")"
%token OpenBrace "{"
+%token OpenBrace_ "\n{"
%token CloseBrace "}"
%token OpenBracket "["
%token <identifier_> XML "xml"
@end
+%token AutoComplete
+
%token <identifier_> Identifier_
%token <number_> NumericLiteral
%token <string_> StringLiteral
%type <expression_> RelationalExpressionNoIn
%type <infix_> RelationalExpressionNoIn_
%type <statement_> ReturnStatement
+%type <rubyProc_> RubyProcExpression
+%type <functionParameter_> RubyProcParameterList
+%type <functionParameter_> RubyProcParameterList_
+%type <functionParameter_> RubyProcParametersOpt
%type <expression_> ShiftExpression
%type <expression_> ShiftExpressionNoBF
%type <statement_> SourceElement
%type <selector_> SelectorExpression_
%type <selector_> SelectorExpressionOpt
%type <argument_> SelectorList
+%type <word_> SelectorWordOpt
%type <expression_> TypeOpt
%type <argument_> VariadicCall
%type <word_> Word
;
/* }}} */
+Brace
+ : "{"
+ | "\n{"
+ ;
+
StrictSemi
: { driver.Warning(yylloc, "warning, automatic semi-colon insertion required"); }
;
PrimaryExpressionNo
: "this" { $$ = $1; }
| Identifier { $$ = new(driver.pool_) CYVariable($1); }
+ | AutoComplete { driver.mode_ = CYDriver::AutoPrimary; YYACCEPT; }
| Literal { $$ = $1; }
| ArrayLiteral { $$ = $1; }
| "(" Expression ")" { $$ = $2; }
/* }}} */
/* 11.1.5 Object Initialiser {{{ */
ObjectLiteral
- : "{" PropertyNameAndValueListOpt "}" { $$ = new(driver.pool_) CYObject($2); }
+ : OpenBrace PropertyNameAndValueListOpt "}" { $$ = new(driver.pool_) CYObject($2); }
;
PropertyNameAndValueList_
MemberAccess
: "[" Expression "]" { $$ = new(driver.pool_) CYDirectMember(NULL, $2); }
| "." Identifier { $$ = new(driver.pool_) CYDirectMember(NULL, new(driver.pool_) CYString($2)); }
+ | "." AutoComplete { driver.mode_ = CYDriver::AutoDirect; YYACCEPT; }
;
MemberExpression
: PrimaryExpression { $$ = $1; }
| LexSetRegExp FunctionExpression { $$ = $2; }
- | MemberExpression MemberAccess { $2->SetLeft($1); $$ = $2; }
+ | MemberExpression { driver.context_ = $1; } MemberAccess { $3->SetLeft($1); $$ = $3; }
| LexSetRegExp MemberExpression_ { $$ = $2; }
;
MemberExpressionNoBF
: PrimaryExpressionNoBF { $$ = $1; }
- | MemberExpressionNoBF MemberAccess { $2->SetLeft($1); $$ = $2; }
+ | MemberExpressionNoBF { driver.context_ = $1; } MemberAccess { $3->SetLeft($1); $$ = $3; }
| MemberExpression_ { $$ = $1; }
;
MemberExpressionNoRE
: PrimaryExpressionNoRE { $$ = $1; }
| FunctionExpression { $$ = $1; }
- | MemberExpressionNoRE MemberAccess { $2->SetLeft($1); $$ = $2; }
+ | MemberExpressionNoRE { driver.context_ = $1; } MemberAccess { $3->SetLeft($1); $$ = $3; }
| MemberExpression_ { $$ = $1; }
;
@end
CallExpression
: MemberExpression Arguments { $$ = new(driver.pool_) CYCall($1, $2); }
| CallExpression Arguments { $$ = new(driver.pool_) CYCall($1, $2); }
- | CallExpression MemberAccess { $2->SetLeft($1); $$ = $2; }
+ | CallExpression { driver.context_ = $1; } MemberAccess { $3->SetLeft($1); $$ = $3; }
;
CallExpressionNoBF
: MemberExpressionNoBF Arguments { $$ = new(driver.pool_) CYCall($1, $2); }
| CallExpressionNoBF Arguments { $$ = new(driver.pool_) CYCall($1, $2); }
- | CallExpressionNoBF MemberAccess { $2->SetLeft($1); $$ = $2; }
+ | CallExpressionNoBF { driver.context_ = $1; } MemberAccess { $3->SetLeft($1); $$ = $3; }
;
@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; }
+ | CallExpressionNoRE { driver.context_ = $1; } MemberAccess { $3->SetLeft($1); $$ = $3; }
;
@end
/* }}} */
/* 12.1 Block {{{ */
Block_
- : "{" StatementListOpt "}" { $$ = $2; }
+ : Brace StatementListOpt "}" { $$ = $2; }
;
Block
;
CaseBlock
- : "{" CaseClausesOpt "}" { $$ = $2; }
+ : Brace CaseClausesOpt "}" { $$ = $2; }
;
CaseClausesOpt
/* 13 Function Definition {{{ */
FunctionDeclaration
- : "function" Identifier "(" FormalParameterList ")" "{" FunctionBody "}" { $$ = new(driver.pool_) CYFunctionStatement($2, $4, $7); }
+ : "function" Identifier "(" FormalParameterList ")" Brace FunctionBody "}" { $$ = new(driver.pool_) CYFunctionStatement($2, $4, $7); }
;
FunctionExpression
- : "function" IdentifierOpt "(" FormalParameterList ")" "{" FunctionBody "}" { $$ = new(driver.pool_) CYFunctionExpression($2, $4, $7); }
+ : "function" IdentifierOpt "(" FormalParameterList ")" Brace FunctionBody "}" { $$ = new(driver.pool_) CYFunctionExpression($2, $4, $7); }
;
FormalParameterList_
;
ClassFieldList
- : "{" "}" { $$ = NULL; }
+ : Brace "}" { $$ = NULL; }
;
MessageScope
;
ClassMessageDeclaration
- : MessageScope TypeOpt MessageParameters "{" FunctionBody "}" { $$ = new(driver.pool_) CYMessage($1, $2, $3, $5); }
+ : MessageScope TypeOpt MessageParameters Brace FunctionBody "}" { $$ = new(driver.pool_) CYMessage($1, $2, $3, $5); }
;
ClassMessageDeclarationListOpt
| VariadicCall { $$ = $1; }
;
+SelectorWordOpt
+ : WordOpt { driver.contexts_.back().words_.push_back($1); } { $$ = $1; }
+ | AutoComplete { driver.mode_ = CYDriver::AutoMessage; YYACCEPT; }
+ ;
+
SelectorCall
- : WordOpt ":" AssignmentExpression SelectorCall_ { $$ = new(driver.pool_) CYArgument($1 ?: new(driver.pool_) CYBlank(), $3, $4); }
+ : SelectorWordOpt ":" AssignmentExpression SelectorCall_ { $$ = new(driver.pool_) CYArgument($1 ?: new(driver.pool_) CYBlank(), $3, $4); }
;
SelectorList
;
MessageExpression
- : "[" AssignmentExpression SelectorList "]" { $$ = new(driver.pool_) CYSendDirect($2, $3); }
- | "[" LexSetRegExp "super" SelectorList "]" { $$ = new(driver.pool_) CYSendSuper($4); }
+ : "[" AssignmentExpression { driver.contexts_.push_back($2); } SelectorList "]" { driver.contexts_.pop_back(); } { $$ = new(driver.pool_) CYSendDirect($2, $4); }
+ | "[" LexSetRegExp "super" { driver.context_ = NULL; } SelectorList "]" { $$ = new(driver.pool_) CYSendSuper($5); }
;
SelectorExpressionOpt
MemberAccess
: "->" "[" Expression "]" { $$ = new(driver.pool_) CYIndirectMember(NULL, $3); }
| "->" Identifier { $$ = new(driver.pool_) CYIndirectMember(NULL, new(driver.pool_) CYString($2)); }
+ | "->" AutoComplete { driver.mode_ = CYDriver::AutoIndirect; YYACCEPT; }
;
/* }}} */
@end
;
XMLExpression
- : "{" LexPushRegExp Expression "}" LexPop
+ : Brace LexPushRegExp Expression "}" LexPop
;
XMLTagName
: "," { $$ = NULL; }
;
/* }}} */
+
/* JavaScript 1.7: Array Comprehensions {{{ */
IfComprehension
: "if" "(" Expression ")" { $$ = new(driver.pool_) CYIfComprehension($3); }
: LetStatement
;
*//* }}} */
+
/* JavaScript FTW: Function Statements {{{ */
Statement
: LexSetRegExp FunctionDeclaration { driver.Warning(yylloc, "warning, FunctionDeclaration is a SourceElement, not a Statement"); } { $$ = $2; }
;
/* }}} */
+/* JavaScript FTW: Optional Arguments {{{ */
+FormalParameterList
+ : Identifier "=" AssignmentExpression FormalParameterList_ { $$ = new(driver.pool_) CYOptionalFunctionParameter($1, $3, $4); }
+ ;
+/* }}} */
+/* JavaScript FTW: Ruby Blocks {{{ */
+RubyProcParameterList_
+ : "," RubyProcParameterList { $$ = $2; }
+ | { $$ = NULL; }
+ ;
+
+RubyProcParameterList
+ : Identifier RubyProcParameterList_ { $$ = new(driver.pool_) CYFunctionParameter($1, $2); }
+ | { $$ = NULL; }
+ ;
+
+RubyProcParametersOpt
+ : "|" RubyProcParameterList "|" { $$ = $2; }
+ | { $$ = NULL; }
+ ;
+
+RubyProcExpression
+ : "{" RubyProcParametersOpt StatementListOpt "}" { $$ = new(driver.pool_) CYRubyProc($2, $3); }
+ ;
+
+LeftHandSideExpression
+ : LeftHandSideExpression RubyProcExpression { $$ = new(driver.pool_) CYRubyBlock($1, $2); }
+ ;
+
+LeftHandSideExpressionNoBF
+ : LeftHandSideExpressionNoBF RubyProcExpression { $$ = new(driver.pool_) CYRubyBlock($1, $2); }
+ ;
+
+@begin C
+LeftHandSideExpressionNoRE
+ : LeftHandSideExpressionNoRE RubyProcExpression { $$ = new(driver.pool_) CYRubyBlock($1, $2); }
+ ;
+@end
+/* }}} */
%%