]> git.saurik.com Git - cycript.git/blobdiff - Cycript.yy.in
Bridge types for u?longlong, [US]Int64, and u?int*_t.
[cycript.git] / Cycript.yy.in
index ec7c221f1246aad3ab78200970f3fd211ed0b752..8efb228815993ef3a6b98d02be95a39219b8252e 100644 (file)
@@ -1,5 +1,5 @@
 /* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2010  Jay Freeman (saurik)
+ * Copyright (C) 2009-2012  Jay Freeman (saurik)
 */
 
 /* GNU Lesser General Public License, Version 3 {{{ */
@@ -126,6 +126,7 @@ int cylex(YYSTYPE *, cy::location *, void *);
 %parse-param { CYDriver &driver }
 %lex-param { void *cyscanner }
 
+/* Token Declarations {{{ */
 @begin E4X
 %token XMLCDATA
 %token XMLComment
@@ -393,7 +394,7 @@ int cylex(YYSTYPE *, cy::location *, void *);
 %type <statement_> LetStatement
 %type <statement_> LexicalDeclaration
 %type <literal_> Literal
-%type <literal_> LiteralNoRE
+%type <literal_> ValueLiteral
 %type <expression_> LogicalANDExpression
 %type <expression_> LogicalORExpression
 %type <member_> MemberAccess
@@ -412,9 +413,10 @@ int cylex(YYSTYPE *, cy::location *, void *);
 %type <statement_> ProgramBodyOpt
 %type <propertyName_> PropertyName_
 %type <propertyName_> PropertyName
-%type <property_> PropertyNameAndValueList_
-%type <property_> PropertyNameAndValueList
-%type <property_> PropertyNameAndValueListOpt
+%type <property_> PropertyDefinition
+%type <property_> PropertyDefinitionList_
+%type <property_> PropertyDefinitionList
+%type <property_> PropertyDefinitionListOpt
 %type <expression_> RelationalExpression
 %type <statement_> ReturnStatement
 %type <rubyProc_> RubyProcExpression
@@ -444,6 +446,7 @@ int cylex(YYSTYPE *, cy::location *, void *);
 %type <word_> WordOpt
 
 @begin ObjectiveC
+%type <expression_> BoxableExpression
 %type <statement_> CategoryStatement
 %type <expression_> ClassExpression
 %type <statement_> ClassStatement
@@ -493,12 +496,14 @@ int cylex(YYSTYPE *, cy::location *, void *);
 %type <expression_> XMLListInitialiser
 %type <expression_> XMLInitialiser
 @end
-
+/* }}} */
+/* Token Priorities {{{ */
 %nonassoc ""
 %left "++" "--"
 
 %nonassoc "if"
 %nonassoc "else"
+/* }}} */
 
 %start Program
 
@@ -529,44 +534,31 @@ LexNoFunction
     : { if (yychar == token::Function) yychar = token::Function_; }
     ;
 
+LexNoAtImplementation
+    : { if (yychar == token::AtImplementation) yychar = token::AtImplementation_; }
+    ;
+
 LexSetStatement
-    : LexNoBrace LexNoFunction
+    : LexNoBrace LexNoFunction LexNoAtImplementation
     ;
 /* }}} */
-
+/* Virtual Tokens {{{ */
 BRACE
     : "{"
     | "\n{"
     ;
+/* }}} */
 
-StrictSemi
-    : { driver.Warning(yylloc, "warning, automatic semi-colon insertion required"); }
-    ;
-
-Terminator
-    : ";"
-    | error { if (yychar != yyeof_ && yychar != token::CloseBrace && !yylval.newline_) YYABORT; else { yyerrok; driver.errors_.pop_back(); } } StrictSemi
-    ;
-
-TerminatorOpt
-    : ";"
-    | error { yyerrok; driver.errors_.pop_back(); } StrictSemi
+/* 7.6 Identifier Names and Identifiers {{{ */
+IdentifierName
+    : Word { $$ = $1; }
     ;
 
-/*CommaOpt
-    : ","
-    |
-    ;*/
-
 NewLineOpt
     : "\n"
     |
     ;
 
-IdentifierName
-    : Word { $$ = $1; }
-    ;
-
 Word
     : Identifier { $$ = $1; }
     | "break" NewLineOpt { $$ = $1; }
@@ -617,15 +609,6 @@ WordOpt
     | { $$ = NULL; }
     ;
 
-@begin ObjectiveC
-PrimaryExpression
-    : "@" LiteralNoRE { $$ = CYNew CYBox($2); }
-    | "@" ArrayLiteral { $$ = CYNew CYBox($2); }
-    | "@" ObjectLiteral { $$ = CYNew CYBox($2); }
-    | "@" Parenthetical { $$ = CYNew CYBox($2); }
-    ;
-@end
-
 Identifier
     : Identifier_ { $$ = $1; }
 
@@ -667,27 +650,48 @@ IdentifierOpt
     : Identifier { $$ = $1; }
     | { $$ = NULL; }
     ;
+/* }}} */
 
-LiteralNoRE
+/* 7.8 Literals {{{ */
+Literal
     : NullLiteral { $$ = $1; }
-    | BooleanLiteral { $$ = $1; }
-    | NumericLiteral { $$ = $1; }
-    | StringLiteral { $$ = $1; }
+    | ValueLiteral { $$ = $1; }
     ;
 
-Literal
-    : LiteralNoRE { $$ = $1; }
+ValueLiteral
+    : BooleanLiteral { $$ = $1; }
+    | NumericLiteral { $$ = $1; }
+    | StringLiteral { $$ = $1; }
     | RegularExpressionLiteral { $$ = $1; }
     ;
-
+/* }}} */
+/* 7.8.1 Null Literals {{{ */
 NullLiteral
     : "null" { $$ = $1; }
     ;
-
+/* }}} */
+/* 7.8.2 Boolean Literals {{{ */
 BooleanLiteral
     : "true" { $$ = $1; }
     | "false" { $$ = $1; }
     ;
+/* }}} */
+
+/* 7.9 Automatic Semicolon Insertion {{{ */
+StrictSemi
+    : { driver.Warning(yylloc, "warning, automatic semi-colon insertion required"); }
+    ;
+
+Terminator
+    : ";"
+    | error { if (yychar != yyeof_ && yychar != token::CloseBrace && !yylval.newline_) YYABORT; else { yyerrok; driver.errors_.pop_back(); } } StrictSemi
+    ;
+
+TerminatorOpt
+    : ";"
+    | error { yyerrok; driver.errors_.pop_back(); } StrictSemi
+    ;
+/* }}} */
 
 /* 11.1 Primary Expressions {{{ */
 Parenthetical
@@ -736,23 +740,31 @@ ElementListOpt
 /* }}} */
 /* 11.1.5 Object Initialiser {{{ */
 ObjectLiteral
-    : BRACE LexPushInOff PropertyNameAndValueListOpt LexPopIn "}" { $$ = CYNew CYObject($3); }
+    : BRACE LexPushInOff PropertyDefinitionListOpt LexPopIn "}" { $$ = CYNew CYObject($3); }
     ;
 
-PropertyNameAndValueList_
-    : "," PropertyNameAndValueList { $$ = $2; }
+PropertyDefinitionList_
+    : "," PropertyDefinitionList { $$ = $2; }
+    | "," { $$ = NULL; }
     | { $$ = NULL; }
     ;
 
-PropertyNameAndValueList
-    : PropertyName ":" AssignmentExpression PropertyNameAndValueList_ { $$ = CYNew CYProperty($1, $3, $4); }
+PropertyDefinitionList
+    : PropertyDefinition PropertyDefinitionList_ { $1->SetNext($2); $$ = $1; }
     ;
 
-PropertyNameAndValueListOpt
-    : PropertyNameAndValueList { $$ = $1; }
+PropertyDefinitionListOpt
+    : PropertyDefinitionList { $$ = $1; }
     | { $$ = NULL; }
     ;
 
+PropertyDefinition
+    // XXX: this should be IdentifierName
+    : LexSetRegExp Identifier { $$ = CYNew CYProperty($2, CYNew CYVariable($2)); }
+    | PropertyName ":" AssignmentExpression { $$ = CYNew CYProperty($1, $3); }
+    //| MethodDefinition
+    ;
+
 PropertyName_
     : IdentifierName { $$ = $1; }
     | StringLiteral { $$ = $1; }
@@ -1024,6 +1036,7 @@ StatementListItem
     | Declaration { $$ = $1; }
     ;
 /* }}} */
+
 /* 12.2 Declarations {{{ */
 BindingIdentifier
     : Identifier { $$ = $1; }
@@ -1080,6 +1093,7 @@ SingleNameBinding
     : BindingIdentifier InitialiserOpt { $$ = CYNew CYDeclaration($1, $2); }
     ;
 /* }}} */
+
 /* 12.3 Empty Statement {{{ */
 EmptyStatement
     : ";" { $$ = CYNew CYEmpty(); }
@@ -1454,6 +1468,21 @@ StatementListItem
     : "@import" ImportPath { $$ = CYNew CYImport(); }
     ;
 /* }}} */
+/* Cycript (Objective-C): Boxed Expressions {{{ */
+BoxableExpression
+    : NullLiteral { $$ = $1; }
+    | BooleanLiteral { $$ = $1; }
+    | NumericLiteral { $$ = $1; }
+    | StringLiteral { $$ = $1; }
+    | ArrayLiteral { $$ = $1; }
+    | ObjectLiteral { $$ = $1; }
+    | Parenthetical { $$ = $1; }
+    ;
+
+PrimaryExpression
+    : "@" BoxableExpression { $$ = CYNew CYBox($2); }
+    ;
+/* }}} */
 @end
 
 @begin C
@@ -1506,11 +1535,12 @@ LexSetXMLTag
     : { driver.SetCondition(CYDriver::XMLTagCondition); }
     ;
 /* }}} */
-
+/* Virtual Tokens {{{ */
 XMLWhitespaceOpt
     : XMLWhitespace
     |
     ;
+/* }}} */
 
 /* 8.1 Context Keywords {{{ */
 Identifier
@@ -1525,6 +1555,7 @@ XMLMarkup
     | XMLPI { $$ = $1; }
     ;
 /* }}} */
+
 /* 11.1 Primary Expressions {{{ */
 PrimaryExpression
     : PropertyIdentifier { $$ = CYNew CYPropertyVariable($1); }
@@ -1628,6 +1659,7 @@ XMLListInitialiser
     : "<>" LexPushInOff LexPushXMLContent XMLElementContent LexPop LexPopIn "</>" { $$ = CYNew CYXMLList($4); }
     ;
 /* }}} */
+
 /* 11.2 Left-Hand-Side Expressions {{{ */
 PropertyIdentifier_
     : Identifier { $$ = $1; }
@@ -1651,12 +1683,6 @@ Statement__
 /* }}} */
 @end
 
-/* ECMAScript5: Object Literal Trailing Comma {{{ */
-PropertyNameAndValueList_
-    : "," { $$ = NULL; }
-    ;
-/* }}} */
-
 /* JavaScript 1.7: Array Comprehensions {{{ */
 IfComprehension
     : "if" "(" Expression ")" { $$ = CYNew CYIfComprehension($3); }