5

我已經閱讀了相關的問題,但沒有一個似乎直接解決了這個問題。我正在編寫一個PHP腳本解釋器。我有AST爲除了類的所有東西生成適當的節點。處理類與處理函數有點不同,所以我正在尋找如何處理獨立的類,並擴展其他類。如何在基於抽象語法樹的解釋器中表示類

我已經看過ANTLR,但是我無法承受這個開銷,因爲這是針對嵌入式平臺的。我在尋找的是理論背後在AST中類的理論,所以它們可以由解釋器的執行者部分執行。與這個問題的具體答案良好的聯繫是肯定的讚賞。

回答

2

ANTLR或多或少與您的問題無關。

PHP中的一個類基本上是一個從字符串到屬性的映射。每個屬性可以是公共的,私人的,受保護的。每個屬性也包含一個值,可以是一個靜態變量或一個方法。方法是函數(在PHP中)帶一個隱含的$ this參數。所以你可以將一個類看作基本上是PHP中一個奇特的數組對象。

當你創建一個對象時,你給它一個指向你的PHP類對象的指針。當你在那個對象上調用一個方法時,通過你通過該指針得到的類對象來查找方法。

我希望這會有所幫助。

+0

正確,但是這會導致重新解釋該對象的標記,每當該類實例化對嗎?我想這就是谷歌的V8和其他JavaScript實現之間的差異,我需要弄明白。謝謝(你的)信息。 – 2009-05-29 00:46:23

0

我發現在自上而下的編譯器中最好的方法是,最好的方法是一般對待類就像函數一樣,因爲它們只是節點而不需要在下降到樹中之前評估參數。

不同之處在於執行程序,它必須創建一個執行範圍,以封裝構成類節點的方法和變量。

1

也許你需要一些解釋結構,從源語法中刪除一點點?我對PHP並不瞭解,但聽起來好像你真的在問如何以方便解釋的方式構造程序模型。我認爲通過ANTLR生成的AST與你想要的東西有點太接近。

0

我建議使用JavaCC(或FreeCC)來解析和構建AST。 JavaCC生成一個沒有運行時依賴關係的解析器。編寫比JavaCC生成的代碼更小/更快的解析器很困難。

+0

很酷,我來看看它,我必須注意的一件事是它與Dalvik字節碼兼容,我發現大多數java.class文件都是,但有些不是 – 2009-05-29 16:52:08

+0

JavaCC只輸出一對的Java類文件。這些將在您的常規編譯器中進行編譯。 FreeCC對泛型有更好的支持,所以我會使用它來編寫Java 1.5。 – brianegge 2009-05-31 22:47:41

0

看看phc abstract grammar,它確實如此。 (順便說一句,這聽起來像使用phc的前端可能會比重新發明輪子更好)。

Class_def ::= Class_mod CLASS_NAME extends:CLASS_NAME? implements:INTERFACE_NAME* Member* ; 
Class_mod ::= "abstract"? "final"? ; 

Interface_def ::= INTERFACE_NAME extends:INTERFACE_NAME* Member* ; 

Member ::= Method | Attribute ; 

Method ::= Signature Statement*? ; 
Signature ::= Method_mod is_ref:"&"? METHOD_NAME Formal_parameter* ; 
Method_mod ::= "public"? "protected"? "private"? "static"? "abstract"? "final"? ; 
Formal_parameter ::= Type is_ref:"&"? var:Name_with_default ; 
Formal_parameter ::= Type is_ref:"&"? var:Name_with_default ; 
Type ::= CLASS_NAME? ; 
Name_with_default ::= VARIABLE_NAME Expr? ; 

Attribute ::= Attr_mod vars:Name_with_default* ; 
Attr_mod ::= "public"? "protected"? "private"? "static"? "const"? ;