在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行令牌识别错误:'?'
答案 0 :(得分:0)
没有看到你的语法,我只能猜出错了,但我认为你有一个接受&的规则。作为它的一部分,所以当你输入X&Y
时,它被接受为一个标记,因此是有效的输入。
在这种情况下,调试的第一步应该是打印出词法分析器看到的所有标记的列表。见TokenStream.getTokens()
。这将向您显示在您编写语法时是否按照您期望的方式识别令牌。
答案 1 :(得分:0)
我明白了。本质上,问题是它是一个词法错误,而不是语法错误。因此,替换词法分析器的错误监听器就可以了。