yacc中的生产开始约束

时间:2013-06-19 15:47:57

标签: parsing compiler-construction grammar bison yacc

我正在使用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”,但这会增加我语法的大小,所以我试图避免它。

1 个答案:

答案 0 :(得分:1)

野牛没有这样的指示。我看到你可以探索的另外两个选项。一种方法是研究产生的冲突,看看是否可以使用优先级指令解决它(看看http://www.gnu.org/software/bison/manual/html_node/Shift_002fReduce.html)。另一种方法是转向使用GLR解析器,并在运行时解决歧义。

如果适用,第一个选项可能更容易。但这很大程度上取决于你的语法。