gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:00:15 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com