在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情况。。。。但是将在X&案例
我非常困惑,因为控制台侦听器会显示两种形式的错误,但我的自定义形式不会。我真正想做的就是说"如果有任何类型的解析错误,就做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令牌识别错误:"?"
在看不到语法的情况下,我只能猜测出了什么问题,但我认为你有一个接受&作为它的一部分,所以当您输入X&Y
时,它被接受为令牌,因此是有效的输入。
在这种情况下,调试的第一步应该是打印出lexer看到的所有令牌的列表。参见TokenStream.getTokens()
。这将显示标记是否按照您编写语法时所期望的方式进行识别。
我想明白了。本质上,问题是这是一个词汇错误,而不是语法错误。因此,替换词法分析器的ErrorListener就成功了。