翻譯 指令碼引擎實現 第四部分 符號表和文法樹

2021-04-12 13:18:32 字數 886 閱讀 4288

譯者:tony qu

介紹

既然我們在上兩部分中做了一些有益的事,我們就需要把我們從程式的資料結構中收集的資料儲存起來,這就是我們接下來要做的事情,其中有兩個相當重要的東西:符號表和文法樹

文法樹是我們的程式結構的一種樹形的表示形式,看看下面的圖。在下一部分中,我們將用這個表示形式來生成中間**,雖然並沒有強制規定一定要生成文法樹(因為我們已經從解析器那裡獲得了所有的程式結構資訊),我覺得這使得編譯器更加透明,這也是我寫這篇文章的原因。

這將是第乙個擁有「真正」**的部分,在你看到它之前,我想澄清一點這些**是為了更好的理解而寫的,但可能結構方面不是很好,它將滿足我們正在製作的編譯器的需要,但真實的編譯器遠遠不止這些。我會在遇到實際問題時,提到一些真實編譯器的東西。

在規則間傳遞資訊

很明顯,我們不得不向解析器新增功能——當我們找到乙個符號時,我們把它新增到符號表中,但是我們也需要「家長」規則來了解符號的描述資訊(家長規則是指真正使用唯一識別符號的規則)。

當我們構建一棵文法樹的時候,一些相似的東西是必須的。我們需要家長規則擁有乙個指向孩子規則結點的指標(孩子規則是由家長規則構建而成的)

還記得yylval集嗎?yacc也使用這個集合在規則間傳遞資訊。在yylval集中,每個規則會有乙個相關聯字段,那是規則的型別。在string.y**的最上面,你可以看到下面的型別宣告

%type 

<

symbol

>

identifier string

%type 

<

tnode

>

statement expression

翻譯 指令碼引擎實現 第四部分 符號表和文法樹

譯者 tony qu 介紹既然我們在上兩部分中做了一些有益的事,我們就需要把我們從程式的資料結構中收集的資料儲存起來,這就是我們接下來要做的事情,其中有兩個相當重要的東西 符號表和文法樹 文法樹是我們的程式結構的一種樹形的表示形式,看看下面的圖。在下一部分中,我們將用這個表示形式來生成中間 雖然並沒...

第四部分 方法3

對employee.calculatepay方法的呼叫是問題的原因。我們需要的是晚繫結。晚繫結 latebinging 意味著編譯器到執行時才選擇要執行的方法。為了迫使編譯器呼叫向上型別轉換得到的物件的方法的正確版本。我們使用了兩個關鍵字 virtual 和override.必須在基類方法中使用vi...

第四部分 方法5

linux繼承了unix作業系統結構清晰的特點。在linux下的檔案結構非常有條理。但是,上述的優點只有在對linux相當熟悉時,才能體會到。vmlinuz 我們已經知道,每乙個linux都有乙個核心 vmlinuz 我們在這個核心上新增上可以完成各種特定功能的模組,每個模組就體現在 linux中各...