Antlr生成的Java不';t匹配Antlr IDE

Antlr生成的Java不';t匹配Antlr IDE,antlr,grammar,Antlr,Grammar,我有一个语法,它接受每行显示一个键/值对。这些值可以是多行的 Eclipse插件ANTLR IDE工作正常,并接受有效的测试字符串。但是,生成的Java不接受相同的字符串 以下是语法: message: block4 ; block4: STARTBLOCK '4' COLON expr4+ ENDBLOCK ; expr4: NEWLINE (COLON key COLON expr | '-')+; key: FIELDVALUE* ; expr: FIELDV

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

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\n接收方名称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。lexer将它们lexe成35个令牌,首先是:

  • 起始块
  • 四,
  • 结肠
  • 字段值
  • 结肠
  • 我希望令牌4是一个expr4而不是一个FIELDVALUE(IDE似乎同意我的观点)。但是,由于它是一个字段值,解析器在该标记上阻塞,
    行1:3 required(…)+循环与输入“\r\n”
    处的任何内容都不匹配

    为什么anltr 3.4和ANTLR IDE 2.1.2.201108281759使用相同字符串的方式不同


    是否有方法修复语法,使其在匹配字段值之前匹配expr4?

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

    我通过添加“1或更多”来更改换行符,即

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


    这使得解析可以在没有词法错误的情况下进行,现在可以理解为什么IDE的行为与生成的Java有所不同:它们得到的输入字符串略有不同。

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