你還沒說你使用什麼語言,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