antlr语法忽略应该导致错误的字符

时间:2013-10-21 17:40:57

标签: c# antlr grammar dsl

我刚刚进入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是我为我的应用程序创建的自定义异常。

2 个答案:

答案 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'是一个无效字符,所以你应该得到一个标记化错误。解析器不会看到它。 叔