当需要其他字符时,ANTLR匹配字符?

当需要其他字符时,ANTLR匹配字符?,antlr,antlr3,Antlr,Antlr3,参见下面的语法。当我尝试解析时: String s = "UNH+message refere+APERAK:D:97A:UN\n"; 我得到以下错误: line 1:34 mismatched character '\n' expecting 'H' line 2:0 missing RDEL at '<EOF>' 我认为ANTLR确实被两个重叠的规则所混淆,这两个规则涵盖了UNH输入: 单个令牌UNH,或 三个标记的序列,类型为AN,文本分别为“U”、“N”、和“H” 我

参见下面的语法。当我尝试解析时:

String s = "UNH+message refere+APERAK:D:97A:UN\n";
我得到以下错误:

line 1:34 mismatched character '\n' expecting 'H'
line 2:0 missing RDEL at '<EOF>'

我认为ANTLR确实被两个重叠的规则所混淆,这两个规则涵盖了
UNH
输入:

  • 单个令牌
    UNH
    ,或
  • 三个标记的序列,类型为
    AN
    ,文本分别为
    “U”
    “N”
    、和
    “H”
我认为您应该修改
optField
AN
规则,将
*
移动到lexer中,如下所示:

optField : AN?;

AN : ('a'..'z' | 'A'..'Z' | '0'..'9' | ' ')+;
UNH  : 'UNH';
RDEL : '\n';
SDEL : ':';
FDEL : '+';
AN   : 'a'..'z' | 'A'..'Z' | '0'..'9' | ' ';

你的lexer看起来像这样:

optField : AN?;

AN : ('a'..'z' | 'A'..'Z' | '0'..'9' | ' ')+;
UNH  : 'UNH';
RDEL : '\n';
SDEL : ':';
FDEL : '+';
AN   : 'a'..'z' | 'A'..'Z' | '0'..'9' | ' ';
文件中的文本
'UNH'
规则成为凌驾于所有其他lexer规则之上的lexer规则

当lexer现在偶然发现
“UN”
,后面跟着的不是
“H”
,它会产生一个错误,因为lexer无处可回溯。如果您的
规则与一个以上的字符匹配,lexer可以遵循该规则,但由于它只与一个字符匹配,因此lexer不会从
“UN”
回溯


正如dasblinkenlight所建议的那样:
一个
应该匹配一个或多个字符,
optField
然后可以匹配一个可选的
一个
。但是,他(或她)答案的另一部分并不完全正确:因此我的答案是正确的。

您的修复是正确的,但答案并不完全正确:lexer不会因为三个标记而混淆:这些标记(
“U”
“N”
“H”
)不会被创建。在尝试从输入中创建一个
UNH
标记后,比如
“UNx”
(其中
“x”
不是
“H”
),lexer无处可追溯,因为
一个
匹配一个字符。@BartKiers我没有说会创建三个标记,只有一条规则可用于将字符串
UNH
解释为三个标记的序列。对我来说,“lexer无处可追溯”是一种聪明的说法“lexer被弄糊涂了”:)你说:“一系列三个标记,类型为
AN
,文本为
“U”
“N”
,和
“H”
。。。也许你的意思和我刚才说的一样,但措辞暗示了我之前的评论。@BartKiers措辞并没有暗示任何这一点,除非你断章取义:“一个单独的标记UNH,或一系列三个类型的标记AN,文本为
“U”
“N”
,和
“H”
“说明了它所说的内容,而不是“
”U“
“N”
“H”
)将被创建。对不起,让我重新措辞:“但我的措辞暗示了我之前的评论。”