bison中哈希查找的问题
Trouble with hash lookup in bison
我正在研究一种经典的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取最近赋值的变量的值的行为让我感到困惑。
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 在 for 循环中查找问题时遇到困难
- 介绍类 在C++中查找圆半径的问题
- 查找不等式为真的次数时出现问题
- Distirbute Candy - 查找问题的最小可重现示例
- 查找在 4 和问题中代码失败的测试用例
- 在文本中查找半个单词"ABBA"的问题
- 查找有问题的宏
- 使用用户定义的函数查找数字的幂时出现问题
- 使用二分法查找数的平方根时出现问题
- 如何解决非限定名称查找问题
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- 迭代列表以查找元素的出现.代码问题
- 在C++的数组中查找最低值时遇到问题
- 查找料箱包装问题中的所有可能变化
- 关于获取行和字符串查找函数的问题
- C++constexpr数组查找:内存开销?其他问题
- 我的递归算法中的问题,用于查找所有最短、唯一的路径
- 在二叉树中插入/查找问题
- 查找第一个文件问题无法使任何示例正常工作。