1

我有一个语法,它接受每行出现一个的键/值对。这些值可以是多行的。

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 正确解析: SwiftTiny 解析树

不要眯着眼睛...它正在划分键/表达式对,无论它们是单行值(如 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 个标记,首先是:

  1. 起始块
  2. 4
  3. 冒号
  4. 字段值
  5. 冒号

我希望令牌 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?

4

1 回答 1

0

IDE 输入字符串有一个\n,而 Java 测试代码是 Windows 样式的\r\n

我通过添加“1 或更多”来更改 NEWLINE,即

NEWLINE    : ('\n'|'\r') ;

NEWLINE    : ('\n'|'\r')+ ;

这使得解析继续进行而没有词法错误,现在为什么 IDE 的行为与生成的 Java 不同是有道理的:它们得到的输入字符串略有不同。

于 2012-08-13T17:21:59.080 回答