c-野牛使用了错误的规则



我正试图使用bison进行语法分析,但它使用了错误的规则,我没有找到如何修复它。我有一些规则,但这些规则似乎是问题的根源:

method : vars statements;
vars : //empty
| vars var;
var : type IDENTIFIER ';';
type : IDENTIFIER;
statements : //empty
| statements statement;
statement : IDENTIFIER '=' e ';';
e : (...)

IDENTIFIER是一个简单的正则表达式,匹配[a-zA-Z]*

所以基本上,如果我写:

int myint;
myint = 12;

由于myint是一个标识符,bison似乎仍然试图在第二行将其作为类型进行匹配,然后将整个内容作为var而不是语句进行匹配。所以我得到了这个错误(知道ASSIGN是'='(:

语法错误,意外的ASSIGN,应为IDENTIFIER

编辑:请注意,bison表示存在移位/减少错误,因此它可能被链接(如答案中所述(。

您遇到的问题来自于由于空statements规则而导致的shift-reduce冲突的默认解决方案——它需要知道是减少空statement并开始匹配语句,还是移动可能开始另一个var的IDENTIFIER。因此,它决定进行shift,从而将其放入var路径。

您可以通过重构语法来避免空的结果来避免这个问题:

method: vars | vars statements | statements ;
vars: var | vars var ;
statements : statement | statements statement ;
... rest the same

这避免了需要知道某个东西是var还是语句,直到转移到足够远的地方才能判断。

相关内容

  • 没有找到相关文章

最新更新