あいまいな Xtext 文法に問題がありますが、正しい解決策が見つかりません。
Program: (statements+=Statement)+
Statement: (AssignmentStatement | ResetStatement);
ResetStatement returns Statement:
'RESET' (fields+=Identifier)+
;
AssignStatement returns Statement:
target=Identifier ':=' object=Identifier
;
私が得る問題は、RESET ステートメントに RESET するフィールドがいくつかある可能性があることです。ただし、「:=」トークンが見つかった場合、パーサーは代わりに AssignmentStatement の開始を検出する必要があります。構文述語を使用してみましたが、次のようにして文法を明確にすることしかできませんでした。
ResetStatement returns Statement:
'RESET' =>(fields+=Identifier)+
;
ただし、お気づきかもしれませんが、次のように、これは予期された動作ではありません。
RESET ID1 ID2
ID3 := ID1
':=' トークンでエラーを返します。AssignmentStatement に述語マーカーを追加してみました。
Statement: (=>AssignmentStatement | ResetStatement);
また:
AssignStatement returns Statement:
=>(target=Identifier ':=') object=Identifier
;
しかし、成功しませんでした。エラーはすべての場合にあります:
[fatal] rule ruleResetStatement 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.
私はかなり迷っているので、ヒントは大歓迎です。