2017-01-20 4 views
1

Diese Überprüfung Datei ist mein html.l:C mit Bison + Flex für Regeln

DOC_START  "<html>"|"<HTML>" 
DOC_END   "</html>"|"</HTML>" 
SPACE   " " 
TEXT   . 
%% 
%% 

Das ist mein html.y:

%{ 
#include "lex.yy.c" 
%} 

%% 
Doc   : DOC_START Other DOC_END 
Other  : TEXT 
      | SPACE 
%% 

Dies ist meine HTML-Datei:

<HTML> 
foo bar 
</HTML> 

Ich kompiliere zuerst Flex-Datei, nach Bison-Datei. Es gibt has no rules Fehler. Ich möchte überprüfen, ob diese Datei eine ordnungsgemäße HTML-Datei wie in Doc Anweisung beschrieben. Und es wird erwartet, dass ein Fehler oder eine Nachricht an stdout gegeben wird. Was müssen wir tun?

+0

So erlauben Sie nicht '' Tags?Zugegeben, nur sadistische Leute werden diese Art von Groß- und Kleinbuchstaben in eine HTML-Datei einfügen, aber sollten Sie es trotzdem erlauben? –

+0

@ JonathanLeffler was ist besser, um es zu beschreiben? Kannst du helfen? –

+1

'DOC_START" <[hH] [tT] [mM] [lL]> "? –

Antwort

5

Sie haben die Spezifikation für ein Lex-Programm nicht wie in der manual gezeigt befolgt.

Obwohl Sie einige reguläre Ausdrücke angegeben und ihnen Namen gegeben haben (im Abschnitt Definitionen), haben Sie lex nicht gesagt, was zu tun ist, wenn es etwas findet (im Abschnitt Regeln, den Sie leer gelassen haben). Fügen Sie einen Abschnitt Regeln, die ein Token zurückgibt, wie folgt aus:

DOC_START  "<html>"|"<HTML>" 
DOC_END   "</html>"|"</HTML>" 
SPACE   " " 
TEXT   . 
%% 
{DOC_START}  return DOC_START; 
{DOC_END}  return DOC_END; 
{SPACE}   return SPACE; 
{TEXT}   return TEXT; 
%% 

Ihr Bison Code nicht specified the tokens that are coming from lex hat, so müssen Sie diese hinzufügen:

%{ 
#include "lex.yy.c" 
%} 
%token DOC_START DOC_END TEXT SPACE 
%% 
Doc   : DOC_START Other DOC_END 
Other  : TEXT 
      | SPACE 
%% 

jedoch, wenn Sie es auf diese Weise tun die lex Code wird vor den Token-Deklarationen kompiliert. Um dies zu beheben, setzen Sie die am Ende der Datei enthalten:

%token DOC_START DOC_END TEXT SPACE 
%% 
Doc   : DOC_START Other DOC_END 
Other  : TEXT 
      | SPACE 
%% 
#include "lex.yy.c" 

Fast dort ...

nun auf eine Fehlermeldung ausgeben, müssen wir Code für die yyerror Funktion zur Verfügung zu stellen. Sie wollten, dass der Ausgang zu stdout geht; wir werden die Standard-IO-Bibliothek stdio.h dafür brauchen:

%{ 
#include <stdio.h> 

void yyerror(const char* s); 

%} 
%token DOC_START DOC_END TEXT SPACE 
%% 
Doc   : DOC_START Other DOC_END 
Other  : TEXT 
      | SPACE 
%% 

void yyerror(const char* s) 
{ 
fprintf(stdout, "Syntax error: %s\n", s); 
} 

#include "lex.yy.c" 

Jetzt merke ich, dass Ihr Compiler den C99-Standard folgt und Warnungen auf implicit-function-declarations Ausgabe. Die Tools flex und bison generieren manchmal Code, der diese Warnungen verursacht. Dies sind nur Warnungen und nicht Fehler und können ignoriert werden. Wenn Sie sie nicht sehen wollen, können Sie die Option -ansi auf Ihre gcc Kompilierzeile setzen.

Sie Code wird jetzt ausgeführt - ich habe es getestet.

Wenn Sie immer Fehler wie Haupt nicht definiert sind, haben Sie nicht die yacc Bibliothek geliefert (ly auf der gcc-Linie), aber man konnte nur Ihr eigenes Hauptprogramm abtippen:

%{ 
#include <stdio.h> 

void yyerror(const char* s); 

%} 
%token DOC_START DOC_END TEXT SPACE 
%% 
Doc   : DOC_START Other DOC_END 
Other  : TEXT 
      | SPACE 
%% 

void yyerror(const char* s) 
{ 
fprintf(stdout, "Syntax error: %s\n", s); 
} 

int main (void) 
{ 
return(yyparse()); 
} 
#include "lex.yy.c" 

Jetzt werden Sie sehen, dass es kompiliert und ausgeführt wird, aber jede HTML-Datei wird Ihnen einen Syntaxfehler geben. Dies liegt daran, dass deine Bison-Grammatik nicht korrekt ist. Sie haben nur ein einzelnes Leerzeichen oder ein einzelnes Zeichen in einer HTML-Datei erlaubt (nicht eine Folge davon). Wenn Sie dieses Problem nicht lösen können, müssen Sie eine andere Frage stellen - oder noch besser Ihre Klassennotizen lesen!

+0

Sehr _informative_ und _helpful_ Antwort. **Vielen Dank!** –

Verwandte Themen