在Antlr4,C#中,错误处理没有按预期被触发

时间:2016-05-09 22:41:17

标签: c# antlr antlr4

在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情况下没有调用SyntaxError ....但是会在X& Y中调用它。情况下...

我很困惑,因为控制台监听器会显示两个表单的错误,但我的自定义不会。我真正希望能做的就是说“如果有任何类型的解析错误,请执行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行令牌识别错误:'?'

2 个答案:

答案 0 :(得分:0)

没有看到你的语法,我只能猜出错了,但我认为你有一个接受&的规则。作为它的一部分,所以当你输入X&Y时,它被接受为一个标记,因此是有效的输入。

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

答案 1 :(得分:0)

我明白了。本质上,问题是它是一个词法错误,而不是语法错误。因此,替换词法分析器的错误监听器就可以了。