ANTLR:必需(…)和#x2B;循环与字符处的任何内容都不匹配

ANTLR:必需(…)和#x2B;循环与字符处的任何内容都不匹配,antlr,antlr3,Antlr,Antlr3,我得到: 行n:m必需(…)+循环与字符u'#'处的任何内容都不匹配 但是解析器以0=parser.getNumberOfSyntaxErrors()结束,并生成正确的AST。进一步的检查确认lexer正在打印错误消息,该lexer抛出了一个antlr3.exceptions.EarlyExitException,该异常以某种方式从未到达解析器 此时应匹配的词汇规则是: LOCALVAR : '#' NAME_CHAR+ ; 输入中的故障点为#I) 为什么词法分析和语

我得到:

行n:m必需(…)+循环与字符u'#'处的任何内容都不匹配

但是解析器以
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)词法器一样,就像语法一样。这使它们更强大,但也不那么简单。