2012-06-20 69 views
1

我有一個antlr的問題。 我有以下簡單的語法:解析ANTLR錯誤

grammar bxk; 
options 
{ 
    language=CSharp3; 
} 

// start rule 
start 
    : root* EOF 
    ; 


root 
    : ROOT_ID CT_ID ((rd=rootDefinition) | END) 
    ; 


rootDefinition 
    : '{' 
     ('scope' ASSIGN s=STRING END)? 
     ('major' ASSIGN i=STRING END)? 
     ('minor' ASSIGN i=STRING END)? 
     ('revision' ASSIGN i=STRING END)? 
     '}' 
    ; 

CHAR : ('a'..'z'|'A'..'Z') ; 
ROOT_ID : 'ROOT_'(CHAR | DIGIT | SPECIAL)+ ; 
CT_ID : 'ct_'(CHAR | DIGIT | SPECIAL)+ ; 
DIGIT : '0'..'9'; 
SPECIAL : '_' ; 
END : ';'; 
STRING : CHAR (CHAR | DIGIT | SPECIAL)*; 
WS  : (' '|'\t' | '\n' | '\r' | '\u000C')+ {Skip();} ; 

就是這樣。現在,當我生成C#代碼,我有幾個錯誤: funktion'開始'是私人的,我必須永遠改變公共。 此外,當我改變公衆和將解析follwing:

ROOT_base ct_s { 
scope=aliejfoac; 
} 

Internaly的NoViableAltException發生。 如果我在分號後面添加一個空格,它將正常運行。但我只能在Visual Studio中看到Debbug模式中的異常。

另一個問題,我有ist syntay錯誤不顯示。我添加了:

catch [RecognitionException re] { 
    ReportError(re); 
    throw new Exception(re.ToString() + "\non line " + re.Line + " and row " + re.CharPositionInLine.ToString()); 
} 

現在,如果發生語法錯誤,將會顯示一個異常。

最後我遇到了問題Skip()。當我寫它Skip()它適用於生成的代碼,而不是解釋器。當我寫skip()它只適用於解釋器而不是生成的代碼。

任何人都可以幫我解決我的問題嗎?

回答

0

user1469116寫道:

的的Funktion '開始' 是私人的,我必須改變公衆。

所有規則在C#目標中都是默認私有的。明確地把它公開在您的入口點規則的前面添加關鍵字public

public start 
: root* EOF 
; 

user1469116寫道:

Internaly的NoViableAltException發生。如果我在分號後面添加一個空格,它會正常運行。

如果我添加規則:

ASSIGN : '='; 

我可以成功地解析您的輸入。 ANTLRWorks'調試程序對其進行解析如下:

enter image description here

user1469116寫道:

最後我有跳過這個問題()。當我將它寫入Skip()時,它會與生成的代碼一起使用,而不是與解釋器一起使用。當我編寫skip()時,它僅適用於解釋器,而不適用於生成的代碼。

解釋器(來自ANTLRWorks,我假設)忽略語法的選項部分內的所有內容,並且是基於Java的。並且Java目標僅「知道」skip(),而C#目標僅「知道」Skip()方法。

+0

感謝您的幫助。哦,我有forgott編寫的ASSIGN令牌。但它仍然不起作用。只有在我添加空間後。 – user1469116

+0

@ user1469116,就像我說的:用Java測試它,我無法重現這一點。問題可能在於Visual Studio插件或C#目標(我無法幫到你)。 –