2013-10-21 13 views
0

我刚刚进入antlr语法,我以为我有一个非常简单的。我遇到的问题是这种[1 + 2]解析到antlr语法忽略应该导致错误的字符

  • PLUS(+)
    • 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 ::成员{ 公共覆盖无效DisplayRecognitionError(串[] tokenNames, RecognitionException E){ 串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

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

+0

我是新来的整个antlr事物和DSl创造一般。我在哪里可以看到分词器错误? – CodeHulk

+0

我查看了词法分析器和解析器上的NumberOfSyntaxErrors属性,它们都为0。我也重载了DisplayRecognitionError方法,但是我没有从中得到任何结果。 – CodeHulk

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,但语法没有断像它应该。

+0

难道你是在混合词法分析器和分析器的概念吗?您在扫描时未定义任何回退规则 - 即当字符与任何有效规则不匹配时会发生什么情况?我不知道ANTLR在这种情况下做了什么,但我想这是你的问题。 – greenoldman