2017-02-28 9 views
0

저는 Flex와 Bison에서 계산기를 만들었습니다. 표준 입력에서 얻은 표현의 접두사 표기법을 인쇄 할 수 있어야합니다. 게시물 수정 표기법을 쉽게 인쇄 할 수 있었지만 접두사 표기법을 사용하는 데 어려움이 있습니다. 여기에 지금까지 들소에 달성 한 것입니다 :Bison - 간단한 계산기에 접두사 표기법을 인쇄하십시오.

%{ 
#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 

int yylex(void); 
void yyerror(char *); 
int sym[26]; 
%} 

%token INTEGER VARIABLE 

%left '+' '-' 
%left '*' '/' 
%left POWER 
%right '!' 



%% 
program: 
    program statement '\n' 
    | 
    ; 

statement: 
    expr    { printf("\n%d \n", $1); } 
    | 
    VARIABLE '=' expr { sym[$1] = $3;printf("\n"); } 
    ; 

expr: 
    INTEGER   { /*printf("%d",yylval);*/} 
    | VARIABLE  { $$ = sym[$1]; printf("%d",sym[$1]);} 
    | expr '+' expr { $$ = $1 + $3; printf("+");} 
    | expr '-' expr { $$ = $1 - $3; printf("-");} 
    | expr '*' expr { $$ = $1 * $3; printf("*");} 
    | expr '/' expr { $$ = $1/$3; printf("/");} 
    | expr POWER expr { $$ = pow($1, $3);printf("pow");} 
    | '(' expr ')' { $$ = $2;} 
    | '!' expr  { $$ = !$2; printf("!");} 

    ; 


%% 
void yyerror(char *s) { 
    fprintf(stderr, "%s\n", s); 
} 

int main(void) { 
    yyparse(); 
    return 0; 
} 
+0

이것은 접두사입니다. 후위처럼 보입니다. – user3344003

답변

0

당신이 직면하고 명백한 문제는 피연산자 모두 분석 한 후 운전자가 구문 분석이다. 그래서 당신은 printf를 사용하여 그것을 달성 할 수 없습니다. 한 가지 해결책은 거대한 char 배열을 만드는 것입니다 (전역으로 만들 수 있습니다). 그리고 printf를 사용하는 대신에 미리 배열을 유지할 수 있습니다. 예를 들어, +를 만나면 (최종 변수가 전역 변수라고 가정).

char temp[100]; 
sprintf(temp, "%s%s", "+", final); 
strcpy(final, temp); 

그리고 yyparse()가 반환 될 때 파싱을 완료하면 printf ("% s", final);