Ich habe eine folgende Produktion in einer bison
spec:
op : '+' { printf("%d %d %c\n", $1, '+', '+'); }
Als ich Eingabe eines +
ich folgende Ausgabe:
0 43 +
Kann jemand erklären, warum $1
einen Wert von 0 hat, sollte es nicht 43 sein? Was vermisse ich?
EDIT
Es gibt keine flex-Datei, aber ich kann eine bison
Grammatik bieten:
%{
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int yylex();
int yyerror();
%}
%token NUMBER
%%
lexp : NUMBER
| '(' op lexp-seq ')'
;
op : '+' { printf("%d %d %c\n", $1, '+', '+'); }
| '-' { printf("%d %d %c\n", $1, '-', '-'); }
| '*' { printf("%d %d %c\n", $1, '*', '*'); }
;
lexp-seq : lexp-seq lexp
| lexp
;
%%
int main(int argc, char** argv) {
if (2 == argc && (0 == strcmp("-g", argv[1])))
yydebug = 1;
return yyparse();
}
int yylex() {
int c;
/* eliminate blanks*/
while((c = getchar()) == ' ');
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%d", &yylval);
return (NUMBER);
}
/* makes the parse stop */
if (c == '\n') return 0;
return (c);
}
int yyerror(char * s) {
fprintf(stderr, "%s\n", s);
return 0;
} /* allows for printing of an error message */
Sie müssen uns die Flex-Datei anzeigen, da dieser Code den Wert an bison zurückgibt. –
@ BrianTompsett- 汤 莱恩 Ich habe gerade einen Schnitt gemacht. Vielleicht kann es helfen. – flashburn