如何使一个ANTLR3 VBScript解析器看到'& htmlTag'作为两个标记?

时间:2015-07-04 12:19:13

标签: vbscript antlr antlr3

在使用我的ANTLR3解析器解析VBScript代码时,我发现它处理除

之外的所有内容
x = y &htmlTag

这段代码显然是“x = y& htmlTag”。 (我,我用任何语言在运算符周围放置空格,但我解析的代码不是我的。)词法分析器应该找到最长的字符串,它是一个有效的标记,对吧?所以这应该可以正常工作:由于'& h'后面没有产生十六进制文字的文本,因此词法分析者应该确定这不是十六进制文字,最长的有效标记是运算符'&'。后跟一个标识符。

但如果我的语法说:

HexOrOctalLiteral :
    (   ( AMPERSAND H HexDigit ) => AMPERSAND H HexDigit+
    |   ( AMPERSAND O OctalDigit ) => AMPERSAND O OctalDigit+
    )
    AMPERSAND?
    ;
ConcatenationOperator: AMPERSAND;
fragment AMPERSAND   : '&';
fragment HexDigit    : Digit | A | B | C | D | E | F;
fragment OctalDigit  : '0' .. '7';
fragment H           : 'h' | 'H';

我的解析器抱怨:在处理'& htmlTag'时,必需(...)+循环与字符'h'处的任何内容都不匹配。似乎lexer已经确定它已经找到了HexOrOctalLiteral并且将不再考虑concat运算符。我的语法有k = 1,不确定这是否与此相关,因为使用“选项”将此规则设置得更高似乎没有任何区别。

我错过了什么?

0 个答案:

没有答案