2016-06-01 18 views
0

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 */ 
+1

Sie müssen uns die Flex-Datei anzeigen, da dieser Code den Wert an bison zurückgibt. –

+0

@ BrianTompsett- 汤 莱恩 Ich habe gerade einen Schnitt gemacht. Vielleicht kann es helfen. – flashburn

Antwort

2

$1 ist der semantische Wert des ersten Symbols auf der rechten Seite, die in Dieser Fall ist '+'. Da dies ein Terminal ist, ist sein semantischer Wert der Wert yylval, wenn der Scanner ein '+' Token an den Parser zurückgegeben hat.

Da der Scanner nicht yylval in dem Fall festgelegt, dass es '+' gibt (das ist völlig normal), die Verwendung von $1 in dieser Produktion ist nicht gut definiert. Normalerweise verweist eine Grammatik nicht auf die semantischen Werte von Token wie '+', die rein syntaktisch sind und keine semantischen Werte haben.

Da yylval jedoch eine statische Variable ist, wurde sie auf 0 initialisiert, so dass sie diesen Wert bis zur Einstellung hat (z. B. beim Scannen einer NUMBER).