1

「#include」で始まる行など、2種類のテキストを解析しようとする単純な文法があります。これが私の文法です:

cmds
    : cmd+
    ;

cmd
    : include_cmd |  other_cmd
    ;

include_cmd
    : INCLUDE  DOUBLE_QUOTE  FILE_NAME  DOUBLE_QUOTE
    ;

other_cmd
    : (~'#')+
    ;


INCLUDE
    : '#include'
    ;

DOUBLE_QUOTE
    : '"'
    ;

FILE_NAME
    : ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')+
    ;

New_Line 
    : ('\r' | '\n')+   
    ;

WS 
    : ('\t' | ' ')+  {$channel = HIDDEN;}
    ;

しかし、私はそのような警告を受け取ります:

Decision can match input such as "INCLUDE DOUBLE_QUOTE FILE_NAME DOUBLE_QUOTE" using multiple alternatives: 1, 2

As a result, alternative(s) 2 were disabled for that input

この警告の解釈方法がわかりません。その中の例「INCLUDEDOUBLE_QUOTEFILE_NAMEDOUBLE_QUOTE」は、「other_cmd」が「#」で始まらないため、include_cmdとのみ一致する必要があります。

ここで何が起こっているのか手伝ってもらえますか?

私はantlr3.4を使用しています。

更新-greydetの提案に感謝します。other_cmdルールを(〜INCLUDE)+に変更した後、その警告は消えました。しかし、実際には別の警告があります、

Decision can match input such as "{DOUBLE_QUOTE..FILE_NAME, New_Line..WS}" using multiple alternatives: 1, 2

As a result, alternative(s) 2 were disabled for that input

これは、二重引用符がother_cmdルールとDOUBLE_QUOTEルールの両方に一致する可能性があるためだと思いますが、ここで疑問に思っているのは、一方がパーサールールで、もう一方がレクサールールです。この警告は意味がありますか?DOUBLE_QUOTEをまったく使用できませんが、パーサールールinclude_cmdで直接 "を使用しますが、それでは読みやすくなりません。

この警告をクリアするための助けはありますか?

副次的な質問-警告メッセージは代替案1、2とだけ言っていますが、1と2が何であるかはすぐにはわかりませんが、antlrをレンダリングしてより直接的な代替案を提供する方法はありますか?

4

1 に答える 1

1

ルールは、other_cmdトークンで始まらないすべてのトークンシーケンスに一致し#ます。
ルールは、トークンinclude_cmdで始まるシーケンスと一致します。#include

#とは2つの異なるトークンであるため#include、トークンで始まるトークンシーケンスは#include両方のルールに一致します。

次のルールで試してください。

other_cmd
    : (~INCLUDE)+
    ;
于 2013-02-01T16:44:54.603 に答える