2012-09-18 8 views
6

Haskellを学び(自分自身を苦しめる)練習として、設定可能なHaskellコード美容師を書くことを検討しています。ASTへのHaskellパーサ

それは、構成JSONやYAMLで記述されたファイル(またはより良い何か?) dataclass文、セクション間の行数、など私は

を、輸入を並べ替え並べ替え/グループ化のような選択肢を指定するサポートします

抽象構文木(AST)を生成し、コメントを保持するHaskell 98のパーサを探しています。 GHCの言語拡張を解析すると、ボーナスになります。

このようなことがない場合、私は再帰的降下パーサを書くことができます。あるいは、Parsecまたはパーサージェネレータを使用して書き込むことができます。たぶん自分自身を回転させると、学習が増えます(そして、拷問:-))。

オープンソースライセンスのいずれかで利用可能な完全なHaskell-> ASTパーサーがありますか?私がこのプロジェクトを進めていくと、私はそれをgithubに載せます。

+0

私のペットのかわいこは醜いコードです。私の仕事のほとんどはJavaであり、人々はブレースの整列や演算子の間隔の不一致などでコードをチェックインする方法を驚かせています。彼らは自分のコードを読んでいませんか?それはそれらを気にしないのですか?多分私のOCD。とにかく、私はアウト・オブ・ボックス・ハスケルがそれほど素晴らしい見た目のオーダーであることに同意します。しかし、私はまだ美しい人を書いています:-)。 – Ralph

+0

はい。あなたが提案しているようなものが好きなので、私は本当に冗談を言っていました。 configファイルの言語としてhaskellを使わないのはなぜですか?私は徐々に彼らがちょうどhaskellを望んでいたことを理解するまで、設定のためにドメイン固有の言語を徐々に進化させていく人について読んだと確信しているが[this](http://www.jmreardon.com/posts/2011-07-17-typesafe-config -in-haskell.html)が私が見つけた最も近いものです。または、[ConfigFile](http://hackage.haskell.org/package/ConfigFile)パッケージを使用することもできます。 – AndrewC

答えて

16

haskell-src-extsパッケージにはパーサーがあります。パーサは、GHC拡張のほとんどを解析するだけでなく、構文上のXMLリテラルなどの共通の拡張も認識します。コメント情報にアクセスしたい場合は、parseModuleWithComments関数を使用する必要があります。

ただし、コメントは実際の構文ツリーには格納されません。それらは位置情報とのコメントの別個のリストとして記憶される。線形マージアルゴリズム(両方の配列が「ソート」とみなされます)を使用してツリーをリストとマージすることによって、実際にツリーにコメントを含める必要がある場合は、ツリーにコメントを含めることはややこしいことです。 「注釈付き」ASTは各ノードに任意のメタデータを含めることができるため(デフォルトではSrcSpanInfoのみ)、関連するASTノードとともにコメントを保存することもできます。これが実際のhaskell-src-extsパッケージで行われなかった理由は、おそらくASTパーサがコメントパーサーの前に書かれているからです。

2

私はHaskellコードを自動フォーマットする簡単なツールを作成しました。それは、haskell-src-extsからの構文解析ときれいな印刷機能を使用して行います。それはhttps://github.com/djv/small/blob/master/tidy.hsで見つけることができます。より柔軟で強力なものの始まりになるかもしれません。