0

あいまいな 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.

私はかなり迷っているので、ヒントは大歓迎です。

4

0 に答える 0