2012-03-13 10 views
2

コンパイラ(字句解析、構文解析、セマンティック解析)を実装する必要があります。 私は既にflex ++の構文を手続き(再帰的なdescent)、 から実装しています。私は意味論(セマンティックルールを既存のパーサに追加する)に取り組んでいることを知っています。 私の質問は - 私はどのように属性を実装するのですか?生産のための例えば 、:すべての文法シンボルのようにだからここに私はTYPEのためのいくつかの構造を作成する必要が文法シンボルの属性はC言語での実装

TYPE.type = integer 

、および:

TYPE -> integer 

私はセマンティックルールを追加する必要があります。 どうすればその構造を実装できますか?文法記号ごとにいくつかの構造体を作成する必要があり、ファイルの範囲に対してグローバルにする必要がありますか?

p.s.多分それは最良のコンパイラの実装ではなく、割り当てのための必要条件です。

答えて

2

各端末にタイプ(通常は構造体)を、言語に非終端記号を定義するのが最も簡単です。次に、(非)端末の使用はそのタイプへのアクセスを有し、属性の各割り当ては(非)端末に関連する構造の対応するスロットに向かう。

文法トークンの後に実装構造の名前を付けることをお勧めします。したがって、Tの属性構造のタイプは "T_attributes {...}"となります。

たとえば、 "type"はT_attributeのスロットになります。おそらく何を抽象的に記述することを意図していた:

TYPE -> 'integer' ; -- 'integer is a keyword' 
TYPE.type = "int"; -- the type of an 'integer' is "int" 

あなたが手でこれをやっている考えると、あなたは木の散歩は、TYPEノードに当たったときに実行する属性の割り当てを手作業でコンパイルします。

関連する問題