php: 2008年3月アーカイブ

昨日はHaskell Hackathonに参加してきました
あんまり挑戦者がいなさそうなPHPで挑んでみたのですが、蓋を空けてみると3人もいてびっくり

とりあえずやったことをつらつらと書いてく

Hugs 98のparse.yを持ってくる

Hugs 98にparse.yがあったので、とりあえずそれを持ってくる
C言語の部分をばっさり削除 parser.y

parser.phpyを作成

parse.yからphpのプログラムが埋め込まれたparser.phpyを作成
y2phpy.rbというスクリプトファイルで機械的に作った
これをkmyaccにかければ、parser.phpができる

字句解析器

字句解析は面倒なので、phpのtokenizerを使いました
phpのtokenizerを使うとphpのプログラムの字句解析を簡単に行う事ができます
もちろんこれはhaskell用ではないので、完全ではありませんが大体うまくいきました
うまく行かない部分は無理矢理処理してやるということで

サンプルプログラムを通してみる

字句解析と構文解析はできるようになったので、この時点でサンプルプログラムをいくつか通してみる
インデントのないプログラムはうまくいくんだけど、インデントのあるプログラムがパースエラーになってしまう ><
実はこれがオフサイドルールだということを知りました
構文解析と字句解析の間でなにやら処理をしないといけないみたいですね
今回はやらないってことで無視しました

いろいろクラスを追加

別にPHPパーサの処理系を書いてきたので、それを流用してクラスをいろいろ追加

簡単なプログラムを動かす

なんとかここまできて、プログラムの解析はできるようになってきたけど、Hugs 98のparser.yが複雑でどこから手をつけていいか、全然わかりません
そりゃちゃんとしたHaskellの処理系のyaccなんだから当たり前なんだけど
どうにかして、次のような簡単なプログラムの実行にこぎつけました

main = print (1 + 2 * 3 + 4 * 5 * 6)

演算子の優先順位が...

実際に実行してみた結果は「390」
あれっ?これ間違ってるじゃん、と思ってよくよく考えてみると演算子の優先順位が全然考慮されてない
確かにyaccのファイルを見ると演算子の優先順位って定義されてない
Haskellは演算子の優先順位を変更する事ができるので、構文定義では演算子の優先順位を定義してない模様
どうやって解決すればいいか、検討もつかないので放置

まとめ

Haskellも関数型言語もよく知らないのに、参加してみたけど、やっぱり周りのレベルが超たけー
いつもとは違う新鮮な感じでとても良い刺激になりました

開催してくれた、yukoba, amachang, nishio、ありがとうございます!!

全然できてないけど一応僕が作った奴は公開しておきます

php_haskell

このアーカイブについて

このページには、2008年3月以降に書かれたブログ記事のうちphpカテゴリに属しているものが含まれています。

前のアーカイブはphp: 2007年8月です。

次のアーカイブはphp: 2008年4月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。