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

标签 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& 情况下调用...

我非常困惑,因为控制台监听器会显示两种形式的错误,但我的自定义形式不会。我真正想要做的就是说“如果存在任何类型的解析错误,请执行 x”,但我似乎无法弄清楚这一点。

帮助!

顺便说一句,这是语法的一部分:

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 时,它被接受为一个标记,因此有效输入。

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

关于c# - 在 Antlr4、C# 中,错误处理未按预期触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37126574/

相关文章:

java - 使用 ANTLR 树语法复制树的节点

java - ANTLR 4 中 while 循环的访问者/监听器代码

antlr4 - 解析单行注释

java - 获取导致源代码语法错误的parserRuleContexts

c# - 带破折号的 DBF 文件不起作用

c# - ASP.net 找不到连接字符串

c# - 我可以在 ValueTuple 中返回泛型类型吗?

antlr - 解决 ANTLR 词法分析器规则歧义的正确方法?

java - 我应该如何限制 ANTLR 中 ID token 的长度?

c# - 在 C# 7 中创建一个 System.ValueTuple 数组