我正在使用Bison实现一个Javascript解析器。 ECMAScript specification表示
ExpressionStatement:
[lookahead ∉ { '{' , 'function'}] Expression ;
这打破了作为BlockStatement(空语句块)的“{}”和作为ExpressionStatement(空对象文字)之间的歧义,因为ExpressionStatement不能以'{'标记开头,尽管Expression可以。< / p>
空语句块的示例:
if (a > 5) {}
空对象文字的示例:
var a = {};
如何在bison / yacc语法中指定某些生产不应该从某些特定令牌开始?我的意思是,像:
expressionStatement
: %must-not-start-with('{', TOKEN_FUNCTION) expression ';'
;
我知道我可以复制所有表达式规则以定义“ExpressionNotStartingWithOpenCurlyBraceOrFunction”,但这会增加我语法的大小,所以我试图避免它。
答案 0 :(得分:1)
野牛没有这样的指示。我看到你可以探索的另外两个选项。一种方法是研究产生的冲突,看看是否可以使用优先级指令解决它(看看http://www.gnu.org/software/bison/manual/html_node/Shift_002fReduce.html)。另一种方法是转向使用GLR解析器,并在运行时解决歧义。
如果适用,第一个选项可能更容易。但这很大程度上取决于你的语法。