在使用我的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,不确定这是否与此相关,因为使用“选项”将此规则设置得更高似乎没有任何区别。
我错过了什么?