Language.C : A C99 library for Haskell

by syoyo

(via reddit.com)

http://www.sivity.net/projects/language.c/wiki/

Language.C is a C99 library for Haskell, and recent report says that Language.C can parse 18 million lines of pre-processed source without a hitch.


Parsing the Linux kernel with Haskell: experience with Language.C

[Ja]

Haskell の Language.C という C99 パーサ•解析モジュールが結構使えそう.

Linux カーネルのソースを、(プリプロセス後のソースに対して)問題なくパースできるほどの機能を持っている.
パーシングの速度は gcc の 3倍くらいかかる.

でも, たとえば C ベースのオレ言語作成とか、
C 言語になんらかの言語的ハックを加えたいという用途であれば、
速度はそんなに問題でないから、
これだけの C99 パース機能を持ったライブラリはとても役に立ちそうだと思う.

OCamler には, CIL という同じような C 言語をパースできるライブラリがあります.
これも結構良く出来ています.
ドキュメントを読むと、
「C99 パーサなんて二週間でできるべ、と思ってプロジェクトを始めたけれども甘かった、一年以上もかかってしまったよ、、、」
となんとも涙ぐましい.

さて Language.C ですが、
ちょっと試した感じではなんかパースした AST そのままをプリント(show)するのができないですねこれ.
ノードによっては Show できるのもあるけれども、すべてのノードが Show できるわけではない.
そのかわり pretty printer があるけれども、ほんとに pretty に表示するので元の C コードみたいなのが出力されるから解析目的のためのダンプに使えない.
AST そのまま表示というのがあればデバッグとか、C コードがどんな感じでパースされて木になっているのか分かりやすいのだと思うのだけれども.

ちなみに最近 Packrat parser や PEG(Parsing Expression Grammer) について調べていて、
Language.C がそのようなパース技法を使っていたら参考になるかなと思ったのですが、
Alex/Happy( C でいう lex/yacc) を使っていた(ので PEG の勉強の参考にならなかった).

—-

そういえば今更ながら hasell.org を見て知ったのですが、Haskell ってクレディ•スイスやドイチュバンクなどの金融で使われているのですね. ドイチュバンクはトレードソフトに使われているらしい.

OCaml も結構使われている( Caml trader ) し, だんだんと世の中関数型がやはり注目されてきているのかなぁと感じています.

Advertisements