使用Antlr3解析嵌套列表,由于递归规则调用而导致非LL(*)决策

时间:2014-03-05 00:34:02

标签: antlr3 left-recursion

我有以下语法来使用Antlr3解析嵌套列表

parse:
list
;

list:
LBRACK list_element* RBRACK
;

list_element:
tree_ | list
; 

tree_:
node | ATOM
;

node:
LBRACK tree_ SEPARATOR tree_ RBRACK 
;

ATOM: 'nil';
LBRACK: '(';
RBRACK:  ')';
SEPARATOR: '.'; 

WS : (' ' | '\f' | '\r' | '\n' | '\t')+{$channel = HIDDEN;};

我无法找出导致错误的原因,或者如何删除错误:

  

'/ ListParseTest / src / ListParse.g:17:13:[致命]   规则list_element具有非LL(*)决策,因为可以从alts 1,2到达递归规则调用。   通过左因子分解或使用语法谓词或使用backtrack = true选项来解析。    | ---> LIST_ELEMENT:   “

我认识到它与listlist_elementtree_之间的递归关系有关,但我无法解决问题。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

问题是由于输入的性质导致决定采用哪种规则并不总是立即可行。 (nil可以是新列表的开头,也可以是新树的开头)。

解决方案是启用“回溯”选项,这样当解析器意识到错误的路径时,解析器就会自行返回。

这是通过添加

来实现的
backtrack=true; 

语法选项。