2013-05-10 14 views
7

私はANTLR 4については、以下の文法があります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" "]" 

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

答えて

7

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

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

mode CharSet; 

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

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

+0

この洞察に感謝します。このようなサブクケナライザーの設定は、完璧なソリューションのように思えます。 'レキシカルモードはレクサー文法でのみ許されていると言っていますが、私はエラーになります。私は自分の文法を 'lexer grammar IdPattern;'と宣言できますが、パーサのルールを使うことはできません。私は何が欠けていますか? – Charles

+1

あなたのレクサーには 'lexer grammar'を使い、あなたのパーサーには別の' parser grammar'(別ファイルで)を使う必要があります。 –

+0

他の人を助けるリンクがあります:http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle

関連する問題