我正在使用 Bison 实现 Javascript 解析器。ECMAScript规范指出
ExpressionStatement:
[lookahead ∉ { '{' , 'function'}] Expression ;
这打破了“{ }”作为 BlockStatement(空语句块)和 ExpressionStatement(空对象文字)之间的歧义,因为 ExpressionStatement 不能以 '{' 标记开头,尽管 Expression 可以。
空语句块的示例:
if (a > 5) {}
空对象字面量示例:
var a = {};
如何在 bison/yacc 语法中指定某些生产不应以某些特定标记开始?我的意思是,类似:
expressionStatement
: %must-not-start-with('{', TOKEN_FUNCTION) expression ';'
;
我知道我可以复制我所有的表达式规则来定义一个“ExpressionNotStartingWithOpenCurlyBraceOrFunction”,但这会大大增加我的语法大小,所以我试图避免它。