Enviar búsqueda
Cargar
詳説ぺちぺち
•
1 recomendación
•
2,101 vistas
do_aki
Seguir
Tecnología
Denunciar
Compartir
Denunciar
Compartir
1 de 43
Descargar ahora
Descargar para leer sin conexión
Recomendados
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
kwatch
Perl勉強会#2資料
Perl勉強会#2資料
Kiyo Tsunezumi
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Kenta USAMI
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
traitを使って楽したい話
traitを使って楽したい話
infinite_loop
Elixirだ 第2回
Elixirだ 第2回
Joe_noh
F#のすすめ
F#のすすめ
Hiromu Sasaki
Php2 s3
Php2 s3
Jun Chiba
Más contenido relacionado
La actualidad más candente
Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -
Joe_noh
Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半
Joe_noh
Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半
Joe_noh
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
Jun Nogata
PCさえあればいい。
PCさえあればいい。
bleis tift
php7's ast
php7's ast
do_aki
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
Php s4
Php s4
Jun Chiba
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
Shinzo SAITO
PHP基本的関数QUIZ
PHP基本的関数QUIZ
Wataru Terada
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
Kousuke Ebihara
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
Php2 s2
Php2 s2
Jun Chiba
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
株式会社ランチェスター
Map
Map
kikairoya
Php2 s4
Php2 s4
Jun Chiba
C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra
HHVM Hack
HHVM Hack
Masaaki Yonebayashi
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
Tomohiro Kumagai
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Hishikawa Takuro
La actualidad más candente
(20)
Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
PCさえあればいい。
PCさえあればいい。
php7's ast
php7's ast
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Php s4
Php s4
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
PHP基本的関数QUIZ
PHP基本的関数QUIZ
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Php2 s2
Php2 s2
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
Map
Map
Php2 s4
Php2 s4
C++11概要 ライブラリ編
C++11概要 ライブラリ編
HHVM Hack
HHVM Hack
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Destacado
JavaScript非同期処理 入門
JavaScript非同期処理 入門
Ishibashi Ryosuke
Php radomize
Php radomize
do_aki
セキュアな育毛
セキュアな育毛
Ishibashi Ryosuke
オレオレPHPのつくり方
オレオレPHPのつくり方
Ryusuke Sekiyama
PHPエクステンションの開発tips
PHPエクステンションの開発tips
Yoshio Hanawa
Php in ruby
Php in ruby
do_aki
zval をダイエットしてみた
zval をダイエットしてみた
Yoshio Hanawa
超初心者向け!Php勉強法とプログラミングの基礎の基礎
超初心者向け!Php勉強法とプログラミングの基礎の基礎
Hiroyuki Sugimoto
HashTable と HashDos
HashTable と HashDos
Yuya Takeyama
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
Akishige TAKEKOSHI
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
Yo Ya
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
Yahoo!デベロッパーネットワーク
PHP基礎勉強会
PHP基礎勉強会
Yuji Otani
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
do_aki
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
Satoru Yoshida
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
do_aki
PHP超入門@LL温泉
PHP超入門@LL温泉
Sotaro Karasawa
PHP初心者に贈る、まちがえないPHPの始め方・学び方
PHP初心者に贈る、まちがえないPHPの始め方・学び方
Hiroyuki Sugimoto
Destacado
(20)
JavaScript非同期処理 入門
JavaScript非同期処理 入門
Php radomize
Php radomize
セキュアな育毛
セキュアな育毛
オレオレPHPのつくり方
オレオレPHPのつくり方
PHPエクステンションの開発tips
PHPエクステンションの開発tips
Php in ruby
Php in ruby
zval をダイエットしてみた
zval をダイエットしてみた
超初心者向け!Php勉強法とプログラミングの基礎の基礎
超初心者向け!Php勉強法とプログラミングの基礎の基礎
HashTable と HashDos
HashTable と HashDos
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
JIT のコードを読んでみた
JIT のコードを読んでみた
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
PHP基礎勉強会
PHP基礎勉強会
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
PHP超入門@LL温泉
PHP超入門@LL温泉
PHP初心者に贈る、まちがえないPHPの始め方・学び方
PHP初心者に贈る、まちがえないPHPの始め方・学び方
Similar a 詳説ぺちぺち
Write good parser in perl
Write good parser in perl
Jiro Nishiguchi
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
Clojure programming-chapter-2
Clojure programming-chapter-2
Masao Kato
Perl 非同期プログラミング
Perl 非同期プログラミング
lestrrat
Local php-100828 2
Local php-100828 2
Akio Ishida
Material
Material
_TUNE_
What is Metasepi?
What is Metasepi?
Kiwamu Okabe
Perlで伝統芸能
Perlで伝統芸能
hitode909
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
純生 野田
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
鉄次 尾形
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
モナドハンズオン前座
モナドハンズオン前座
bleis tift
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
MT meets PHP
MT meets PHP
純生 野田
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
charsbar
勉強会課題①
勉強会課題①
真亮 坂口
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Akabane Hiroyuki
Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂
Similar a 詳説ぺちぺち
(20)
Write good parser in perl
Write good parser in perl
PHP AST 徹底解説
PHP AST 徹底解説
Clojure programming-chapter-2
Clojure programming-chapter-2
Perl 非同期プログラミング
Perl 非同期プログラミング
Local php-100828 2
Local php-100828 2
Material
Material
What is Metasepi?
What is Metasepi?
Perlで伝統芸能
Perlで伝統芸能
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
モナドハンズオン前座
モナドハンズオン前座
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
MT meets PHP
MT meets PHP
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
勉強会課題①
勉強会課題①
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Ekmett勉強会発表資料
Ekmett勉強会発表資料
Más de do_aki
Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
do_aki
php-src の歩き方
php-src の歩き方
do_aki
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
PHPとシグナル、その裏側
PHPとシグナル、その裏側
do_aki
再考:列挙型
再考:列挙型
do_aki
Writing php extensions in golang
Writing php extensions in golang
do_aki
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
do_aki
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
do_aki
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
20141017 introduce razor
20141017 introduce razor
do_aki
20141011 mastering mysqlnd
20141011 mastering mysqlnd
do_aki
php in ruby
php in ruby
do_aki
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
N:1 Replication meets MHA
N:1 Replication meets MHA
do_aki
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
do_aki
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
do_aki
Immortal
Immortal
do_aki
Excel is image viewer
Excel is image viewer
do_aki
A bridge between php and ruby
A bridge between php and ruby
do_aki
Más de do_aki
(20)
Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
php-src の歩き方
php-src の歩き方
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
PHPとシグナル、その裏側
PHPとシグナル、その裏側
再考:列挙型
再考:列挙型
Writing php extensions in golang
Writing php extensions in golang
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
20141017 introduce razor
20141017 introduce razor
20141011 mastering mysqlnd
20141011 mastering mysqlnd
php in ruby
php in ruby
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
N:1 Replication meets MHA
N:1 Replication meets MHA
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
Immortal
Immortal
Excel is image viewer
Excel is image viewer
A bridge between php and ruby
A bridge between php and ruby
Último
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
arts yokohama
2024 03 CTEA
2024 03 CTEA
arts yokohama
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
Matsushita Laboratory
2024 04 minnanoito
2024 04 minnanoito
arts yokohama
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
ssuser370dd7
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
arts yokohama
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
Sadao Tokuyama
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
Ayachika Kitazaki
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
ssuser539845
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
Shumpei Kishi
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
Tetsuya Nihonmatsu
Último
(12)
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 03 CTEA
2024 03 CTEA
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
2024 04 minnanoito
2024 04 minnanoito
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
詳説ぺちぺち
1.
詳説ぺちぺち 闇PHP勉強会 +
PHPソースコード リーディングワークショップ 2012/01/28 do_aki
2.
do_aki (どぅーあき) • |所属|
> 株式会社もしも (ドロップシッピング・アフィリエイトASP) • |仕事| > インフラ(サーバ管理)兼 Webアプリケーション開発 • |出現| > 渋谷・山手線沿線 • |特性| > PHPer http://do-aki.net/
3.
あじぇんだ •
第1章 ぺちぺち • 第2章 Scanner (字句解析器) • 第3章 Parser (構文解析器) • まとめ
4.
第1章 ぺちぺち
5.
Japanese Programming
Language らきすた風 画像生成 (ジェネレーター) http://raki.st/
6.
闇鍋的 PHP 魔改造 2011/09/10 PHPカンファレンス2011
Presented By do_aki
7.
PHPの言語そのものの作りとかよく 知らないし、内部構造もよく分か らないけど、オレオレPHPを作って みたくてトライ&エラー繰り返し ていたら気づいたらPHPを基にした
日本語プログラミング言語ができ ちゃってたから発表してみたよ! ・・・というもの
8.
<?php function
HelloPHP() { echo "Hello PHP World"; } HelloPHP(); PHP ぺちぺち 関数 はろーぺちぺち() ここから 「"はろー ぺちぺち わーるど"」と表示; ここまで ぺちぺち はろーぺちぺち();
9.
条件分岐 もし [条件] ならば
… そうでないならば … 条件おわり
10.
繰り返し 繰り返し [条件] の間 ここから
… ここまで
11.
変数/条件/演算子 変数:ほげ は 0
です 1 が 2 より小さい (1<2) 1 が 2 より大きい (1>2) 1 足す 2 (1+2) 10 を 3 で割った余り (10%3)
12.
組み合わせると ぺちぺち 変数:ほげ は 1です; 繰り返し
変数:ほげ が 10 以下 の間 ここから もし 変数:ほげ を 3 で割った余り が 0 に等しい ならば 「 “アホn"」と表示; そうでないならば 「 変数:ほげ,"n"」と表示; 条件おわり 変数:ほげ に 変数:ほげ 足す 1 を代入; ここまで
13.
ぺちぺち と PHP
の違い ・Zend/zend_language_scanner.l add 98 lines & modify 22 lines ・Zend/zend_language_parser.y add 65 lines & modify 1 line
14.
第2章 Scanner
15.
スキャナの状態 zend_language_scanner.l
の半分から下あたり <ST_IN_SCRIPTING>"function" { return T_FUNCTION; } この文字列 このトークンを 返す が来たら <ST_IN_SCRIPTING>“{“ { yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return '{'; }
16.
スキャナの状態 zend_language_scanner.l
の半分から下あたり <ST_IN_SCRIPTING>“def" { return T_FUNCTION; } この文字列 このトークンを <?php返す が来たら <ST_IN_SCRIPTING>“{“ { の代わりに def function def hello() { echo “like ruby?”; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return '{'; なんちゃって ruby のでき } } あがり
17.
ぺちぺちでは <ST_IN_SCRIPTING>“function“|”関数” { <ST_IN_SCRIPTING>"function" {
return T_FUNCTION; } <ST_IN_SCRIPTING>“{“ { ここから” { <ST_IN_SCRIPTING>“{“|” yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return '{'; }
18.
スキャナの状態 •
INITIAL • ST_IN_SCRIPTING • ST_LOOKING_FOR_PROPERTY • ST_LOOKING_FOR_VARNAME • ST_VAR_OFFSET • ST_DOUBLE_QUOTES • ST_BACKQUOTE • ST_HEREDOC • ST_NOWDOC • ST_END_HEREDOC
19.
ほとんどはこの状態
スキャナの状態 • INITIAL 初期状態 • ST_IN_SCRIPTING 基本状態 • ST_LOOKING_FOR_PROPERTY ->これ • ST_LOOKING_FOR_VARNAME ${ これ} • ST_VAR_OFFSET $xxx[これ] • ST_DOUBLE_QUOTES “これ” • ST_BACKQUOTE `これ` • ST_HEREDOC <<<“DOC” の後 • ST_NOWDOC <<<‘DOC’ の後 • ST_END_HEREDOC DOC の終わり
20.
ぺちぺち動かず ぺちぺち echo
"petipeti!n"; OK ぺちぺち NG echo "petipeti!n";
21.
<INITIAL>"<?php"([ t]|{NEWLINE}) <INITIAL>("<?php"|"ぺちぺち")([ t]|{NEWLINE})
{ <ST_IN_SCRIPTING> ("?>"|"</script"{WHITESPACE}*">"){NEWLINE}? { <ST_IN_SCRIPTING> ("?>"|"</script"{WHITESPACE}*">"|"ぺちぺちおしまい"){NEWLINE}? { これだけじゃ足りない orz <INITIAL>{ANY_CHAR} ???
22.
落とし穴 • “変数”の扱いは少し複雑 –
3カ所 + 隠し1カ所 (Parser 側からのみ参照) • 複雑な処理をしているところも – HEREDOC , NOWDOC – __CLASS__ • 簡単にセグる
23.
<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES ,ST_HEREDOC,ST_BACKQUOTE,ST_VAR_OFFSET> "$"{LABEL} {
zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } <ST_IN_SCRIPTING,ST_DOUBLE_QUOTES ,ST_HEREDOC,ST_BACKQUOTE,ST_VAR_OFFSET> (“$“|”変数:”){LABEL} { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; } return T_VARIABLE; NG
24.
<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES ,ST_HEREDOC,ST_BACKQUOTE,ST_VAR_OFFSET> "$"{LABEL} {
zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } 変数名をコ ピーして保持 <ST_IN_SCRIPTING,ST_DOUBLE_QUOTES ,ST_HEREDOC,ST_BACKQUOTE,ST_VAR_OFFSET> ”変数:” {LABEL} { zend_copy_value(zendlval, (yytext+7), (yyleng-7)); zendlval->type = IS_STRING; return T_VARIABLE; }
25.
第2章 Scanner まとめ •
元々あるキーワードの変更/追加は簡単 • スキャナの状態もほとんど意識する必要 はない • ところどころ Cで無理矢理処理してる部分 があるので注意
26.
第2章 Scanner
完
27.
第3章 Parser
28.
Scanner によるトークンへの分解 <?php
T_OPEN_TAG T_VARIABLE $x = $a + 1; ‘=‘ ++$x; T_VARIABLE ‘+’ T_LNUMBER ‘;’ T_INC T_VARIABLE ‘;’
29.
Syntax Error
T_LNUMBER ‘=’ 1 = $a; T_VARIABLE ‘;‘ Perser にトークンの並びが定義さ れていない
30.
zend_language_parser.y
ルール名 fully_qualified_class_name: namespace_name { $$ = $1; } | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); } | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), …(省略) } ; トークンの 処理(C言語+α) 並び
31.
zend_language_parser.y
拡張するために 新たにルールを作る BAD 処理をどう書けばいいのか分 からない orz
32.
似ているルールを真似る
33.
T_VARIABLE
$a + 1 ‘+’ T_LNUMBER expr '+' expr { zend_do_binary_op(ZEND_ADD, &$$, & $1, &$3 TSRMLS_CC); } New! T_VARIABLE $a 足す 1 T_JA_PLUS T_LNUMBER expr T_JA_PLUS expr { zend_do_binary_op(ZEND_A DD, &$$, &$1, &$3 TSRMLS_CC); }
34.
IF 文 T_IF '('
expr ')' { zend_do_if_cond(&$3, &$4); } statement { zend_do_if_after_statement(&$4, 1); } elseif_list else_single { zend_do_if_end(); } else_single: /* empty */ | T_ELSE statement PHP T_JA_IF expr T_NARABA { zend_do_if_cond(&$2, &$3); } inner_statement_list { zend_do_if_after_statement(&$3, 1); } ja_else_single T_OWARI { zend_do_if_end(); } ja_else_single: /* empty */ ぺちぺち | T_JA_ELSE inner_statement_list
35.
落とし穴 • 突然現れる ‘$’
– Scanner で T_VARIABLE として処理されてな い!? • 本気でやるなら opecode / ZendAPI の知識 が必須 • コンパイルしてみないと分からない
36.
Parser は 複雑なパズル
解きやすくするツール・方法あったら教えてほしいなー
37.
第3章 Parser
完
38.
まとめ
39.
Phpをいじり倒す10の方法 (2009) http://www.slideshare.net/moriyoshi/php10
40.
言いたかったこと • オレオレPHP作るの難しくないよ! • 拡張作るのも良いけど、言語そのものに
コミットメントしてもいいんじゃないか な • PHPを楽しむ人が増えて、PHP がより一層 面白いものになってくれたらいいな
41.
改造のお供に • GNU GLOBAL
(http://www.gnu.org/software/global/) – 静的にソースコードを解析するのに便利! – PHP のソースを展開したディレクトリで htags -Ffgnasv – CGI 使えれば検索も可能
42.
最後に • ぺちぺちは github
においてあります • http://git.io/petipeti
43.
ありがとうございました • 質疑応答?
Descargar ahora