1

私はANTRLを使用していますが、これは私の文法であり、エラーが発生します。

statement
:     (name)(
    | BECOMES expression
    | LPAREN (expression (COMMA expression)*)? RPAREN
    | SHIFTLEFT name LPAREN (expression ( COMMA expression )*)? RPAREN
    )
    | OUTPUT LPAREN expression ( COMMA expression)* RPAREN
    | IF expression  THEN statement (ELSE statement)?
    | FOR name BECOMES expression TO expression DO statement
    | REPEAT statement UNTIL expression
    | WHILE expression DO statement
    | body
    | 
;

これはエラーです。「決定は、複数の選択肢を使用して「ELSE」などの入力と一致する可能性があります」。

どうすれば修正できますか?

4

1 に答える 1

0

バックトラックオプションを使用してみてください。

options {
    backtrack = true;
}

説明

新機能(大きな機能)は、文法、ルール、ブロックのbacktrack = trueオプションで、古いがらくたを入力できます。ANTLRは、意味がわからない場合にバックトラックします。分析中にantlrによってエラーが報告されることはありません。静的文法LL*分析が失敗した場合にのみ使用して、すべてのプロダクションの前に暗黙的にsynpredを追加します。predが決定で使用されない場合、Synpredコードは生成されません。これは本質的にラピッドプロトタイピングモードです。これは私がjava.gで使用したものです。ああ、バックトラック中に部分的な解析(つまりルール解析の結果)を自動的にメモ化しないようになりました。また、memoize=trueと言う必要があります。オンにするために大きな違いを生むことができます。

于 2010-07-29T18:38:08.587 に答える