你还没说你使用什么语言,C++或C
C++:
在C++中管理变量是相当容易的,你基本上都会有一个地图std::map<string,int> symbol_table;
(假设你的变量是整数)。第一次当你使用变量时,你会把它插入到地图中,并且每次你声明你都会更新地图中的值。这在C++中非常快速。当然,你可以在Yacc解析器中添加/更新这些值。
C:
在C的情况是有点棘手,没有地图!所以你需要做的是创建二进制搜索树。该树中的节点将包含char数组 - 表示变量名称,并且还会有一些值。当你第一次得到一些变量时,你需要将它添加到BST中,当你改变值时,你必须先找到它,然后更新该节点的值。
注:在C有内存分配的问题,这个问题是名字的内存分配,通常你在莱克斯(幸运的是为strdup
功能).`
不认为我代码示例对于C++是必需的,但是我会在C中给你例子。
Yacc的开始:
%{
#include <stdio.h>
#include <stdlib.h>
#include "tree.h" /* All methods I mentioned above must be implemented */
node *map = NULL; /* You would insert every variable here */
%}
联盟:
%union {
char *s; /* We will allocate memory in Lex */
int value; /* We will update this value in Yacc */
};
莱克斯:
[a-zA-Z_][a-zA-Z0-9_]* {
yylval.s = strdup(yytext);
if(yylval.s == NULL){
fprintf(stderr,"Unable to allocate memory for variable name.\n");
exit(EXIT_FAILURE);
}
return id_token;
}
这基本上是它。为了完成这项工作,还有很多工作要做。如果您还有其他问题,请随时询问。
不清楚你在问什么。根据您接受的答案来判断,您正在问如何构建编译时符号表,在这种情况下,堆栈计算机与问题完全无关,并且您不会停留在代码生成上,而是停留在符号表上建造。你的问题措辞的方式,似乎是关于如何通过代码生成器将变量存储到堆栈机器的目标代码中。 – EJP