2013-02-13 70 views
1

我看答案How to get ANTLR 3.2 to exit upon first error?這是有幫助的。ANTLR語法 - 如何添加成員覆蓋錯誤處理

不過,我似乎無法在沒有我的語法嚇壞了添加這些「@」的規則。我的語法文件很簡單:

grammar Exp; 
options { 
output=AST; 

} 

program 
    : includes decls (procedure)* main -> ^(SMALLCPROGRAM includes decls (procedure)* main) //AST - PROGRAM root 
    ; 

    //Lexer and Parser rules continue below as normal..tested thoroughly and works 

但是,如果我嘗試添加任何這些@規則,我得到的錯誤,如:

grammar file Exp.g has no rules 

和:

Exp.g:0:1: syntax error: assign.types: org.antlr.runtime.EarlyExitException 

org\antlr\grammar\v3\DefineGrammarItemsWalker.g: node from line 202:4 required (...)+ loop did not match anything at input ';' 

任何人都有一個想法是什麼問題?我只是想改變我的語法,這樣當我從單獨的主類(使用ANTLRStringStream等將輸入傳入它)中運行它時,它實際上會在出現語法問題時在主類中引發錯誤,而不僅僅是說類似:

line 1:57 missing RPAREN at '{'  

在繼續解析其餘的輸入罰款之前。最終,我的主類應該拒絕解析由我的語法定義的任何語法錯誤的輸入,並應將錯誤報告給用戶。

回答

2

你可能有部分/塊正確的順序。要確保它看起來像這樣:

grammar Exp; 

options { 
    ... 
} 

tokens { 
    ... 
} 

@parser::header { 
    ... 
} 

@lexer::header { 
    ... 
} 

@parser::members { 

    ... 
} 

@lexer::members { 
    ... 
} 

我猜你放置一個@member@header部分tokens { ... }塊之前。 tokens { ... }應該在options { ... }之後直接進入

我還可以記得一定3.x版(S)曾與空部分的問題:確保沒有在所有部分至少東西,否則忽略空段。

+0

謝謝。有效。我在另一個問題的覆蓋中添加了,我的主類現在可以捕獲異常。然而拋出的異常是不是非常豐富: MismatchedTokenException異常(18 = 49!) 我怎樣才能得到: 線在1:57缺少RPAREN '{' 消息?有沒有辦法從覆蓋中「提取」它或以不同的方式來覆蓋? – Awoken 2013-02-14 18:56:06

+0

@Awoken,這裏沒有銀彈。檢查異常,進行相應的轉換並從異常中提取想要的信息。儘管如此,我們不要將這些小型評論框用於廣泛的問答。 – 2013-02-14 19:08:45