Haskell Hackathonに参加してきた
昨日はHaskell Hackathonに参加してきました
あんまり挑戦者がいなさそうなPHPで挑んでみたのですが、蓋を空けてみると3人もいてびっくり
とりあえずやったことをつらつらと書いてく
Hugs 98のparse.yを持ってくる
Hugs 98にparse.yがあったので、とりあえずそれを持ってくる
parser.phpyを作成
parse.yからphpのプログラムが埋め込まれたparser.phpyを作成
これをkmyaccにかければ、parser.phpができる
字句解析器
字句解析は面倒なので、phpのtokenizerを使いました
phpのtokenizerを使うとphpのプログラムの字句解析を簡単に行う事ができます
もちろんこれはhaskell用ではないので、完全ではありませんが大体うまくいきました
うまく行かない部分は無理矢理処理してやるということで
サンプルプログラムを通してみる
字句解析と構文解析はできるようになったので、この時点でサンプルプログラムをいくつか通してみる
インデントのないプログラムはうまくいくんだけど、インデントのあるプログラムがパースエラーになってしまう ><
実はこれがオフサイドルールだということを知りました
構文解析と字句解析の間でなにやら処理をしないといけないみたいですね
今回はやらないってことで無視しました
いろいろクラスを追加
別にPHPパーサの処理系を書いてきたので、それを流用してクラスをいろいろ追加
- haskellNonterminal - 非終端記号用
- haskellParser - 構文解析用
- haskellTerminal - 終端記号用
- haskellTokenizer - 字句解析用
簡単なプログラムを動かす
なんとかここまできて、プログラムの解析はできるようになってきたけど、Hugs 98のparser.yが複雑でどこから手をつけていいか、全然わかりません
そりゃちゃんとしたHaskellの処理系のyaccなんだから当たり前なんだけど
どうにかして、次のような簡単なプログラムの実行にこぎつけました
main = print (1 + 2 * 3 + 4 * 5 * 6)
演算子の優先順位が...
実際に実行してみた結果は「390」
あれっ?これ間違ってるじゃん、と思ってよくよく考えてみると演算子の優先順位が全然考慮されてない
確かにyaccのファイルを見ると演算子の優先順位って定義されてない
Haskellは演算子の優先順位を変更する事ができるので、構文定義では演算子の優先順位を定義してない模様
どうやって解決すればいいか、検討もつかないので放置
まとめ
Haskellも関数型言語もよく知らないのに、参加してみたけど、やっぱり周りのレベルが超たけー
いつもとは違う新鮮な感じでとても良い刺激になりました
開催してくれた、yukoba, amachang, nishio、ありがとうございます!!
全然できてないけど一応僕が作った奴は公開しておきます