1

我试图在 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 有更好的处理方法,请告诉我。

4

0 回答 0