我刚刚进入 antlr 语法,我以为我有一个非常简单的语法。我遇到的问题是这个 [1+2] 解析为
- 加号 (+)
- INT_LITERAL (1)
- INT_LITERAL (2)
正确,这很好,但 [a1+2] 也解析为
- 加号 (+)
- INT_LITERAL (1)
- INT_LITERAL (2)
而不是像我期望的那样给我一个错误。
提前致谢。
grammar MyExpressions;
options {
language=CSharp3;
TokenLabelType=CommonToken;
ASTLabelType=CommonTree;
output=AST;
k=10;
}
@lexer::namespace{Expressions}
@parser::namespace{Expressions}
/*
* Parser Rules
*/
public root: LBRACKET! expression^ RBRACKET!;
expression: binaryOperation;
binaryOperation: (term PLUS^ term);
term: INT_LITERAL;
/*
* Lexer Rules
*/
PLUS: '+';
LBRACKET: '[';
RBRACKET: ']';
INT_LITERAL: '1'..'9'+;
WS: ' ';
我通过将它添加到我的语法来解决这个问题:@lexer::members { public override void DisplayRecognitionError(string[] tokenNames, RecognitionException e) { string hdr = GetErrorHeader(e); string msg = GetErrorMessage(e, tokenNames);
throw new SyntaxException(hdr,msg);
}
}
@parser::members {
public override void DisplayRecognitionError(string[] tokenNames,
RecognitionException e) {
string hdr = GetErrorHeader(e);
string msg = GetErrorMessage(e, tokenNames);
throw new SyntaxException(hdr,msg);
}
}
SyntaxException 是我为我的应用程序创建的自定义异常。