Dies ist keine Hausaufgaben, obwohl es aus einem Buch ist.kann nicht herausfinden, warum Yacc/Bison Grammatik nicht funktioniert
Ich habe eine YACC/Bison Spec-Datei. Die Aufgabe ist eine neue Produktions
number -> number digit
digit -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
hinzuzufügen, um den Wert einer Zahl zu berechnen und tun, weg mit einem NUMBER
Token. Die Grammatik ist unten angegeben.
%{
#include <stdio.h>
#include <ctype.h>
int yylex();
int yyerror();
%}
%token NUMBER
%%
command : exp { printf("%d\n", $1); }
; /* allows printing of the result */
exp : exp '+' term { $$ = $1 + $3; }
| exp '-' term { $$ = $1 - $3; }
| term { $$ = $1; }
;
term : term '*' factor { $$ = $1 * $3; }
| factor { $$ = $1; }
;
factor : NUMBER { $$ = $1; }
| '(' exp ')' { $$ = $2; }
;
%%
int main() {
return yyparse();
}
int yylex() {
int c;
while((c = getchar()) == ' ');
/* eliminate blanks*/
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%d", &yylval);
return (NUMBER);
}
if (c == '\n') return 0;
/* makes the parse stop */
return (c);
}
int yyerror(char * s) {
fprintf(stderr, "%s\n", s);
return 0;
} /* allows for printing of an error message */
Als ein Experiment, um sicherzustellen, dass ich alles tue, richtig beseitigt ich die Nummer Token hinzugefügt, um die folgende Produktion:
number : '1' {$$ = $1;}
die factor
Produktion
factor : number {$$ = $1;}
und eliminiert
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%d", &yylval);
return (NUMBER);
}
von der yylex()
Funktion. Mit anderen Worten sieht die Spec-Datei wie folgt aus:
%{
#include <stdio.h>
#include <ctype.h>
int yylex();
int yyerror();
%}
%%
command : exp { printf("%d\n", $1); }
; /* allows printing of the result */
exp : exp '+' term { $$ = $1 + $3; }
| exp '-' term { $$ = $1 - $3; }
| term { $$ = $1; }
;
term : term '*' factor { $$ = $1 * $3; }
| factor { $$ = $1; }
;
factor : number { $$ = $1; }
| '(' exp ')' { $$ = $2; }
;
number : '1' { $$ = $1; }
;
%%
int main() {
return yyparse();
}
int yylex() {
int c;
while((c = getchar()) == ' ');
/* eliminate blanks*/
if (c == '\n') return 0;
/* makes the parse stop */
return (c);
}
int yyerror(char * s) {
fprintf(stderr, "%s\n", s);
return 0;
} /* allows for printing of an error message */
aber nachdem ich den Code auf dem folgenden Ausdruck aus: 1 + 1, erhalte ich eine Antwort von 0.
mir jemand Kommt helfen? Was mache ich falsch?
oh nein, ich von 1 Stimme herabgestuft wurde . Warum ist diese Frage falsch? – flashburn
Wahrscheinlich, weil Debugging-Fragen hier nicht behandelt werden. Sie suchen nach StackOverflow. – Ixrec
@lxrec ich sehe. Ich hatte Angst, dass, wenn ich es auf Überlauf frage, sie mir sagen, es hier zu verschieben. Ich wäre mir passiert. – flashburn