1

私は ANTLR が初めてで、ANTLRWorks1.4.3 で次の文法を試しています。

command
:   'go' SPACE+ 'to' SPACE+ destination
;

destination
:   (UPPER | LOWER) (UPPER | LOWER | DIGIT)*
;

SPACE
:   ' '
;

UPPER
:   'A'..'Z'
;

LOWER
:   'a'..'z'
;

DIGIT
:   '0'..'9'
;

これは、'destination' にキーワード 'go' と 'to' の最初の 2 文字が含まれている場合を除いて、問題なく動作するようです。たとえば、次のコマンドを指定すると:

go to Glasgo

ノードツリーは次のように表示されます。

ここに画像の説明を入力

目的地としてフィルワードと一致することを期待していました。

「go」の代わりに「travel」など、キーワードを変更してみました。その場合、宛先に 'tr' があれば、ANTLR は文句を言います。

なぜこれが起こるのか分かりますか?これを修正する方法は?

前もって感謝します。

4

1 に答える 1

1

ANTLR レクサーとパーサーは厳密に分離されています。入力は最初にトークン化され、その後、パーサー ルールがそのトークンで動作します。

あなたの場合、入力go to Glasgoは次の X トークンにトークン化されます。

  1. 'go'
  2. ' '(スペース)
  3. 'to'
  4. 'G'(アッパー)
  5. 'l'(低い)
  6. 'a'(低い)
  7. 's'(低い)
  8. 'go'

「ぶら下がっている」'go'キーワードを残します。これは単純に ANTLR のレクサーがどのように機能するかです: これを変更することはできません。

あなたの場合の可能な解決策はdestination、パーサールールの代わりにレクサールールを作成することです:

command
:   'go' 'to' DESTINATION
;

DESTINATION
:   (UPPER | LOWER) (UPPER | LOWER | DIGIT)*
;

SPACE
:   ' ' {skip();}
;

fragment UPPER
:   'A'..'Z'
;

fragment LOWER
:   'a'..'z'
;

fragment DIGIT
:   '0'..'9'
;

その結果:

ここに画像の説明を入力


この 2 つの違いがよくわからない場合は、次を参照してください: ANTLR のパーサー規則とレクサー規則の実際的な違いは?

s の詳細fragment: ANTLR で「フラグメント」とはどういう意味ですか?


PS。グラスゴー?_

于 2012-08-10T14:50:40.423 に答える