【问题标题】:Antlr generated Java doesn't match Antlr IDEAntlr 生成的 Java 与 Antlr IDE 不匹配
【发布时间】: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 个标记,开头为:

  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?

【问题讨论】:

  • 您是否检查过 ANTLR IDE 是否使用 ANTLR 3.4?我的猜测是它使用了不同的版本。
  • 我去了 Preferences -> ANTLR -> Builder,它使用的是 ANTLR Parser Generator 版本 3.4。
  • 好的,我有一个可行的假设。 IDE 输入采用单个 \n,而 Java 测试代码正在生成 \r\n。使用 ('\n'|'\r')+ 向 NEWLINE 添加“1 或更多”可使解析继续进行而不会出现词法错误。
  • @rajha9 如果您想通了,请将解决方案发布为 Answer,然后返回并使用复选标记选择它,以便将来的用户能够找到它!

标签: antlr grammar


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多