6

次のようなルール定義があります。

reference: volume':'first_page'-'last_page ;

volume: INTEGER;
first_page: INTEGER;
last_page: INTEGER;

INTEGER: [0-9]+;

FREE_TEXT_WORD: NON_SPACE+;

fragment NON_SPACE : ~[ \r\n\t];

「 168:321-331 」という入力を考えると、参照ルールに一致すると思いました。しかし実際には、文字列全体がFREE_TEXT_WORDとしてトークン化されます。

この場合、 INTEGERトークンをFREE_TEXT_WORDより優先させるにはどうすればよいですか?

ありがとう。

4

2 に答える 2

6

ANTLR は常に短いトークンよりも長いトークンを使用するため、この状況を修正するには、次のいずれかを実行する必要があります。

  1. たとえば、入力に数字を含めないようにするか、場合によってはルールを完全に削除することによりFREE_TEXT_WORD、入力の 3 文字を超えて一致しないようにします。168:321-331

    • FREE_TEXT_WORDに変更することもできますFREE_TEXT_CHARACTER。ルールを単一の文字のみに一致するように制限することで、別のトークンよりも長くなることはなく、その優先度は文法内の位置によって決定されます。次に、単語のパーサー ルールを作成する必要があります。

      freeTextWord : FREE_TEXT_CHARACTER+;
      
  2. FREE_TEXT_WORD入力が に達した時点で有効化されていないモードにトークンを移動します168:321-331

于 2013-08-24T15:11:30.400 に答える