私は今文法を作成していますが、左再帰を取り除く必要がありました.加算演算子を除くすべてで機能するようです.
これが私の文法の関連部分です:
SUBTRACT: '-';
PLUS: '+';
DIVIDE: '/';
MULTIPLY: '*';
expr:
(
IDENTIFIER
| INTEGER
| STRING
| TRUE
| FALSE
)
(
PLUS expr
| SUBTRACT expr
| MULTIPLY expr
| DIVIDE expr
| LESS_THAN expr
| LESS_THAN_OR_EQUAL expr
| EQUALS expr
)*
;
INTEGER: ('0'..'9')*;
IDENTIFIER: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*;
次に、次のようなことをしようとすると
x*1
それは完全に動作します。しかし、次のようなことをしようとすると
x+1
次のようなエラーが表示されます。
MismatchedTokenException: 不一致の入力 '+' は '\u001C' を予期しています
私はしばらくこれに取り組んできましたが、*、-、および / では機能するのに + では機能しない理由がわかりません。私はそれらすべてに対してまったく同じコードを持っています。
編集:並べ替えて SUBTRACT を PLUS の上に置くと、+ 記号は機能しますが、- 記号は機能しません。なぜ antlr はそのようなものの順序を気にするのでしょうか?