1

我正在研究一种经典的 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");
    }
4

2 回答 2

2

你真的应该展示你的弹性代码,但我猜相关位看起来像这样:

{id}     { yylval.sval = yytext; return VARIABLE; }

你需要做的是:

{id}     { yylval.sval = strdup(yytext); return VARIABLE; }

然后,您需要通过在野牛操作中使用分配的字符串后释放分配的字符串来确保不会泄漏内存。

请参阅flex 手册bison 手册

于 2013-03-12T00:32:35.853 回答
0

所以我的问题不在于我如何存储数据,而在于检索它。我需要在下面添加 else 语句来实际设置 expr 的值。

expr: VARIABLE {
    if(dict.find($1) == dict.end())
    {
        yyerror("Bad Var");
    }
    else { //Needed this section
        $$ = dict[$1]
    }
}    

我想我知道我需要这样做并且只是忘记了,但是 expr 获取最近分配的变量的值的行为让我失望了。

于 2013-03-13T23:36:47.217 回答