我有以下语法来使用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: “
我认识到它与list
,list_element
和tree_
之间的递归关系有关,但我无法解决问题。
有人可以帮忙吗?
答案 0 :(得分:0)
问题是由于输入的性质导致决定采用哪种规则并不总是立即可行。 (nil可以是新列表的开头,也可以是新树的开头)。
解决方案是启用“回溯”选项,这样当解析器意识到错误的路径时,解析器就会自行返回。
这是通过添加
来实现的backtrack=true;
语法选项。