2012-04-28 8 views
2

文字列変数の宣言には次の文法を書いています。文字列は一重引用符間の何かのように定義されますが、文字列値に単一引用符を追加するには、$文字を使用してエスケープする方法が必要です。ANTLR lexerでの特殊文字の処理

grammar test; 

options  
{ 
    language = Java; 
} 


tokens 
{ 
    VAR = 'VAR'; 
    END_VAR = 'END_VAR'; 
} 


var_declaration: VAR string_type_declaration END_VAR EOF; 

string_type_declaration: identifier ':=' string; 

identifier: ID; 

string: STRING_VALUE; 

STRING_VALUE: '\'' ('$\''|.)* '\''; 

ID: LETTER+; 

WSFULL:(' ') {$channel=HIDDEN;}; 

fragment LETTER: (('a'..'z') | ('A'..'Z')); 

あなたはvar_declarationルールのため、このコードを実行しようとすると、この文法は、動作しません:

VAR A :='$12.2' END_VAR 

私はMismatchedTokenExceptionを取得します。

しかし、このコードはstring_type_declarationルールの正常に動作します:

A :='$12.2' 

答えて

5

あなたSTRING_VALUEが適切にトークン化ではありません。ループ(...)*の中では、$の後に一重引用符が必要ですが、入力内の文字列'$12.2'には、$の後に引用符はありません。一重引用符はオプションで('$' '\''? | .)*にする必要があります。しかし、今のループであなたの代わりには、.は、単一引用符と一致します:

次の構文解析ツリーが得られ
STRING_VALUE 
: '\'' ('$' '\''? | ~('$' | '\''))* '\'' 
; 

::良いことは、単一引用符と$以外のものと一致してみましょう

enter image description here