我刚刚进入antlr语法,我以为我有一个非常简单的。我遇到的问题是这种[1 + 2]解析到antlr语法忽略应该导致错误的字符
- PLUS(+)
- 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 ::成员{ 公共覆盖无效DisplayRecognitionError(串[] tokenNames, RecognitionException E){ 串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是我为我的应用程序创建的自定义异常。
我是新来的整个antlr事物和DSl创造一般。我在哪里可以看到分词器错误? – CodeHulk
我查看了词法分析器和解析器上的NumberOfSyntaxErrors属性,它们都为0。我也重载了DisplayRecognitionError方法,但是我没有从中得到任何结果。 – CodeHulk