2009-06-10 14 views
1

私は、アプリケーションの設定ファイル(プレーンテキストとラインベース - > EOL = 1つの設定)用に独自のファイルフォーマットを開発しました。このフォーマットは何も特別な理由で終了しません。私がこれを行う唯一の理由は、何かを学ぶことです!リーダー関数とライター関数はC言語で実装されます(GLibはUTF8エンコードファイルである必要があるため)。独自のConfigformatを書くには

これで、この形式をCコードで実装する方法について考えています。できるだけ良いエラーメッセージを得るには、どのステップを実行する必要がありますか。私はLexer、Parserについて何か聞いたことがありますが、それでも深く進んだことはありません。私はそれらの非常に抽象的なアイデアしか持っていません。 それでは、将来の変更に対しても維持可能な、フォーマットのためにCで書かれたきれいな読者を得るために必要なステップは?学ぶ/考えられるトピックは何ですか?

はい、私は知っています:Cは痛みです。この提案のためにさまざまな "セクシー"なフォーマットがあります。 私は何かを学びたい!

乾杯、 グレゴール


追加情報

  • リーダー/ライター/パーサ(または何でもそれを呼び出しては)/第三者のプログラムにできるだけ依存すべきですコンポーネント。この設定部分のアプリケーションは既にGLibを使用していますので、GLibはUTF8でも使用されます
+1

私はあなたにLuaをお勧めします。これは、設定パーサとして使用できる軽い動的言語です;-) Luaサイトでは、設定として使用する方法のドキュメントがあります;-) –

答えて

1

libconfigソースコードを見てください。それはあなたが出発点として使うことができる軽量のパーサを持っており、それはおそらくあなた自身のフォーマットのパーサーがどのように見えるかを理解するのに役立ちます。

パーザとレクサーについて本当に知りたいのであれば、単純なコンパイラを実装するほうがよいでしょう。あなたが従うことができるMIT courseがあります。

+0

申し訳ありませんが、私は何とかあなたの答えを見落としています。 Libconfigはほぼ1:1の設定ファイル形式です:-)。すばらしいです!これは私の同僚を幸せにしてくれるはずです。答えとlibconfigの内側のすべてのリンク/アイデアを調べるのにもっと時間があります。 – Gregor

1

問題の深刻な理解に応じて、手動でパーサを書き込まないようにする必要があります。もちろんそうすることはできますが、それはもっと複雑になりますし、あなたの言語に新しい機能を追加すると、レクサーとパーサーコードを常に適応させるという問題が発生します。

良いことは、あなたの入力とその構造の高水準の説明からこのようなものを生成できるツールがたくさんあることです。そうするための標準的な* nixツールは、LexとYacc(またはそれらの子孫FlexとBison)ですが、代わりにANTLR(http://www.antlr.org)を指摘したいと思います。その優れた機能の1つは、さまざまな言語(C/C++、Java、Python、Ruby、C#など)のバックエンドを提供しているため、これを使用する方法を学ぶことは、後の時点での言語。

+0

非常にintrestingものこのANTLR。だから私は他の言語で設定ファイルのためのツールを簡単に提供することができます...私はそれを見てきました! – Gregor

5

設定フォーマットを作成するためのすばらしい方法の1つは、スクリプト言語を埋め込むことです。

これはあなたの自由のためのパーサを与え、あなたにその場でデータを生成したり、再利用されている変数を定義する可能性を提供します:

は醜い擬似スクリプト言語対XMLのこれらの例を考えてみましょう:

<InputPoints> 
    <Point> 
    <x>1.0</x> 
    <y>1.0</y> 
    </Point> 
    <Point> 
    <x>1.0</x> 
    <y>2.0</y> 
    </Point> 
    <Point> 
    <x>1.0</x> 
    <y>3.0</y> 
    </Point> 
    <Point> 
    <x>1.0</x> 
    <y>4.0</y> 
    </Point> 
<InputPoint> 

VS:

for(i = 1; i <= 4; ++i) { 
    InputPoint(1, i); 
} 

または多分

<Username>allanballan</Username> 
<Accountname>allanballan</Accountname> 
<HomeDirectory>/home/allanballan</HomeDirectory> 

user = "allanballan"; 
Username = user; 
Accountname = user; 
HomeDirectory = "/home/"+user; 

対最初の例では、いくつかの文にポイントのリストを圧縮し、第二の実施例は、一時的な変数を使用して冗長データの多くを削除する方法を示します。

このような状況でよく使われる言葉はLuaです。スクリプト言語をコンフィグレーションにマップする方法はインテグレータに任されていますが、それは本当に強力で、解析と型チェックは無料です。

+0

(+1)スクリプト言語に依存する設定ファイルについては、非常に良い点です。私はすでにこの種のものをいくつか使用しており、素晴らしいです。しかし、私が提案するには、これはあまりにも多いです。可能な限り他のプログラムに依存する必要があります。 – Gregor

+0

tclも良い選択です。 APIは本当にシンプルで、構文はしばしば設定ファイルに適しています。 – falstro

関連する問題