ANTLR:必需(…)和#x2B;循环与字符处的任何内容都不匹配
我得到: 行n:m必需(…)+循环与字符u'#'处的任何内容都不匹配 但是解析器以ANTLR:必需(…)和#x2B;循环与字符处的任何内容都不匹配,antlr,antlr3,Antlr,Antlr3,我得到: 行n:m必需(…)+循环与字符u'#'处的任何内容都不匹配 但是解析器以0=parser.getNumberOfSyntaxErrors()结束,并生成正确的AST。进一步的检查确认lexer正在打印错误消息,该lexer抛出了一个antlr3.exceptions.EarlyExitException,该异常以某种方式从未到达解析器 此时应匹配的词汇规则是: LOCALVAR : '#' NAME_CHAR+ ; 输入中的故障点为#I) 为什么词法分析和语
0=parser.getNumberOfSyntaxErrors()
结束,并生成正确的AST。进一步的检查确认lexer正在打印错误消息,该lexer抛出了一个antlr3.exceptions.EarlyExitException
,该异常以某种方式从未到达解析器
此时应匹配的词汇规则是:
LOCALVAR
:
'#' NAME_CHAR+
;
输入中的故障点为#I)
为什么词法分析和语法分析成功了?为什么在有效输入上显示此消息?我对类似问题的解决方案:
DOT : '.' ;
INTEGER
:
DIGITS
;
FLOAT
:
(DIGITS DOT DIGITS)=> DIGITS DOT DIGITS
;
在分析以下短语时:
#J := #X(75.W)
lexer抗议:
行n:m必需(…)+循环与字符u'W'处的任何内容都不匹配
将规则更改为:
FLOAT
:
DIGITS
(
(DOT DIGIT)=> DOT DIGITS
|
() { $type=INTEGER }
)
;
解决了这个问题
部分问题是,ANTLR lexer不是RE而是LL。lexer可能会恢复。真的很难评论而无法复制它。你能发布一个吗?试着调用
lexer.getNumberOfSyntaxErrors()
。也许lexer会按照Bart的建议恢复,但仍将其视为一个错误。Loring Cryamer在(消失)列表中的回答很有帮助:“……但是在查看下一个字符后,“X”被删除。这没有留下任何替代方案,因此DFA报告失败,而您得到的是“没有可行的alt”“例外。这可能是固定的——至少在理论上是这样——但需要大量额外的分析来完善DFA。[…]噩梦案例是区分关键词和标识符;将一个字母附加到关键字后,它将不再被识别为关键字或标识符。为了避免这种情况,有必要将关键字识别为标识符规则中的特殊情况。“注意,ANTLR词法器的行为不像regexp词法器,而是像LL(k)词法器一样,就像语法一样。这使它们更强大,但也不那么简单。