2016-04-10 8 views
0

Ich habe ein Taschenrechnerbeispiel aus dem Buch Flex und Bison von O'Reilly verfolgt und bisher habe ich folgendes getan.Was ist der Fehler im folgenden Flex- und Bison-Programm?

I Flex und Bison für Windows benutzen und es mit Flex für die Erstellung habe ich es mit dem folgenden Befehl aus:

flex f4.l 

und für das Erhalten die benötigten EXE-Datei Ich habe gesagt:

gcc lex.yy.c -L "C:\Program\GnuWin32\lib" -lfl 

Bis zu diesem Punkt funktioniert die generierte EXE-Datei problemlos.

nun das Buch sagt, dass ich die .y-Datei von Bison erstellt werden machen sollte, ist mein Code:

Datei: f5.y

/* simplest version of calculator */ 
%{ 
#include <stdio.h> 
%} 
/* declare tokens */ 
%token NUMBER 
%token ADD SUB MUL DIV ABS 
%token EOL 
%% 
calclist: /* nothing */ 
| calclist exp EOL { printf("= %d\n", $1); } 
; 
exp: factor 
| exp ADD factor { $$ = $1 + $3; } 
| exp SUB factor { $$ = $1 - $3; } 
; 
factor: term 
| factor MUL term { $$ = $1 * $3; } 
| factor DIV term { $$ = $1/$3; } 
; 
term: NUMBER 
| ABS term { $$ = $2 >= 0? $2 : - $2; } 
; 
%% 
main(int argc, char **argv) 
{ 
yyparse(); 
} 
yyerror(char *s) 
{ 
fprintf(stderr, "error: %s\n", s); 
} 

Zwei Dateien, die von Bison erzeugt werden: f5 .tab.c und f5.tab.h

Meine f4.l Datei ist folgende:

%{ 
# include "f5.tab.h" 
int yylval; 
%} 
/* recognize tokens for the calculator and print them out */ 
%{ 
int yylval; 
%} 

%% 
"+" { return ADD; } 
"-" { return SUB; } 
"*" { return MUL; } 
"/" { return DIV; } 
"|" { return ABS; } 
[0-9]+ { yylval = atoi(yytext); return NUMBER; } 
\n { return EOL; } 
[ \t] { /* ignore whitespace */ } 
. { printf("Mystery character %c\n", *yytext); } 
%% 
/*main(int argc, char **argv) 
{ 
int tok; 
while(tok = yylex()) { 
printf("%d", tok); 
if(tok == NUMBER) printf(" = %d\n", yylval); 
else printf("\n"); 
} 
}*/ 

ich kompilieren mein Programm mit:

gcc f5.tab.c lex.yy.c -L "C:\Program\GnuWin32\lib" -lfl 

Das Problem ist, wenn ich das kompilierte Programm, zum Beispiel laufen, wenn ich gesagt:

2 + 3 * 4 
= 1968511970 
20/2 
= 1968511970 

, warum ich diese Antworten haben? Es scheint, dass das Anzeigen von Speicherpositionen, ich denke, jede Hilfe?

+0

Sie danken @ BrianTompsett- 汤 莱恩, habe ich die Datei bearbeitet, wieder verwendet flex, aber ich habe immer noch die gleichen Fehler – Little

+0

Die Fehlermeldung besagt, dass gcc die Bibliothek nicht finden konnte '- lfl'. Überprüfen Sie, dass Sie den richtigen Pfad angeben. (Anscheinend hat es die Bibliothek gefunden, als Sie die Flex-Programmdatei kompiliert haben. Überprüfen Sie, ob die Compiler-Flags identisch waren.) – rici

+1

Das einzige, was Sie für 'yywrap' benötigen, können Sie vermeiden, indem Sie' hinzufügen % Option noyywrap' zu Ihrer Flex-Datei, vor dem ersten '%%'. – rici

Antwort

2
| calclist exp EOL { printf("= %d\n", $1); } 

Sie drucken die falsche Sache. Es sollte sein:

| calclist exp EOL { printf("= %d\n", $2); } 
+0

danke @EJP, aber warum sollte es $ 2 sein? Ich kann nicht sehen, was dieses Argument im Programm zeigt – Little

+0

@Little, '$ 1' entspricht 'calclist',' $ 2' zu 'exp'. – rkersh

Verwandte Themen