0

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

4

2 回答 2

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,我仍然有点失望,但语法并没有像它应该的那样破坏。

于 2013-10-23T11:12:06.547 回答
0

'a' 是一个无效字符,所以你应该得到一个标记化错误。解析器不会看到它。三

于 2013-10-21T19:43:21.793 回答