2009-05-27 8 views
0

私は独自のIDEデザインファイルからプロパティとコードを抽出するアプリケーションを作成しようとしています。ファイル形式は次のようになります。シンプルなコードパーサーのデザイン戦略

HEADING 
{ 
    SUBHEADING1 
    { 
    PropName1 = PropVal1; 
    PropName2 = PropVal2; 
    } 

    SUBHEADING2 
    { 
    { 1 ; PropVal1 ; PropValue2 } 
    { 2 ; PropVal1 ; PropValue2 ; OnEvent1=BEGIN 
              MESSAGE('Hello, World!'); 
              { block comments are between braces } 
              //inline comments are after double-slashes 
              END; 
    PropVal3 } 
    { 1 ; PropVal1 ; PropVal2; PropVal3 } 
    } 
} 

私がしようとしているのは、副題の下に内容を抽出することです。 SUBHEADING2の場合は、各トークンをセミコロンで区切って区切ります。私は括弧を数え、私が現在いる下位見出しを追跡するだけで合理的に成功しました。私が遭遇した主な問題は、コードコメントを扱うことです。

この言語では、ファイルコメントの括弧で囲まれたブロックコメントに{}を使用しています。さらに面白くするためには、二重スラッシュのインラインコメントを考慮に入れ、行の最後まですべてを無視する必要があります。

これに取り組むための最善のアプローチは何ですか?私は、別の記事(ANTLR、Doxygenなど)で議論されたコンパイラライブラリのいくつかを見ていますが、この特定の解析問題を解決するには過度のようです。

+0

なぜXMLベースの構文を使用しないのですか? – xport

答えて

1

結果を使用するコードと組み合わせて正規表現を使用して、数時間で何かをまとめることができるはずです。

何かがうまくいくはずです: - ファイルを文字列にロードしてプロセスを初期化します。

  • 文字列から各トップレベルブロックを引き出し、regexタグを使用してブロックのキーワードと内容を別々に識別します。
  • ブロックが発見された場合、
    • は、キーワード
    • に基づいて意思決定を再帰的にこのプロセスにコンテンツを渡してください。これに続いて

、あなた見出し、小見出し、最初、2番目の小見出し、その後、各サブブロックを処理します。ブロックコメントを含むサブブロックについては、サブブロックがコメントであるというキーワードの不足に基づいて、おそらくサブブロックを処理する必要はありません。

+0

アドバイスをいただきありがとうございます。その結果、私は正規表現についてもっと学ぶために主導権を握った。 – polara

5

トークナイザとパーサを書くことをお勧めします。これにより、柔軟性が増します。トークナイザは、基本的にソースコードのテキスト形式の分解を行い、より有用なデータ構造にします。パーサーは何をして何をするのかを理解し、しばしば再帰を活用します。

規約Googleに:http://www.codeproject.com/KB/vb/math_expression_evaluator.aspx (あなたはこのように例を取ると、あなたが望むものに離れて、それをハックすることができるかもしれません)

:トークナイザ、パーサ、コンパイラの設計は、

数学の式の評価を文法解析の詳細:http://www.codeproject.com/KB/recipes/TinyPG.aspx

これらの記事にはほとんど触れる必要はありませんが、最初に少し勉強したいと思っています。

1

どちらのソリューションを選択しても、2つのパーサー/トークナイザを持つことをお勧めします。 1つはメインファイル構造で、グループ化文字として{}を使用し、コードブロックに1つを使用します。