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