我有一个语法,它接受每行出现一个的键/值对。这些值可以是多行的。
Eclipse 插件 ANTLR IDE 工作正常并接受有效的测试字符串。但是,生成的 Java 不接受相同的字符串。
这是语法:
message: block4 ;
block4: STARTBLOCK '4' COLON expr4+ ENDBLOCK ;
expr4: NEWLINE (COLON key COLON expr | '-')+;
key: FIELDVALUE* ;
expr: FIELDVALUE* ;
NEWLINE : ('\n'|'\r') ;
FIELDVALUE : (~('-'|COLON|ENDBLOCK|STARTBLOCK))+;
COLON : ':' ;
STARTBLOCK : '{' ;
ENDBLOCK : '}' ;
ANTLR IDE 正确解析:
不要眯着眼睛...它正在划分键/表达式对,无论它们是单行值(如 23B / CRED)还是多行值(如 59 / /13212312\r\nRECEIVER NAME SA\r\n)。
这是输入字符串:
{4:
:20:007505327853
:23B:CRED
:32A:050902JPY3520000,
:33B:JPY3520000,
:50K:EUROXXXEI
:52A:FEBXXXM1
:53A:MHCXXXJT
:54A:FOOBICXX
:59:/13212312
RECEIVER NAME S.A
:70:FUTURES
:71A:SHA
:71F:EUR12,00
:71F:EUR2,34
-}
Eclipse 在语法上运行 anltr-3.4-complete.jar 时,会生成 SwiftTinyLexer.java 和 SwiftTinyParser.java。词法分析器将它们词法分析为 35 个标记,首先是:
- 起始块
- 4
- 冒号
- 字段值
- 冒号
我希望令牌 4 成为 expr4 而不是 FIELDVALUE(IDE 似乎同意我的看法)。但由于它是一个 FIELDVALUE,解析器会用line 1:3 required (...)+ loop did not match anything at input '\r\n'
.
为什么 anltr 3.4 和 ANTLR IDE 2.1.2.201108281759 lex 相同字符串的方式有区别?
有没有办法修复语法,使其在匹配 FIELDVALUE 之前匹配 expr4?