1

私は ANTLR を使用して Java のような言語の認識エンジンを生成しています。ジェネリック型を認識するために次の規則が使用されています。

referenceType
:   singleType ('.' singleType)*
;

singleType
: Identifier typeArguments?
;

typeArguments
:   '<' typeArgument (',' typeArgument)* '>' 
;

typeArgument
:    referenceType
;

ここで、次の入力ステートメントに対して、ANTLR は「実行可能な代替手段がありません」というエラーを生成します。

Iterator<Entry<K,V>> i = entrySet().iterator();

ただし、2 つの連続する '>' 文字の間にスペースを入れても、エラーは発生しません。ANTLR は上記のルールとシフト式を認識するために使用されるルールを区別できないようですが、このあいまいさを解決するために文法を変更する方法がわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

1

おそらく、レクサーには次のようなルールがあります。

RightShift : '>>';

コンテキストに応じて、 ANTLR が>>2>文字または 1 つの>>演算子として認識できるようにするには、代わりにシフト演算子をパーサーに配置する必要があります。

rightShift : '>' '>';

言語に>>>or>>=演算子が含まれている場合、それらもパーサーに移動する必要があります。

x > > yそれが許可されていないことを検証するには、結果の解析ツリー (ANTLR 4) または AST (ANTLR 3) をパスして、パーサー ルール>によって解析された 2 つの文字が順番に表示されることを確認します。rightShift

于 2013-04-15T15:55:35.107 に答える