1

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

だから今、私はこのフォーマットをCコードで実装する方法を考えています。可能な限り良いエラーメッセージを取得するために私がしなければならないステップ。Lexer、Parser、...について何か聞いたことがありますが、深く掘り下げすぎたことはありません。私はそれらについて非常に抽象的な考えしか持っていません。では、このフォーマット用にCで記述されたクリーンなリーダーを取得するには、どの手順を実行する必要がありますか。これは、将来の変更にも対応できます。学ぶ/考えるトピックは何ですか?

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

乾杯、グレゴール


追加情報

  • リーダー/ライター/パーサー(またはそれが呼ばれるもの)は、サードパーティのプログラム/コンポーネントにできるだけ依存しないようにする必要があります。この構成部分の周りのアプリケーションはすでにGLibを使用しているため、GLibはUTF8にも使用されます。
4

3 に答える 3

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>

対:

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;

最初の例は、ポイントのリストをいくつかのステートメントに圧縮します。2 番目の例は、一時変数を使用して多くの冗長データを削除する方法を示しています。

この種の状況でよく使用される言語はLuaです。スクリプト言語を構成に正確にマッピングする方法はインテグレーター次第ですが、非常に強力で、解析と型チェックが無料で付属しています。

于 2009-06-10T09:50:27.743 に答える
1

libconfigのソース コードを参照してください。開始点として使用できる軽量のパーサーがあり、独自の形式のパーサーがどのように見える必要があるかを理解するのにおそらく役立つでしょう。

ただし、パーサーとレクサーについて本当に学びたい場合は、単純なコンパイラを実装する方がよいでしょう。あなたがたどることができるMITコースがあります。

于 2009-06-10T09:30:08.000 に答える
1

問題をどの程度深く掘り下げたいかによって、パーサーを手動で作成しないことを検討する必要があります。もちろんそうすることができますが、それははるかに複雑になり、言語に新しい機能を追加すると、レクサーとパーサーのコードを常に適応させるという問題が発生します。

良いことに、入力とその構造の高レベルの記述からこのようなものを生成できるツールがたくさんあります。そのための標準的な *nix ツールは Lex と Yacc (またはその子孫である Flex と Bison) ですが、代わりに ANTLR ( http://www.antlr.org )を紹介したいと思います。その優れた機能の 1 つは、多くの異なる言語 (C/C++ だけでなく、Java、Python、Ruby、C# など) のバックエンドを提供することです。言語については後述します。

于 2009-06-10T09:33:59.477 に答える