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?
Antworten
Zu viele Anzeigen?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.
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.