From: Jay Freeman (saurik) Date: Fri, 18 Dec 2015 02:18:59 +0000 (-0800) Subject: Use Lex rules to force "let of" to parse as CYLet. X-Git-Tag: v0.9.590~191 X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/b0fa27613239b5653fe8daf554a15993a015d4ea Use Lex rules to force "let of" to parse as CYLet. --- diff --git a/Parser.ypp.in b/Parser.ypp.in index 2101590..0c7b505 100644 --- a/Parser.ypp.in +++ b/Parser.ypp.in @@ -546,7 +546,9 @@ _finline int yylex(cy::parser::semantic_type *semantic, CYLocation *location, CY %type GeneratorMethod %type HoistableDeclaration %type Identifier +%type IdentifierNoOf %type IdentifierType +%type IdentifierTypeNoOf %type IdentifierName %type IdentifierReference %type 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; } ;