Ich schreibe ein Programm in YACC und C/C++. Es analysiert eine ziemlich einfache Grammatik und speichert die Ergebnisse in einigen Tabellen.YACC: Kann ich "Syntaxfehler" aus meiner "semantischen" Verarbeitung generieren?
Ich habe Regeln wie
room: DOTR ID roomname { AddRoom($3, $2); };
und der Code für AddRoom ist:
void AddRoom(const char* name, const char* id)
{
theRoom = (void)new GameRoom(name, id);
if (!theGame->addRoom(theRoom)) {
?????
}
}
???? wäre wo ich Code einfügen würde, um einen Syntaxfehler zu erzeugen (hoffe ich).
Der Zweck dieses Codes ist, dass jedes Objekt im Spiel (Räume, Türen, NPCs, Dinge) eine eindeutige ID hat. Wenn theGame->addRoom
erkennt, dass die ID nicht eindeutig ist, wird false zurückgegeben, und ich möchte, dass yacc an dieser Stelle in der Eingabe eine Fehlermeldung anzeigt - als ob ein illegales Token dort gewesen wäre.
Danke. Dies beantwortet meine Frage. Uhh ... wenn ich alle yyerror, dass _won't es beginnen, Token zu verwerfen? Weil du recht hast, möchte ich daran denken, dass ich einen Fehler hatte (1), aber ich möchte Token nicht verwerfen. Nur aus Neugier, was würde ich tun, wenn ich _wanted_ wollte Token zu verwerfen? (1) Ich habe Code zu yyerror hinzugefügt, um eine globale Flagge zu setzen. Wenn dieses Flag gesetzt ist, werde ich die Ausgabe nicht erzeugen. –
D'oh! Natürlich wird der Aufruf von yyerror dem Syntaxerkenner nichts anhaben: Der Body ist nur ein Printf, um die Fehlermeldung zu erzeugen ... –