2016-06-01 10 views
0

의 값이 I bison 사양에 다음과 같은 제품이 있습니다은/들소는 0

op : '+' { printf("%d %d %c\n", $1, '+', '+'); } 

때 나는 입력 나는 다음과 같은 출력을 얻을 + :

0 43 + 

을 누군가 $1의 값이 0 인 이유를 설명 할 수 있습니까? 43이 아니어야합니까? 내가 뭘 놓치고 있니?

편집

아무 플렉스 파일이 없지만, 나는 bison 문법 제공 할 수

%{ 
#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

flex 파일을 표시해야합니다.이 코드는 값을 bison으로 반환합니다. –

+0

@ BrianTompsett- 汤 莱恩 방금 편집했습니다. 어쩌면 도움이 될지도 모른다. – flashburn

답변

2

$1이 오른쪽에있는 첫 번째 심볼의 의미 값입니다있는 이 경우는 '+'입니다. 그것이 터미널이므로 스캐너가 '+' 토큰을 파서에 반환 할 때의 의미 값은 yylval과 같습니다. 은 (이 완전히 정상입니다) '+'를 반환하는 경우 yylval를 설정하지 않습니다 스캐너가, 그 생산에 $1의 사용이 잘 정의되지 않기 때문에

. 일반적으로 문법은 문법적이며 의미 론적 가치가없는 '+'과 같은 토큰의 의미 론적 값을 참조하지 않습니다.

그러나 yylval은 정적 변수이므로 0으로 초기화되므로 설정 될 때까지 해당 값이 계속 유지됩니다 (예 : NUMBER 검색 중).