ANTLR:回溯与前瞻之间的区别?

时间:2012-11-16 10:03:14

标签: antlr grammar backtracking lookahead ll

我是ANTLR的新手。我有一个非常简单的语法:

start   :
('A' 'B' 'C' '1'
|'A' 'B' 'C' '2' 
|'A' 'B' 'C' '3'
)
;

我认为我已经理解了前瞻和回溯概念的基础知识(它与句法谓词一起使用)。所以这个语法适用于k = 4或backtrack = true。但究竟是什么区别,主要问题是我何时使用什么?我试图在互联网上找到答案,但没有成功。

2 个答案:

答案 0 :(得分:3)

您的语法在ANTLR v3中无任何选项。

k选项将ANTLR限制为经典的LL(k)解析。回溯意味着 - 如果解析器无法预测,使用哪个规则,它只会尝试,回溯并再次尝试。 当ANTLR无法为给定语法构建预见DFA时,您应该使用回溯选项。 ANTLR v3可以很容易地从正则表达式构建DFA,但它在递归规则方面存在困难。例如,这个语法有效:

start: recursive_rule ';'
     | recursive_rule ':'
     ;

recursive_rule : (ID)* '%'
               ;

下面这个语法是相同的,但通过递归表达。 ANTLR无法为它构建DFA(我实际上不知道为什么),所以你需要切换回溯:

start options {backtrack=true;} : recursive_rule ';'
                                | recursive_rule ':'
                                ;

recursive_rule : ID recursive_rule
               |'%'
               ;

k选项用于提高解析器性能。我不知道将LL(*)限制为LL(k)的任何其他原因。

答案 1 :(得分:2)

我在“定义的Antlr参考书”中找到了我的问题的理论描述,这对我的理解也很重要。也许其他一些问自己类似问题的人也会帮助这本书的片段。

Snippet from the Book "The definitive Antlr Reference"

第262页