2016-04-05 33 views
-1

我在YACC和C/C++中編寫程序。它解析一個相當簡單的語法並將結果存儲在一些表中。YACC:我可以從我的「語義」處理中生成「語法錯誤」嗎?

我有一個像

room: DOTR ID roomname { AddRoom($3, $2); }; 

和AddRoom代碼規則:

void AddRoom(const char* name, const char* id) 
{ 
    theRoom = (void)new GameRoom(name, id); 
    if (!theGame->addRoom(theRoom)) { 
     ????? 
    } 
} 

????我會插入代碼來生成語法錯誤(我希望)。

此代碼的目的是遊戲中的每個對象(房間,門,NPC,東西)都有唯一的ID。如果theGame->addRoom檢測到ID不唯一,它將返回false,並且我希望yacc在輸入的那一點顯示一條錯誤消息 - 就像非法令牌已經存在一樣。

回答

1

只需撥打電話yyerror(),並記住有錯誤,所以您不會進入後期階段。但你不是想把這當作一個語法錯誤:否則你會導致解析器開始丟棄令牌等。

+0

謝謝。這回答了我的問題。 呃......如果我所有的yyerror都不會讓它開始丟棄令牌? 因爲你是對的,我想記住我有一個錯誤(1),但我不想放棄令牌。 只是出於好奇,如果我_wanted_開始丟棄令牌,我該怎麼辦? (1)我將代碼添加到yyerror以設置全局標誌。如果該標誌被設置,我將不會生成輸出。 –

+0

D'oh!當然調用yyerror不會對語法識別器做任何事情:body只是一個printf來產生錯誤信息... –