5

関連する質問を読みましたが、質問に直接対処しているようには見えません。PHPスクリプトインタープリターの作成に取り組んでいます。クラス以外のすべてに対して適切なノードを生成する AST があります。クラスの処理は関数の処理とは少し異なるため、スタンドアロンのクラスや他のクラスを拡張するクラスを処理する方法を探しています。

ANTLR を見てきましたが、これは組み込みプラットフォーム用であるため、オーバーヘッドを許容できません。私が探しているのは、概念的に AST のクラスの背後にある理論であるため、インタープリターのエグゼキューター部分によって実行できます。この問題に対する特定の回答を含む適切なリンクは、間違いなく高く評価されます。

4

5 に答える 5

2

ANTLR は、多かれ少なかれ問題とは無関係です。

PHP のクラスは基本的に、文字列から属性へのマップです。各属性は、パブリック、プライベート、保護することができます。各属性には、静的変数またはメソッドの値も保持されます。メソッドは、(PHP で) 暗黙の $this パラメーターを取る関数です。したがって、クラスは基本的に、PHP の派手な配列オブジェクトと考えることができます。

オブジェクトを作成するときは、PHP クラス オブジェクトへのポインターを渡します。そのオブジェクトでメソッドを呼び出すときは、そのポインターを介して取得したクラス オブジェクトを介してメソッドを検索します。

これが役立つことを願っています。

于 2009-05-28T23:30:43.170 に答える
1

おそらく、ソースの文法からもう少し離れた解釈用の構造が必要ですか? 私はPHPについてあまり知りませんが、解釈に便利な方法でプログラムモデルをどのように構造化するかを本当に尋ねているようです。ANTLR を介して生成された AST は、必要なもののソースに少し近すぎると考えています。

于 2009-05-28T23:21:49.723 に答える
0

JavaCC(またはフォークFreeCC)を使用してASTを解析および構築することをお勧めします。JavaCCは、実行時の依存関係がないパーサーを生成します。JavaCCが生成するコードよりも小さい/速いパーサーを作成することは困難です。

于 2009-05-29T05:48:36.260 に答える
0

phc抽象文法を見てください、それはまさにそれをします。(ちなみに、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"?  ;
于 2009-07-29T15:55:53.013 に答える
0

トップダウン コンパイラでの最良の方法は、ツリーに降りる前に引数を評価する必要のない単なるノードであるという点で、クラスを一般的に関数と同じように扱うことであることがわかりました。

違いはエグゼキューターにあります。エグゼキューターは、クラス ノードを構成するメソッドと変数をカプセル化する実行スコープを作成する必要があります。

于 2009-05-27T17:07:21.727 に答える