0

对于我的课,我必须写一个编译器为Python的一小集:如何存储变量从符号表编译器

  • 这种语言有一个方法
  • 有没有的功能,所以我'm只处理一个词法范围

该Python子集将被转换为Java字节码。 我已经完成了词法分析和解析树(使用lex和yacc)。 我一直在代码生成。

我们使用Gnoloo代码生成,一个堆栈机器语言。

问题是我不知道如何存储变量。我知道我必须使用符号表,但我不知道如何填写它。

我必须存储变量的值吗?

如果代码有x = 2,symtable是否必须有一个字段?

如何存储堆栈机器的变量。

+0

不清楚你在问什么。根据您接受的答案来判断,您正在问如何构建编译时符号表,在这种情况下,堆栈计算机与问题完全无关,并且您不会停留在代码生成上,而是停留在符号表上建造。你的问题措辞的方式,似乎是关于如何通过代码生成器将变量存储到堆​​栈机器的目标代码中。 – EJP

回答

0

你还没说你使用什么语言,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; 
} 

这基本上是它。为了完成这项工作,还有很多工作要做。如果您还有其他问题,请随时询问。

+0

谢谢你!我正在使用java。我的问题是我必须为堆栈机器生成代码。代码源代码有这两个语句:x = 2 * 3和更高版本y = 2 + x。我不知道如何跟踪我在哪里加载x。我怎样才能做到这一点?。 – MadDog

+0

那么你可以使用哈希映射或字典。它与我描述的C++基本相同。在这里阅读更多有关http://stackoverflow.com/questions/267312/difference-between-a-hashmap-and-a-dictionary-adt哈希映射和字典。 –