在 Antlr4 C# 中,错误处理未按预期触发



在Antlr 4中,我有一个语法,它采用格式为x*Y、x+Y等的字符串

我想在使用无效运算符时捕捉错误,例如x&y如果我添加类似以下代码:

parser.RemoveErrorListeners();
parser.AddErrorListener(new MyErrorListener());

并将MyErrorListener定义为:

public class MyErrorListener : BaseErrorListener
{
    public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
    {

在X&Y情况。。。。但是将在X&案例

我非常困惑,因为控制台侦听器会显示两种形式的错误,但我的自定义形式不会。我真正想做的就是说"如果有任何类型的解析错误,就做x",但我似乎无法理解。

救命!

以下是语法的一部分btw:

equation  : boolEquation (op=(AND|OR)  boolEquation)*  ;
boolEquation : NOT? boolExpression ;
boolExpression   : 
    left=expression (op=relop right=expression)?    #BoolExpressionMatch  ;
expression   : 
      name=ID LPAREN expList=expressionList RPAREN  #FunctionMatch
      | left=expression op=(TIMES | DIV | MODULUS) right=expression # ExpressionMatch
      | left=expression op=(PLUS | MINUS) right=expression                  #ExpressionMatch
      | LPAREN expression RPAREN                                            #ParenthesizedExpressionMatch
      | atom                                                                #AtomMatch   ;
atom   : number                       #NumberMatch
   | string                     #StringMatch
   | variable                   #AtomVariableMatch
   | unaryValue                  #UnaryValueMatch
   | boolean                      #BooleanMatch   ;
string    :    ID    ;
boolean    :   TRUE    |   FALSE;
unaryValue    :  EMPTY    |  PRESENT    ;
func   : name=ID LPAREN expList=expressionList RPAREN   ;
expressionList   : (expression (COMMA expression)*)?   ;
variable   :  WORD(POINT WORD)*     #VariableMatch   ;

有趣的是,即使我删除了所有的错误侦听器,我仍然可以看到控制台的输出:行1:1令牌识别错误:"?"

在看不到语法的情况下,我只能猜测出了什么问题,但我认为你有一个接受&作为它的一部分,所以当您输入X&Y时,它被接受为令牌,因此是有效的输入。

在这种情况下,调试的第一步应该是打印出lexer看到的所有令牌的列表。参见TokenStream.getTokens()。这将显示标记是否按照您编写语法时所期望的方式进行识别。

我想明白了。本质上,问题是这是一个词汇错误,而不是语法错误。因此,替换词法分析器的ErrorListener就成功了。

相关内容

  • 没有找到相关文章

最新更新