我是ANTLR的新手。我有一个非常简单的语法:
start :
('A' 'B' 'C' '1'
|'A' 'B' 'C' '2'
|'A' 'B' 'C' '3'
)
;
我认为我已经理解了前瞻和回溯概念的基础知识(它与句法谓词一起使用)。所以这个语法适用于k = 4或backtrack = true。但究竟是什么区别,主要问题是我何时使用什么?我试图在互联网上找到答案,但没有成功。
答案 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参考书”中找到了我的问题的理论描述,这对我的理解也很重要。也许其他一些问自己类似问题的人也会帮助这本书的片段。
第262页