我得到了:
行n:m required(...)+ loop与字符u'#'
中的任何内容都不匹配
但是解析器以0 = parser.getNumberOfSyntaxErrors()
结束,并生成一个正确的AST。进一步的检查确认了词法分析器正在打印错误消息,该错误消息会抛出一个antlr3.exceptions.EarlyExitException
以某种方式永远不会到达解析器。
此时应该匹配的词汇规则是:
LOCALVAR
:
'#' NAME_CHAR+
;
输入中的失败点为#I)
。
为什么lexing和解析成功了?为什么消息有效输入?
答案 0 :(得分:0)
我解决类似问题的方法:
DOT : '.' ;
INTEGER
:
DIGITS
;
FLOAT
:
(DIGITS DOT DIGITS)=> DIGITS DOT DIGITS
;
解析以下短语时:
#J := #X(75.W)
词法分子抗议:
行n:m required(...)+ loop与字符u'W'上的任何内容都不匹配
将规则更改为:
FLOAT
:
DIGITS
(
(DOT DIGIT)=> DOT DIGITS
|
() { $type=INTEGER }
)
;
解决了问题。
问题在于,ANTLR词法分析师不是RE而是LL。