サンプルコードの実行結果は下記のようになります。T_OPEN_TAGT_VARIABLET_WHITESPACE=T_WHITESPACET_ARRAY();T_OPEN_TAGT_VARIABLET_WHITESPACE=T_WHITESPACE[];T_OPEN_TAGはphpの開始タグを表すenum定数になります。T_WHITESPACEはホワイトスペースを表すenum定数になります。このようにphpのセンテンスをzend処理系で用意されたトークンに細かく分解していきます。ここでarrayはT_ARRAYにトークン解析されていることがわかります。そのあとのカッコについてはそのままになっていることがわかりますね。これはそれ自体で意味を持っているメタ文字になるからです。各種zend処理系での予約後に関してはトークン解析によってenumに置き換えられ、それ以外はメタ文字としてそのまま認識されることになります。続いて解析できたトークンを意味のある文として解釈します。zend処理系ではこの構文解析の実装とbisonと呼ばれるgnuツールを利用しています。bisonはBNFを基本とした亜種で文法を表現します。bisonについてはこちらでかなり詳しく説明しておられるので参考にしてみると良いでしょう。bisonでは終端トークン(最小単位のトークン)を組み合わせて文として認識できる構成を定義していきます。zend処理系における実装はzend_language_parser.yに記述されておりますので確認してみてください。'str';先に述べたようにこれらはまずトークン解析され、続いてbisonによって記述された文に一致するパターンを検索します。文が適合すれば処理しますし、仮に文が解釈できないようであればパースエラーとして実行されないで終了します。bison(およびBNF記法)の強力なところはそれぞれの文章を再帰的に表現することや、文の定義に他の文を含むことができるので非常に柔軟に文を定義できるところにあります。arrayの文を確認する構文解析まで理解できたところで実際にphpではarrayというセンテンスをどのように解釈して処理系が動作しているのかというところを追いかけてみます。下記のようなphpコードを対象として取り上げてみてみましょう。array();字句解析の項目で解説したようにarrayという文字列はT_ARRAYとしてトークナイズされます。bisonの定義ファイルからこれの定義を探してみます。(T_ARRAY)"すると上記のような項目が見つかりました。これはトークンT_ARRAYを定義していることを表します。続いてT_ARRAYを文として定義している箇所(=構文解析を行っていると思われる箇所)を探してみましょう。};見つかりましたcombined_scalarという文が定義されており、トークンとしてT_ARRAYが使用されていることから、これが配列の初期化としての文であることが理解できます。bisonではパイプで区切ることで複数の文を定義することができます。よって二つ目の文についてはPHP5.4以降で新たに定義されたブラケット(カギカッコ)による配列の定義が確認できますね。カギカッコの中は構文により呼び出されるc言語による実装です。$$は戻り値を示しており、$xはx番目にマッチするトークンを表しています。ここで先に述べたようにbison(BNF)では文を再帰的に定義できますし、文の定義に他の文の定義を含むことができます。ここではarray_pair_listという文が定義されていることが確認できるので更に文の定義を追いかけます。possible_commaで構成されることがわかります。possible_commaの文定義を確認するとコンマもしくはなにもなし、と定義されることがわかります。PHPの配列では末尾にコンマをつけてもつけなくても認識してくれますが、それはこの文定義によるものだということが理解できますね。not_empty_array_pair_listを確認してみます。定義がそれぞれありますがphpの多様な配列定義を文として定義しています。phpのセンテンスとして下記のようなものがありますが、それぞれがこの構文として定義されています。array();最終的にzend_do_init_arrayというcの関数が呼び出されていることがわかります。今回は構文解析からarrayの処理系の解釈を追うことが目的ですので、zend_do_init_arrayについては次の機会に取り上げたいと思います。まとめいかがでしたでしょうか。意外とおってみるとそんなに難しくないことがわかります。これもbisonなど先人が作り出してきた便利なツールによるものですね。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。wordpressでcronイベントをスケジューリングするPHPリーディングコードbisonccorephpzend字句解析構文解析phpのcount関数の実装を見るnginx拡張モジュールを作りましたRECOMMENDこちらの記事も人気です。