9

ANTLR 4 の文法は次のとおりです。

grammar Pattern;

//parser rules
parse   : string LBRACK CHAR DASH CHAR RBRACK ;
string  : (CHAR | DASH)+ ;

//lexer rules
DASH    : '-' ;
LBRACK  : '[' ;
RBRACK  : ']' ;
CHAR    : [A-Za-z0-9] ;

そして、次の文字列を解析しようとしています

ab-cd[0-9]

ab-cdこのコードは、アプリケーションでリテラル文字列として扱われる左側の を解析します。[0-9]次に、この場合は任意の数字に変換される文字セットとして解析します。私の文法は私にとってはうまくいきますが(CHAR | DASH)+、単にトークンとして扱われるときにパーサー規則として持つのは好きではありません。レクサーがトークンを作成しSTRING、次のトークンを提供することをお勧めします。

"ab-cd" "[" "0" "-" "9" "]"

これらの代わりに

"ab" "-" "cd" "[" "0" "-" "9" "]"

私は他の例を見てきましたが、それを理解することができませんでした。通常、他の例では、そのような文字列リテラルを引用符で囲んでいるか、入力を区切るのに役立つ空白を使用しています。どちらも避けたい。これはレクサールールで達成できますか、それとも私がやっているようにパーサールールで処理し続ける必要がありますか?

4

1 に答える 1

8

ANTLR 4 では、これにレクサー モードを使用できます。

STRING : [a-z-]+;
LBRACK : '[' -> pushMode(CharSet);

mode CharSet;

DASH : '-';
NUMBER : [0-9]+;
RBRACK : ']' -> popMode;

文字を解析した後、文字に到達してコマンドが実行されるまで[、レクサーはモードで動作します。CharSet]popMode

于 2013-05-10T16:26:21.483 に答える