【发布时间】:2010-06-12 00:00:19
【问题描述】:
语法:
grammar test;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
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
;
start
: STRING EOF;
是用向导生成的语法;我添加了规则“开始”。
在解释器中输入:
"abc"
控制台中的结果:
[19:09:54] Interpreting...
[19:09:54] problem matching token at 1:2 MismatchedTokenException(97!=34)
[19:09:54] problem matching token at 1:3 NoViableAltException('b'@[1:1: Tokens : ( WS | STRING );])
[19:09:54] problem matching token at 1:4 NoViableAltException('c'@[1:1: Tokens : ( WS | STRING );])
[19:09:54] problem matching token at 1:5 NoViableAltException(''@[()* loopback of 11:12: ( ESC_SEQ | ~ ( '\\' | '"' ) )*])
截图: http://habreffect.ru/files/200/4cac2487f/antlr.png
ANTLRWorks v1.4 也从控制台使用 ANTLR v3.2 进行了尝试,结果相同。
如果我输入“\nabc”而不是“abc”,它可以正常工作。 如果我在 STRING 规则中将 ESC_SEQ 放在右侧,则 "abc" 有效,但 "\nabc" 失败。
【问题讨论】:
-
语法测试; WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ; STRING : '"' ( ESC_SEQ | ~('\\'|'"') )* '"' ; 片段 HEX_DIGIT : ('0'..'9'|'a'..'f'|'A' ..'F') ; 片段 ESC_SEQ : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') | UNICODE_ESC |八进制_ESC ;片段 OCTAL_ESC : '\\' ('0'..'3') ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ;片段 UNICODE_ESC : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT ;开始:字符串 EOF;
-
我在解释器中输入“abc”。控制台:[19:09:44] 解释... [19:09:54] 解释... [19:09:54] 在 1:2 MismatchedTokenException(97!=34) [19:09: 54] 在 1:3 NoViableAltException('b'@[1:1: Tokens : ( WS | STRING );]) [19:09:54] 在 1:4 NoViableAltException('c'@ [1:1: Tokens : ( WS | STRING );]) [19:09:54] 1:5 NoViableAltException(''@[()* loopback of 11:12: ( ESC_SEQ | ~ ( ') \\' | '"' ) )*])
-
ANTLRWorks 版本:1.4。当我尝试从控制台使用 ANTLR 3.2 运行解释器时,也会发生同样的事情。
-
@Alexy,感谢您的澄清。
-
这个错误在 ANTLRWorks 1.4.3 中再次出现。或者一开始就没有固定。
标签: antlr grammar antlr3 antlrworks