我在yacc中创建了一个编译器,但我找不到允许用户使用单个标识符创建多个变量的方法。目前,他们可以为一个单词分配一个数字,但所有单词都具有相同的值。我正在使用它的代码:
...
%{
float var=0;
%}
...
exp: NUMBER
| WORD { $$ = var; }
| exp '/' exp { $$ = $1 / $3; }
| ...
答案 0 :(得分:0)
$$
会将exp
令牌分配给值var
。所以这是静态的。
如果要解析某些WORD
并获取其值,则应使用$$ = $1
,其中$ 1是规则的第一个标记的值( id est WORD令牌)
那是你打算做的吗?我不确定,因为你已经完成了exp '/' exp
?
编辑:要将每个单词存储在变量中,我建议您使用浮点表。 您将需要使用计数器来增加表索引。但是你应该注意不同的单词值将以匹配顺序存储。
EDIT2: (不知道它是否会按原样编译) 我认为它看起来像:
exp: NUMBER
| variable AFFECT exp { $$ = $3; var[ctr][0]="$1"; var[ctr][1]=$3; ctr++; }
| variable { $$ = lookupVar($1); }
定义lookupVar以在表
中查找字符串$ 1答案 1 :(得分:0)
您的代码似乎与mfcalc
示例类似
bison manual。
可能mfcalc
样本将提供有用的信息,即使它不是
完全符合你的目的。
mfcalc
有一个符号表,以保留VAR
的名称(可能是
对应于代码中的WORD
实际上mfcalc
在词法分析中强制执行符号名称查找,并进行分配
指向符号记录的指针,语义值为VAR
在野牛源代码中,语义值可以简单地称为
$1->value.var
。
希望这有帮助