ANTLR:ANTLRWorks向导中的简单示例';行不通

ANTLR:ANTLRWorks向导中的简单示例';行不通,antlr,grammar,antlr3,antlrworks,Antlr,Grammar,Antlr3,Antlrworks,语法: grammar test; WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ; STRING : '"' ( ESC_SEQ | ~('\\'|'"') )* '"' ; fragment HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; fragment ESC_SEQ : '\

语法:

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 | ~ ( '\\' | '"' ) )*])
截图:

ANTLRWorks v1.4 还尝试了使用ANTLR v3.2的控制台,结果相同

如果我键入“\nabc”而不是“abc”,它可以正常工作。
如果我在字符串规则中将ESC_SEQ放在右边,则“abc”可以工作,但“\nabc”失败。

这似乎是AntlWorks 1.4中的一个错误。您可以尝试使用ATLRWorks 1.3(或更早版本),也许该版本工作正常(我只对v1.4进行了快速检查!)

在控制台中,解析示例字符串(
“abc”
“\nabc”
)时不会出现任何问题。这是我的测试设备和相应的输出:

grammar test;

start 
  :  STRING {System.out.println("parsed :: "+$STRING.text);} EOF
  ;

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
  ;
请注意,语法与您的相同,只是格式稍有不同

和“主要”类:

现在,您可以从控制台创建解析器和词法分析器:

java -cp antlr-3.2.jar org.antlr.Tool test.g
编译所有.java源文件:

javac -cp antlr-3.2.jar *.java
并运行“主”类:

(对于Windows,将上述命令中的
替换为

请注意,上面的命令行参数是在Bash上运行的示例,其中需要转义
\
:这在您的系统上可能不同。但从输出中可以看到:
“\nabc”
“abc”
都得到正确解析

ANTLRWorks是编辑语法文件的一个很好的工具,但是(以我的经验来看)它有很多这样有趣的错误。这就是为什么我只使用它编辑语法,并在控制台上生成、编译和测试文件,正如我向您展示的那样


HTH

语法测试;WS:(“|”\t“|”\r“|”\n”){$channel=HIDDEN;};字符串:“”(ESC|SEQ ~(“\\\'\'\'\''''.')*”;片段十六进制数字:('0'..'9'|'a'..'f'|'a'..'f');片段ESC|u SEQ:“\\\”(“b”|“t”|“n”|“f”|“r”|“\\”)\124; UNICODE|u ESC |八进制ESC;片段八进制ESC:“\\”(“0”…“3”)(“0”…“7”)(“0”…“7”)(“0”…“7”)(“0”…“7”)(“0”…“0”…“7”);片段UNICODE\u ESC:'\\''u'十六进制数字十六进制数字十六进制数字十六进制数字十六进制数字;开始:字符串EOF;我在解释器中键入“abc”。控制台:[19:09:44]解释…[19:09:54]解释…[19:09:54]在1:2处匹配令牌时出现问题不匹配令牌异常(97!=34)[19:09:54]在1:3处匹配令牌时出现问题NoviableException('b'@[1:1:Tokens:(WS | STRING);][19:09:54]在1:4 NoviableException时匹配令牌时出现问题('c'@[1:1:1:Tokens:(WS | STRING);][19:09:54]在1:5 NoviableException时匹配令牌时出现问题('@[()*11:12的环回:(ESC| ~('\\''\''\'\'\''.'))*)ANTLRWorks版本:1.4。当我试图从控制台用ANTLR 3.2运行解释器时,也会发生同样的情况。@Alexy,谢谢你的澄清。这个错误在ANTLRWorks 1.4.3中再次出现。或者一开始从未被修复过。
javac -cp antlr-3.2.jar *.java
java -cp .:antlr-3.2.jar Demo \"\\nabc\"
// output:                                   parsed :: "\nabc"

java -cp .:antlr-3.2.jar Demo \"abc\"
// output:                                   parsed :: "abc"