我正试图使用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还是语句,直到转移到足够远的地方才能判断。