Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# antlr语法忽略会导致错误的字符_C#_Antlr_Grammar_Dsl - Fatal编程技术网

C# antlr语法忽略会导致错误的字符

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

我刚刚开始学习antlr语法,我想我有一个非常简单的语法。我遇到的问题是[1+2]解析为

  • 加号(+)
    • 整型文字(1)
    • 整型文字(2)
正确,这是好的,但[a1+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);
}