4

我正在開發一個小型的基於對象的編程語言。關於編譯器符號表的簡單問題

雖然我有點迷失在一件簡單的事情上。我已經實現了幾個訪問者,他們收集AST的類名,類型和參數,方法頭和字段。

我的問題是現在要做什麼與我的方法的身體。我應該將本地變量添加到符號表嗎?

它可能看起來像在第一個不錯的主意,直到一個人認爲,如情況:

void myMethod() { 
    int i; 

    while (something) { 
     int y; 
    } 

    while (something) { 
     int y; 
    } 
} 

是我剛剛到iy變量添加到符號表,我會得到y是一個重複的變量。

請記住,我瞭解符號表範圍。我無法理解的是,在方法中是否應該在符號表上隨時添加和刪除信息,或者如果我在訪問方法時將數據永久添加到符號表中(就像我對類+字段+ methodsheader)。

重申問題:訪問方法體時,我應該在訪問結束時讓符號表與訪問前一樣嗎?

謝謝!

+0

如果您仍然感興趣並且沒有一個好的解決方案,您可以將問題提交給全新的[cs.SE](http://cs.stackexchange.com)! – Raphael 2012-03-23 23:21:05

回答

0

爲什麼不建模程序塊,這樣你就可以讓一個塊擁有一個符號表。在這種情況下,y可能存在於兩個不同的塊中,因爲這兩個實例將被放置在兩個不同的符號表中。

0

您有一個代表程序結構的AST。 AST中的某些節點代表新的作用域(方法條目,塊體......)。

你可以建立一個符號表,它的形狀與你的AST相同:無論你有一個代表一個範圍介紹的AST節點,從符號到它們的聲明建立一個相關的映射。

您必須按照您的語言語義確定的順序搜索範圍,但至少您會知道在哪裏查找每個範圍。