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哈希映射和字典。 –