【发布时间】:2012-08-13 14:22:21
【问题描述】:
我有一个语法,它接受每行出现一个的键/值对。这些值可以是多行的。
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 S.A\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?
【问题讨论】:
-
您是否检查过 ANTLR IDE 是否使用 ANTLR 3.4?我的猜测是它使用了不同的版本。
-
我去了 Preferences -> ANTLR -> Builder,它使用的是 ANTLR Parser Generator 版本 3.4。
-
好的,我有一个可行的假设。 IDE 输入采用单个 \n,而 Java 测试代码正在生成 \r\n。使用
('\n'|'\r')+向 NEWLINE 添加“1 或更多”可使解析继续进行而不会出现词法错误。 -
@rajha9 如果您想通了,请将解决方案发布为 Answer,然后返回并使用复选标记选择它,以便将来的用户能够找到它!