10 Stimmen

bison/flex: Druck einer fehlerhaften Zeile

Ich verwende Bison+Flex zum Parsen der Datei. Bei einem Fehler wird yyerror() aufgerufen. Wie kann ich die Zeilennummer oder die Zeichenkette ermitteln, die gegen die Regeln verstößt, um sie zusammen mit der Fehlermeldung auszugeben?

9voto

David Hammen Punkte 31452

Die Zeilennummer ist einfach: yylineno ist die Zeilennummer. Angeben %option yylineno am Anfang Ihrer .l-Datei.

Na ja, fast einfach. Lookahead kann manchmal dazu führen, dass die Zeilennummer um eins falsch ist. Anstatt etwas wie "Fehler trat in Zeile #xxx auf" zu sagen, sollten Sie vielleicht sagen, dass der Fehler in der Nähe von Zeile #xxx aufgetreten ist.

Was den Rest betrifft, so liegt es an Ihnen. Sie müssen die nicht ganz gültige Syntax erfassen und den entsprechenden Warn- oder Fehlerhandler aufrufen. Einzelheiten finden Sie im O'Reilly-Buch "flex & bison"; es enthält ein ganzes Kapitel über Fehlermeldungen. Ein ganzes Kapitel ist etwas zu umfangreich, um es auf dieser Q&A-Seite wiederzugeben.

5voto

GriffinHeart Punkte 450

yylineno gibt Ihnen die zu bearbeitenden Leinen an

Sie können dem Benutzer auch mitteilen, welcher Text den Fehler verursacht hat, indem Sie yytext in der Flex-Seite verwenden:

0|([1-9]{DIG}*)    {
                    String msg("some error with number: "); msg.append(yytext);
                    yyerror(msg.c_str());
                   }

yytext enthält nur den Text für die übereinstimmende Regel.

Wenn Sie die gesamte Zeile angeben möchten, müssen Sie dies selbst tun, indem Sie die Datei öffnen und nach der Zeilennummer suchen yylineno und zu drucken, ist eine gute Möglichkeit, dies zu tun, indem Sie Ihre eigene Implementierung von yyerror Funktion.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X