私は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" "]"
の私は他の例を見てきましたが、それを把握することができていません。通常、他の例では、このような文字列リテラルを引用符で囲むか、入力を区切るための空白があります。私は両方を避けたいです。これはレクサーのルールで達成できますか?やっているようなパーサのルールでそれを処理し続ける必要がありますか?
この洞察に感謝します。このようなサブクケナライザーの設定は、完璧なソリューションのように思えます。 'レキシカルモードはレクサー文法でのみ許されていると言っていますが、私はエラーになります。私は自分の文法を 'lexer grammar IdPattern;'と宣言できますが、パーサのルールを使うことはできません。私は何が欠けていますか? – Charles
あなたのレクサーには 'lexer grammar'を使い、あなたのパーサーには別の' parser grammar'(別ファイルで)を使う必要があります。 –
他の人を助けるリンクがあります:http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle