質問

コンパイラ(字句、構文、意味解析装置)を実装する必要があります。 私はすでにFlex ++、Syntaxからの字句(再帰的降下)から既に実装しました、 私は意味論(既存のパーサへの意味論を追加する)に取り組んでいます。 私の質問は、属性を実装する方法です。 たとえば、製造の場合:

TYPE -> integer
.

意味論を追加する必要があります:

TYPE.type = integer
.

だからここでは、すべての文法記号のためにタイプのための構造などを作成する必要があります。 それで、その構造をどのように実装するのですか?文法記号の記号についていくつかの構造体を作成する必要があり、ファイルの範囲のグローバルになる必要がありますか?

p.S。たぶんそれは最高のコンパイラの実装ではありません、それは割り当てに対する必要条件です。

役に立ちましたか?

解決

あなたの言語の各端末と非終端の非終端のタイプ(通常は構造体)を定義している場合は最も簡単です。次に、(ノン)端末の各使用はタイプにアクセスし、属性の各割り当ては(非)端末に関連付けられた構造内の対応するスロットに及ぼす。

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

になります。

あなたの例では、 "type"はt_attributesのスロットになります。おそらくあなたが抽象的に書くことを意味するものは次のとおりです。

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

これを手で実行していることを考慮して、ツリーウォークがタイプノードにヒットしたときに実行する属性割り当てをハンドコンパイルします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top