文字列変数宣言の文法は次のように書きました。文字列は一重引用符で囲まれたものと同じように定義されますが、 $文字を使用してエスケープすることにより、文字列値に一重引用符を追加する方法が必要です。
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'