2014-03-05 36 views
0

我有以下的語法使用Antlr3解析與Antlr3嵌套列表,非LL(*)決定,由於遞歸調用規則

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: [fatal] rule list_element has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option. |---> list_element: '

我承認它是與listlist_elementtree_之間的遞歸關係,但我不能夠解決這個問題。

任何人都可以幫忙嗎?

回答

0

問題是由於輸入的性質導致決定哪個規則不總是立即可能。 (無可以是新列表的開始,也可以是新樹的開始)。

解決方案是啓用「回溯」選項,該選項允許解析器在意識到錯誤路徑時自行返回。

這是通過添加

backtrack=true; 

到語法選項來實現。