请参阅下面的语法。当我尝试解析:当其他字符需要优先时ANTLR匹配字符?
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>'
这没有意义对我来说,因为它似乎是在寻找UNH遇到之前\ n,这将不遵循'文件'规则。
grammar Aperak;
options {
language = Java;
}
@header { package test.fixed.aperak; }
@lexer::header { package test.fixed.aperak; }
file returns [String result]: 'UNH' unh01 unh02 RDEL { $result = $unh01.text + " -- " + $unh02.text; };
unh01 : FDEL optField;
unh02 : FDEL unh02x1 unh02x2 unh02x3 unh02x4 (unh02x5)?;
unh02x1 : optField;
unh02x2 : SDEL optField;
unh02x3 : SDEL optField;
unh02x4 : SDEL optField;
unh02x5 : SDEL optField;
optField : AN*;
RDEL : '\n';
SDEL : ':';
FDEL : '+';
AN : 'a'..'z' | 'A'..'Z' | '0'..'9' | ' ';
你的修正是正确的,但答案并不完全正确:词法分析器不会因为三个标记而感到困惑:这些标记(“U”,“N”,“H”)将会不会被创建。在尝试从输入'UNx'(其中'“x”是除“H”之外的任何其他输入)创建一个'UNH'标记后,词法分析器无处可回,因为'AN'匹配单个字符。 – 2012-01-10 08:43:00
@BartKiers我没有说三个标记*会被创建,只是有一个规则可以用来将字符串UNH解释为三个标记的序列。对我来说,“词法分析器无处可回”是一种明智的方式来说“词法分析器变得困惑”:) – dasblinkenlight 2012-01-10 12:20:48
你说:*“一个由三个”AN“类型的标记组成的序列,其中带有”U“ ,''N“',和'”H“'”* ...或许你的意思是我刚才所说的,但措辞表明了我之前评论的内容。 – 2012-01-10 12:42:42