2009-08-28 4 views
0

テンプレートツールキットのような最小限のテンプレート言語を実装したいと思いますが、もっと簡単です。 私は既存の実装/ライブラリを使用したくないですが、何かを学びたいので最初から始めてください。私はそれを私のニーズに採用するために完全に理解したいと思います。 最終製品はC言語でなければなりませんが、おそらくPerlでプロトタイプを作成しようとします。 最初は、変数を代入して他のファイルも含めて扱いたいだけです。いくつかの高度な解析を必要とする/ elseif/else/endif-constructがあれば、難しい部分は任意に入れ子になります。構文解析のヒント

 
<h1>[% substitute title %]</h1> 
<p> 
[% if foo %] 
foo is true 
[% elseif bar %] 
[% if baz %] 
bar and baz are true 
[% endif %] 
bar is true 
[% else %] 
<em>none<em> is true 
[% endif %] 
</p> 

私はまともなCといくつかのPerlのスキルが、解析で全く知識を持っているので、私もまさに私が探していますかわからない:

は、ここでその意図した使用方法を説明する例です。 だから私は

アルゴリズムが
  • 最小限、十分に文書/例がコメントし
  • この
  • 読み取り、そのようなアルゴリズムに関する勧告、ここでは関係の解析に最小限の紹介、またはチュートリアルのような構文解析を処理することができます
    • (Iに興味があると思いますTTソースからはあまり意味がない)

    TIA。

  • 答えて

    0

    これまでのところ同様のquestionに一般的な回答を書いています。 Hopefuly、それはあなたがいくつかの出発点を見つけるのを助けることができます。

    1

    Cを使用している場合は、(f)lexとyacc/bisonを試してください。彼らは使いにくいです。

    さらに、SOのコンパイラの基本についていくつか質問があります。

    だけで基本:

    最初のステップは、トークンストリームに文字列を変換することです。

    たとえば、[%と%]は2つのトークンです。しかし、識別子もトークンです。

    次のステップは、文法を検出して実行することです。これを行うには、構文ツリーを構築します。

       [if] 
          /| \ 
          / | \ 
          | Exp | 
          | | | 
          | foo | 
          |  | 
         "foo is.." elsif 
           /| \ 
           / | \ 
            | Exp | 
            | | | 
            | bar | 
            |  | 
            if  "none is true" 
           /| \ 
          / | \ 
           | Exp | 
           | | | 
           | baz | 
           |  | 
         "bar and..." empty 
    

    そして、ツリーを実行します。つまり、if(else)ifの各ノードに対して式を評価し、trueの場合は真のブランチを、falseの場合はfaseブランチを実行します。

    +0

    ありがとうございます。それはブートムームアップ解析(http://en.wikipedia.org/wiki/Bottom-up_parsing)ですか?私はコンセプトや用語に精通しているので、少なくともGoogleのものは使えるようにしようとしています。 –

    +0

    Gamecatの投稿に表示されているものは、一般的にAST(抽象構文木)と呼ばれています。構文解析時には、トークンストリームは通常、最初にパースツリーに変換され、次にASTに変換されます。 – Noldorin

    +0

    @JG:ボトムアップ解析は、特定のタイプの解析の総称です。理論を習得したい場合は、トップダウン解析(より具体的には、再帰的降下)から始めるのが最善でしょう。 – Noldorin

    0

    JavaCCは、Javaでコンパイラを作成するためのJavaコンパイラコンパイラです。プログラミング言語やインタプリタを作成したい場合は、ソフトウェアの非常に有用なビット。