2015-10-24 3 views
0

Я пытаюсь реализовать простой калькулятор с использованием Flex и Bison. Я сталкиваюсь с проблемами на стадии Bison, в которых я не могу понять, как значение переменной можно получить из таблицы символов и присвоено $$.Ошибка при получении значения из таблицы символов

The Lex Файл:

%{ 
#include <iostream> 
#include <string.h> 
#include "calc.tab.h" 
using namespace std; 
void Print(); 

int count = 0; 
%} 

%% 

[ \t\n]+   ; 

"print"    {Print();} 

"exit"    { 
       exit(EXIT_SUCCESS); 
       } 

[0-9]+    { 
       yylval.FLOAT = atof(yytext); 
       return (NUMBER); 
       count++; 
       } 

[a-z][_a-zA-Z0-9]* { 
       yylval.NAME = yytext; 
       return (ID); 
       } 



.     { 
       return (int)yytext[0]; 
       } 

%%

void Print() 
{ 
    cout << "Printing ST..\n"; 
} 

int yywrap() 
{ 
    return 0; 
} 

Зубр файл:

%{ 

#include <iostream> 
#include <string.h> 
#include "table.h" 

extern int count; 

int yylex(); 
int yyerror(const char *); 
int UpdateSymTable(float, char *, float); 

using namespace std; 
%} 

%union 
{ 
    float FLOAT; 
    char *NAME; 
} 

%token NUMBER 
%token ID 
%type <FLOAT> NUMBER 
%type <NAME> ID 
%type <FLOAT> expr 
%type <FLOAT> E 
%left '*' 
%left '/' 
%left '+' 
%left '-' 
%right '=' 

%%

E:   expr {cout << $$ << "\n";} 

expr:  NUMBER {$$ = $1;} 
     | expr '+' expr {$$ = $1 + $3;} 
     | expr '-' expr {$$ = $1 - $3;} 
     | expr '*' expr {$$ = $1 * $3;} 
     | expr '/' expr {$$ = $1/$3;} 
     | ID '=' expr { 
         int index = UpdateSymTable($$, $1, $3); 
         $$ = st[index].number = $3; //The problem is here 
         } 

%%

int yyerror(const char *msg) 
{ 
    cout << "Error: "<<msg<<"\n"; 
} 

int UpdateSymTable(float doll_doll, char *doll_one, float doll_three) 
{ 
    int number1 = -1; 

    for(int i=0;i<count;i++) 
    { 
     if(!strcmp(doll_one, st[i].name) == 0) 
     { 

      strcpy(st[i].name, doll_one); 
      st[i].number = doll_three; 
      number1 = i; 
     } 
     else if(strcmp(doll_one, st[i].name) == 0) 
     { 
      number1 = i; 
     } 
    } 

    return number1; 
} 

int main() 
{ 
    yyparse(); 
} 

Символ таблицы:

struct st 
{ 
    float number; 
    char name[25]; 
}st[25]; 

Выход я получаю:

a = 20 
c = a+3 
20 
Error: syntax error 

Я был бы очень признателен, если бы кто-то сказал мне, что происходит не так , Я пытаюсь с тех пор долгое время, и я не смог разрешить ошибку.

ответ

2
  1. Ошибка синтаксиса является результат вашей грамматики принимает только один expr, а не последовательность expr с. См., Например, this question.

  2. Одна из проблем с поиском вашей таблицы символов заключается в том, что вы неправильно возвращаете значение yytext в качестве семантического значения вместо того, чтобы делать копию. См., Например, this question.

  3. Однако функции UpdateSymTable имеют довольно много проблем, начиная с того, что имена, которые вы выбрали для параметров, не имеют смысла, и, кроме того, первый параметр («doll_doll») никогда не используется. Я не знаю, что вы собираетесь тестировать с помощью !strcmp(doll_one, st[i].name) == 0, но что бы это ни было, должен быть более простой способ выразить это. В любом случае логика неверна. Я бы предложил написать несколько простых тестовых программ (без бизонов и flex), чтобы вы могли отлаживать обработку таблицы символов. И/или поговорите с вашим консультантом по лаборатории, если у вас его есть.

  4. Наконец, (из того, что я заметил) ваши отношения с приоритетом неверны. Во-первых, они обращаются вспять: оператор, который связывается наименее плотно (присваивание), должен быть первым. Во-вторых, это не тот случай, когда + имеет приоритет над - или наоборот; оба оператора имеют одинаковый приоритет. Аналогично * и /. Вы можете попробовать прочитать precedence chapter of the bison manual, если у вас нет лекций или другой информации.

Смежные вопросы