より大きな式パーサーの一部を形成する次の ANTLR 文法があります。
grammar ProblemTest;
atom : constant
| propertyname;
constant: (INT+ | BOOL | STRING | DATETIME);
propertyname
: IDENTIFIER ('/' IDENTIFIER)*;
IDENTIFIER
: ('a'..'z'|'A'..'Z'|'0'..'9'|'_')+;
INT
: '0'..'9'+;
BOOL : ('true' | 'false');
DATETIME
: 'datetime\'' '0'..'9'+ '-' '0'..'9'+ '-' + '0'..'9'+ 'T' '0'..'9'+ ':' '0'..'9'+ (':' '0'..'9'+ ('.' '0'..'9'+)*)* '\'';
STRING
: '\'' ( ESC_SEQ | ~('\\'|'\'') )* '\''
;
fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
fragment
ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| UNICODE_ESC
| OCTAL_ESC
;
fragment
OCTAL_ESC
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\\' ('0'..'7') ('0'..'7')
| '\\' ('0'..'7')
;
fragment
UNICODE_ESC
: '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
;
ANTLR内からインタープリターでこれを呼び出すと、
'Hello\\World'
次に、これは定数ではなくプロパティ名として解釈されます。これを C# でコンパイルしてテスト ハーネスで実行しても同じことが起こるので、危険なインタープリターでは問題になりません。
本当に明らかな何かが欠けていると確信しています...しかし、なぜこれが起こっているのですか? 文字列マッチャーに問題があることは明らかですが、少なくともIDENTIFIERが ' 文字と一致しないという事実は、これが単に失敗するのではなく NoViableAltException をスローすることを意味すると思いましたか?