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

最佳答案

您也应该真正显示您的flex代码,但是我猜测相关的部分看起来像这样:

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

您需要做的是:
{id}     { yylval.sval = strdup(yytext); return VARIABLE; }

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

参见the flex manualthe bison manual

关于c++ - 野牛中的哈希查找麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15333754/

10-11 22:06