14

ANTLR 3 で記述されたコードのこの部分を ANTLR 4 にどのように変換しますか?

expr: (Identifier '.')=> (refIdentifier)
  | (Identifier '!')=> (refIdentifier)
  | (Identifier '=>')=> (lambdaExpression);

つまり、この種の意味述語は現在存在しないようです。代わりに何を使用できますか?

4

1 に答える 1

17

ANTLR v4では、ゲートされたセマンティック述語はなくなり構文述語{ ... }?=>もなくなりました。これは、v4で使用される解析アルゴリズムがあいまいさを解決できるためです(このような述語は不要になりました)。だから、これはあなたのためにうまくいくはずです:( ... )=>

expr
 : refIdentifier
 | refIdentifier
 | lambdaExpression
 ;

v4には、セマンティック述語、という1つのタイプの述語しかないことに注意してください{ ... }?。たとえば、トークンの内容を検査する必要がある場合は、次のように行うことができます。

id_capitals_only
 : {_input.LT(1).getText().matches("[A-Z]+")}? ID
 ;

ID
 : [a-zA-Z]+
 ;

編集

そして、サム・ハーウェルがコメントで述べているように:

意味述語{...}?V4では、ゲート付きセマンティック述語がV3で行ったように機能します。V3のゲートのない述語には、ANTLR4の対応する述語がありません。

于 2012-12-01T18:18:18.080 に答える