2016-04-05 8 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 _won't_それはトークンを破棄し始めますか? あなたは正しいので、私はエラー(1)があることを覚えておきたいが、私はトークンを破棄したくない。 私はトークンを破棄したいと思ったら、私は何をしますか? (1)yyerrorにグローバルフラグを設定するコードを追加しました。そのフラグがセットされていれば、私は出力を生成しません。 –

+0

D'oh!もちろん、yyerrorを呼び出すことはシンタックスレコグナイザには何もしません。本文はエラーメッセージを生成する単なるprintfです... –

関連する問題