C# antlr语法忽略会导致错误的字符
我刚刚开始学习antlr语法,我想我有一个非常简单的语法。我遇到的问题是[1+2]解析为C# antlr语法忽略会导致错误的字符,c#,antlr,grammar,dsl,C#,Antlr,Grammar,Dsl,我刚刚开始学习antlr语法,我想我有一个非常简单的语法。我遇到的问题是[1+2]解析为 加号(+) 整型文字(1) 整型文字(2) 正确,这是好的,但[a1+2]也解析为 加号(+) 整型文字(1) 整型文字(2) 而不是像我预料的那样给我一个错误 提前谢谢 grammar MyExpressions; options { language=CSharp3; TokenLabelType=CommonToken; ASTLabelType=Common
- 加号(+)
- 整型文字(1)
- 整型文字(2)
- 加号(+)
- 整型文字(1)
- 整型文字(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::成员{
public override void DisplayRecognitionError(字符串[]标记名,
认可例外(e){
字符串hdr=GetErrorHeader(e);
string msg=GetErrorMessage(e,tokenNames)
SyntaxException是我为应用程序创建的自定义异常。'a'是无效字符,因此您应该得到一个标记化错误。解析器将看不到它。
Ter我发现了发生了什么。当您使用@members构造时,它会将代码添加到解析器中,但不会添加到lexer。您必须像@lexer::members这样为它添加前缀。一旦我正确地生成了lexer
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,但语法并没有像它应该的那样被破坏。我对整个antlr和DSl的创建都是新手。我在哪里会看到标记器错误?我查看了lexer和解析器上的NumberOfSyntaxErrors属性,它都有0。我还重载了DisplayRecognitionError方法,但我没有从中得到任何结果。可能是您混合了lexer和parser的概念吗?您在扫描时没有定义任何回退规则,即当字符与任何有效规则不匹配时会发生什么?我不知道ANTLR在这种情况下会做什么,但我想这是您的问题相对长度单位。
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);
}