]> git.saurik.com Git - cycript.git/commitdiff
Use Lex rules to force "let of" to parse as CYLet.
authorJay Freeman (saurik) <saurik@saurik.com>
Fri, 18 Dec 2015 02:18:59 +0000 (18:18 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Fri, 18 Dec 2015 02:18:59 +0000 (18:18 -0800)
Parser.ypp.in

index 21015906968a4002d0aa0684c873a2f07835ae3b..0c7b505e2c3d41a8600f8f7cbebdc923ed7eb7a4 100644 (file)
@@ -546,7 +546,9 @@ _finline int yylex(cy::parser::semantic_type *semantic, CYLocation *location, CY
 %type <method_> GeneratorMethod
 %type <statement_> HoistableDeclaration
 %type <identifier_> Identifier
+%type <identifier_> IdentifierNoOf
 %type <identifier_> IdentifierType
+%type <identifier_> IdentifierTypeNoOf
 %type <word_> IdentifierName
 %type <variable_> IdentifierReference
 %type <statement_> IfStatement
@@ -724,12 +726,8 @@ LexPushYieldOn: { driver.yield_.push(true); };
 LexPushYieldOff: { driver.yield_.push(false); };
 LexPopYield: { driver.yield_.pop(); };
 
-LexOf
-    : { CYMAP(_of__, _of_); }
-    ;
-
 LexSetRegExp
-    : LexOf
+    :
     ;
 
 LexNewLine
@@ -781,12 +779,12 @@ NewLineOpt
     ;
 
 Word
-    : Identifier { $$ = $1; }
+    : IdentifierNoOf { $$ = $1; }
     | "auto" { $$ = CYNew CYWord("auto"); }
     | "break" { $$ = CYNew CYWord("break"); }
     | "case" { $$ = CYNew CYWord("case"); }
     | "catch" { $$ = CYNew CYWord("catch"); }
-    | "class" { $$ = CYNew CYWord("class"); }
+    | "class" LexOf { $$ = CYNew CYWord("class"); }
     | ";class" { $$ = CYNew CYWord("class"); }
     | "const" { $$ = CYNew CYWord("const"); }
     | "continue" { $$ = CYNew CYWord("continue"); }
@@ -800,10 +798,11 @@ Word
     | "extends" { $$ = CYNew CYWord("extends"); }
     | "false" { $$ = CYNew CYWord("false"); }
     | "finally" { $$ = CYNew CYWord("finally"); }
-    | "function" { $$ = CYNew CYWord("function"); }
+    | "function" LexOf { $$ = CYNew CYWord("function"); }
     | "if" { $$ = CYNew CYWord("if"); }
     | "import" { $$ = CYNew CYWord("import"); }
     | "!in" { $$ = CYNew CYWord("in"); }
+    | "!of" { $$ = CYNew CYWord("of"); }
     | "new" LexSetRegExp { $$ = CYNew CYWord("new"); }
     | "null" { $$ = CYNew CYWord("null"); }
     | "return" { $$ = CYNew CYWord("return"); }
@@ -880,7 +879,8 @@ IdentifierReference
     ;
 
 BindingIdentifier
-    : Identifier { $$ = $1; }
+    : IdentifierNoOf { $$ = $1; }
+    | "!of" { $$ = CYNew CYIdentifier("of"); }
     | "yield" { $$ = CYNew CYIdentifier("yield"); }
     ;
 
@@ -894,7 +894,7 @@ LabelIdentifier
     | "yield" { $$ = CYNew CYIdentifier("yield"); }
     ;
 
-IdentifierType
+IdentifierTypeNoOf
     : Identifier_ { $$ = $1; }
     | "abstract" { $$ = CYNew CYIdentifier("abstract"); }
     | "await" { $$ = CYNew CYIdentifier("await"); }
@@ -915,7 +915,6 @@ IdentifierType
     | "let" { $$ = CYNew CYIdentifier("let"); }
     | "!let" LexBind { $$ = CYNew CYIdentifier("let"); }
     | "native" { $$ = CYNew CYIdentifier("native"); }
-    | "!of" { $$ = CYNew CYIdentifier("of"); }
     | "package" { $$ = CYNew CYIdentifier("package"); }
     | "private" { $$ = CYNew CYIdentifier("private"); }
     | "protected" { $$ = CYNew CYIdentifier("protected"); }
@@ -935,8 +934,13 @@ IdentifierType
 @end
     ;
 
-Identifier
-    : IdentifierType
+IdentifierType
+    : IdentifierTypeNoOf { $$ = $1; }
+    | "of" { $$ = CYNew CYIdentifier("of"); }
+    ;
+
+IdentifierNoOf
+    : IdentifierTypeNoOf
     | "char" { $$ = CYNew CYIdentifier("char"); }
     | "int" { $$ = CYNew CYIdentifier("int"); }
     | "long" { $$ = CYNew CYIdentifier("long"); }
@@ -956,6 +960,11 @@ Identifier
     | "YES" { $$ = CYNew CYIdentifier("YES"); }
 @end
     ;
+
+Identifier
+    : IdentifierNoOf { $$ = $1; }
+    | "of" { $$ = CYNew CYIdentifier("of"); }
+    ;
 /* }}} */
 /* 12.2 Primary Expression {{{ */
 PrimaryExpression
@@ -1395,6 +1404,10 @@ LexLet
     : { CYMAP(_let__, _let_); }
     ;
 
+LexOf
+    : { CYMAP(_of__, _of_); }
+    ;
+
 LexBind
     : { CYMAP(OpenBrace_let, OpenBrace); CYMAP(OpenBracket_let, OpenBracket); } LexOf
     ;
@@ -1650,11 +1663,11 @@ DebuggerStatement
 
 /* 14.1 Function Definitions {{{ */
 FunctionDeclaration
-    : ";function" BindingIdentifier "(" FormalParameters ")" BRACE LexPushSuperOff FunctionBody "}" LexPopSuper { $$ = CYNew CYFunctionStatement($2, $4, $8); }
+    : ";function" LexOf BindingIdentifier "(" FormalParameters ")" BRACE LexPushSuperOff FunctionBody "}" LexPopSuper { $$ = CYNew CYFunctionStatement($3, $5, $9); }
     ;
 
 FunctionExpression
-    : "function" BindingIdentifierOpt "(" FormalParameters ")" BRACE LexPushSuperOff FunctionBody "}" LexPopSuper { $$ = CYNew CYFunctionExpression($2, $4, $8); }
+    : "function" LexOf BindingIdentifierOpt "(" FormalParameters ")" BRACE LexPushSuperOff FunctionBody "}" LexPopSuper { $$ = CYNew CYFunctionExpression($3, $5, $9); }
     ;
 
 StrictFormalParameters
@@ -1729,11 +1742,11 @@ GeneratorMethod
     ;
 
 GeneratorDeclaration
-    : ";function" "*" BindingIdentifier "(" FormalParameters ")" BRACE GeneratorBody "}" { CYNOT(@$); /* $$ = CYNew CYGeneratorStatement($3, $5, $8); */ }
+    : ";function" LexOf "*" LexOf BindingIdentifier "(" FormalParameters ")" BRACE GeneratorBody "}" { CYNOT(@$); /* $$ = CYNew CYGeneratorStatement($3, $5, $8); */ }
     ;
 
 GeneratorExpression
-    : "function" "*" BindingIdentifierOpt "(" FormalParameters ")" BRACE GeneratorBody "}" { CYNOT(@$); /* $$ = CYNew CYGeneratorExpression($3, $5, $8); */ }
+    : "function" LexOf "*" LexOf BindingIdentifierOpt "(" FormalParameters ")" BRACE GeneratorBody "}" { CYNOT(@$); /* $$ = CYNew CYGeneratorExpression($3, $5, $8); */ }
     ;
 
 GeneratorBody
@@ -1752,11 +1765,11 @@ YieldExpression
 /* }}} */
 /* 14.5 Class Definitions {{{ */
 ClassDeclaration
-    : ";class" BindingIdentifier ClassTail { $$ = CYNew CYClassStatement($2, $3); }
+    : ";class" LexOf BindingIdentifier ClassTail { $$ = CYNew CYClassStatement($3, $4); }
     ;
 
 ClassExpression
-    : "class" BindingIdentifierOpt ClassTail { $$ = CYNew CYClassExpression($2, $3); }
+    : "class" LexOf BindingIdentifierOpt ClassTail { $$ = CYNew CYClassExpression($3, $4); }
     ;
 
 ClassTail
@@ -2030,7 +2043,7 @@ TypeOpt
     ;
 
 MessageParameter
-    : Word ":" TypeOpt Identifier { $3->identifier_ = $4; $$ = CYNew CYMessageParameter($1, $3); }
+    : Word ":" TypeOpt BindingIdentifier { $3->identifier_ = $4; $$ = CYNew CYMessageParameter($1, $3); }
     ;
 
 MessageParameterList
@@ -2476,7 +2489,7 @@ RubyProcParameterList_
     ;
 
 RubyProcParameterList
-    : Identifier RubyProcParameterList_ { $$ = CYNew CYFunctionParameter(CYNew CYDeclaration($1), $2); }
+    : BindingIdentifier RubyProcParameterList_ { $$ = CYNew CYFunctionParameter(CYNew CYDeclaration($1), $2); }
     | { $$ = NULL; }
     ;