我正在研究一种经典的bison / flex计算器实现问题。我运行的问题是变量赋值。它似乎起初工作;只能引用声明的变量,它会记住我指定的值...除了所有变量似乎共享一个值,而不是每个都有自己的值。所以,如果我做“x = 3; y = 5;”那么x和y的值都是5.
显然我做错了,但我不确定这是否是我对bison,c ++或unordered_map数据结构如何工作的理解失败。 (或许,所有3)
我相信我已经包含了下面代码的所有相关部分,但是如果有些遗失,请告诉我。
%{
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
unordered_map<string, double> dict;
%}
%union {
double dval;
char *sval;
}
%token <sval> VARIABLE
%token <dval> NUMBER
%type<dval> expr
%%
assign:
VARIABLE '=' expr {dict[$1] = $3; cout << $1<< "="<<dict[$1]<<endl; }
expr: VARIABLE {
if(dict.find($1) == dict.end())
{
yyerror("Bad Var");
}
答案 0 :(得分:2)
你应该真正展示你的灵活代码,但我猜测相关位看起来像这样:
{id} { yylval.sval = yytext; return VARIABLE; }
您需要做的是:
{id} { yylval.sval = strdup(yytext); return VARIABLE; }
然后你需要通过在你的野牛行动中使用它后释放分配的字符串来确保你不会泄漏内存。
答案 1 :(得分:0)
所以我的问题不在于我是如何存储数据的,而是在检索它时。我需要添加下面的else语句来实际设置expr的值。
expr: VARIABLE {
if(dict.find($1) == dict.end())
{
yyerror("Bad Var");
}
else { //Needed this section
$$ = dict[$1]
}
}
我想我知道我需要这样做而忘记了,但是expr的行为取了最近分配的变量的值,这让我失望了。