5

私は関連する質問を読んだが、どれも質問に直接言及していないようだ。私はPHPスクリプトインタプリタを書くことに取り組んでいます。私は、クラスを除くすべてのための適切なノードを生成するASTを持っている。クラスの扱いは、関数の扱いとは少し違うので、スタンドアローンで他のクラスを拡張するクラスを扱う方法を探しています。抽象構文木ベースのインタプリタでクラスを表現する方法

私はANTLRを見てきましたが、これは組み込みプラットフォームのためのオーバーヘッドの余裕がありません。私が探しているのは、理論的にはASTのクラスの背後にある理論です。そのため、インタプリタの実行者部分によって実行されることができます。この問題に対する具体的な回答との良好なリンクは間違いなく感謝しています。

答えて

2

ANTLRは、あなたの問題に多少なりとも関係ありません。

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

オブジェクトを作成するときは、そのオブジェクトにPHPクラスオブジェクトへのポインタを与えます。そのオブジェクトのメソッドを呼び出すと、そのポインタを介して取得したクラスオブジェクトを介してメソッドをルックアップします。

こちらがお役に立てば幸いです。

+0

そうですが、それはクラスがインスタンス化されるたびにそのオブジェクトのトークンを再解釈することにつながりますか?私はそれがGoogleのV8と他のJavaScriptの実装の違いだと思うし、それを理解する必要がある。情報をありがとう。 –

0

私は、トップダウンコンパイラで最も良い方法であることがわかっています。ツリーに降りる前に引数を評価する必要なしに、クラスは一般的に関数と同様に扱います。

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

1

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

0

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

+0

クール、私はそれを見てみましょう、それはDalvikのバイトコードと互換性があることを私が見なければならないことです、私はほとんどのJavaの.classファイルが見つかりましたが、いくつかはありません –

+0

JavaCC出力ちょうどカップルJavaクラスファイルのこれらは通常のコンパイラでコンパイルされます。 FreeCCはジェネリックスをより良くサポートしています。そのため、Java 1.5をコーディングしてから使用します。 – brianegge

+0

助けてくれてありがとうございました –

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"? ; 
+0

Paulさん、C/C++ベースのクライアントでPHCを使用していますが、どうすればAndroid(Java/Dalvik)で使用できますか? –

+0

ネイティブアプリはできないと思いますか?それから、XMLインターフェースを使ったWebサービスとして? –

関連する問題