我试图在 ANTLR 中重现龙书的一个例子:
grammar left_recursion_2;
options {
language = java;
}
program : 'begin'
stmt+
'end'
;
stmt : unmatched_stmt
| matched_stmt
;
matched_stmt : 'if' expr 'then' matched_stmt 'else' matched_stmt
| other
;
unmatched_stmt : 'if' expr 'then' stmt
| 'if' expr 'then' matched_stmt 'else' unmatched_stmt
;
expr : 'expression'
;
other : 'other'
;
问题是错误211:
[致命] 规则 unmatched_stmt 具有非 LL(*) 决策,因为可以从 alts 1,2 访问递归规则调用。通过左分解或使用句法谓词或使用 backtrack=true 选项来解决。
我可以打开回溯,但我想知道如何在不回溯的情况下解决它。我也看不到,谓词在这里会有什么帮助。我读到这个:
http://www.antlr.org/wiki/display/ANTLR3/How+to+remove+global+backtracking+from+your+grammar
但仍然不知道。
您将如何重写语法以使其在不回溯的情况下工作?
提前致谢!
编辑:与此同时,我得出的结论是这是不可能的。由于 LL(*) 使用 DFA 向前看,因此没有机会确定应用哪个规则:“if-else”规则或“if only”规则。但是,如果有人比使用回溯或后处理 AST 有更好的处理方法,请告诉我。