【问题标题】:Bison - print the prefix notation in a simple calculatorBison - 在一个简单的计算器中打印前缀符号
【发布时间】:2017-02-28 03:45:54
【问题描述】:

我在 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;
}

【问题讨论】:

  • 这是你的前缀?它看起来像后缀。

标签: c compiler-construction bison


【解决方案1】:

您面临的明显问题是运算符在两个操作数都被解析之后被解析。所以你不能只用 printf 来实现它。一种解决方案是创建一个巨大的 char 数组(您可以将其设为全局),而不是使用 printf,您可以继续添加它。因此,例如,当您遇到 + 时(假设 final 是您的全局变量)。

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

当你完成解析,也就是yyparse()返回的时候,你可以 printf("%s", final);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2013-03-14
    • 2016-07-10
    • 2020-03-20
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多