btoメモ

なんか適当に書く

Haskell Hackathonに参加してきた

昨日は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