2013-10-21 33 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