我刚刚进入antlr语法,我认为我有一个非常简单的语法。我遇到的问题是[1 + 2]解析为
正确哪个好,但[a1 + 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是我为我的应用程序创建的自定义异常。
答案 0 :(得分:1)
我发现了发生了什么事。当您使用@members构造时,它会将代码添加到解析器,但不会添加到词法分析器。你必须像@lexer :: members一样加前缀。一旦我做了正确生成的词法分析器。
public override void DisplayRecognitionError(string[] tokenNames,
RecognitionException e) {
string hdr = GetErrorHeader(e);
string msg = GetErrorMessage(e, tokenNames);
// Now do something with hdr and msg...
System.Console.WriteLine("Header: " + hdr);
System.Console.WriteLine("Message: " + msg);
throw new System.Exception("Syntax Error: " + hdr + " " + msg);
}
我仍然有点被抛弃,因为NumberOfSyntaxErrors计数仍显示为0,但语法并没有像它应该的那样破坏。
答案 1 :(得分:0)
'a'是一个无效字符,所以你应该得到一个标记化错误。解析器不会看到它。 叔