当需要其他字符时,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”
)将被创建。对不起,让我重新措辞:“但我的措辞暗示了我之前的评论。”