8

C / C ++コードに直接埋め込むことができるマークアップコード(xmlやhtmlなど)を作成するためのメタ言語を作成しようとしています。これはこの言語で書かれた簡単なサンプルです。私はそれをWDI(Web開発インターフェース)と呼んでいます。

 /*
  * Simple wdi/html sample source code
  */
 #include <mySite>

 string name = "myName";
 string toCapital(string str);

 html
 {
  head {
   title { mySiteTitle; }
   link(rel="stylesheet", href="style.css");
  }
  body(id="default") {
   // Page content wrapper
   div(id="wrapper", class="some_class") {
    h1 { "Hello, " + toCapital(name) + "!"; }

    // Lists post
    ul(id="post_list") {
     for(post in posts) {
      li { a(href=post.getID()) { post.tilte; } }
     }
    }
   }
  }
 }

基本的には、html用のユーザーフレンドリーなインターフェイスを備えた変更されたCソースです。ご覧のとおり、従来のタグベースのスタイルは、中括弧で区切られたブロックを使用したCのようなコマンドに置き換えられています。このコードをhtmlに変換し、後でコンパイルできるようにCに挿入するインタープリターを作成する必要があります。C部分はそのままです。wdiソース内では、プリントを使用する必要はありません。すべてのreturnステートメントが出力に使用されます(printf関数で)。プログラムの出力はクリーンなhtmlコードになります。

したがって、たとえば、見出し1のタグは次のように変換されます。

h1 { "Hello, " + toCapital(name) + "!"; }
// would become:
printf("<h1>Hello, %s!</h1>", toCapital(name));

私の主な目標は、次のようにwdiソースをhtmlに変換するインタープリターを作成することです。

tag(attributes) {content}=><tag attributes>content</tag>

次に、インタプリタから返されたhtmlコードをprintfsを使用してCコードに挿入する必要があります。wdi内で発生する変数と関数も、printfパラメーターとして使用するためにソートする必要があります(サンプルソースのtoCapital(name)の場合)。

wdiのレクサーとパーサーを作成するための効率的な(高速パーサーを作成したい)方法を探しています。すでにフレックスとバイソンを試しましたが、それらが最高のツールであるかどうかはわかりません。良い選択肢はありますか?そのようなインタプリタを作成するための最良の方法は何ですか?この問題に関する簡単な文献を教えてください。

4

4 に答える 4

3

bison/flexまたはyacc/lexはそれを行うための伝統的な方法です。私見、目の前の仕事にこれほど適したものはありません。

タスクは正規言語(つまり、正規表現、単純なperlスクリプトなど)では実行できないため、パーサーが本当に必要であることに注意してください。

それを正しく行う方が良いです。最も適切なのは、yacc / bisonで生成されたパーサーが、手作りの再帰的な下降パーサーよりもはるかにクリーン(かつ高速)になることです。

于 2010-05-20T16:17:37.007 に答える
1

このチュートリアルを提案できますか:http ://www.icemanind.com

アセンブラとインタプリタを備えた独自の仮想マシンを作成する方法についてのチュートリアルがあります

于 2010-05-20T16:17:01.860 に答える
1

これに真剣に取り組んでいる場合は、既存のCパーサーを変更する必要があります。Edison Design Group Cフロントエンドはオプションかもしれませんが、実際には単なるC(C ++)フロントエンドになりたいと考えています。

もう1つのオプションは、DMS SoftwareReengineeringToolkitです。DMSは、文法から完全に駆動される完全なCパーサーを含むCフロントエンドで取得できます。

DMSは、言語の方言を作成するための直接サポートを提供します。あなたがやりたいのは、Cの方言を作成することです。これにより、目標がサポートされます。DMSは、トランスレータを構築するための多くの機械も提供しているため、方言を実際のCコードに変換して出力するのはかなり簡単です。

于 2010-06-08T09:51:11.953 に答える
1

そのような目的では、ブーストスピリットはバイソン/フレックスよりも優れている可能性があります。

于 2010-06-22T12:35:18.117 に答える