0

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: [fatal] ルール list_element には、alts 1、2 から到達可能な再帰ルール呼び出しのため、非 LL(*) 決定があります。左因数分解するか、構文述語を使用するか、backtrack=true オプションを使用して解決します。|---> list_element: '

listと の間の再帰的な関係と関係があることは認識していますがlist_elementtree_問題を解決できません。

誰でも助けることができますか?

4

1 に答える 1

0

この問題は、どのルールを採用するかの決定が常にすぐに可能であるとは限らない入力の性質によるものです。(nil は、新しいリストの開始または新しいツリーの開始のいずれかである可能性があります)。

解決策は、「バックトラッキング」オプションを有効にすることです。これにより、パーサーが間違ったパスをとったことに気付いたときに、パーサーが元に戻ることができます。

これは、追加することによって達成されます

backtrack=true; 

文法オプションに。

于 2014-03-05T14:00:47.893 に答える