bison中哈希查找的问题

Trouble with hash lookup in bison

本文关键字:问题 查找 哈希 bison      更新时间:2023-10-16

我正在研究一种经典的bison/flex计算器实现问题。我遇到的问题是变量赋值。乍一看似乎管用;只有声明过的变量才能被引用,它会记住我赋值的值…除了所有变量似乎都共享一个值,而不是每个变量都有自己的值。如果我写x=3;Y =5,那么x和Y的值都是5。

显然我做错了什么,但我不确定这是否是我对bison, c++的理解失败,或者unordered_map数据结构如何工作。(或者全部)

我相信我已经包含了下面代码的所有相关部分,但如果有一些缺失,请告诉我。

%{
    #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");
    }

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

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

你需要做的是:

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

然后你需要确保你不会泄漏内存,通过释放分配的字符串后,你在你的bison操作。

参见flex手册和bison手册

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

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

我想我知道我需要这样做,只是忘记了,但是expr取最近赋值的变量的值的行为让我感到困惑。