2012-01-19 1 views
0

私は宿題としてシンプルなCコンパイラを作っています。私は、次の文法規則を持っている:compound_statementルールは私が直接fprintf()機能命令ではできない、function_definitionと呼ばれるようにいくつかのASMコードで関数をラップする

declarator: 
    push %ebp 
    mov %esp %ebp 

    // compound_statement (function instructions) 

    pop %ebp 
    ret 

function_definition 
: type_name declarator compound_statement 

私の意味規則は、に変換しなければなりませんそのセマンティックルール。しかし、Yacc型ではstreamstringを定義することはできません(my previous question参照)。

したがって、関数の命令を文字列に入れ(メモリ割り当て側で混乱するstrcatを使いません)、以前のASM命令でそれらをラップするにはどうすればよいですか?

答えて

1

あなたはおそらくとしてそのルールを記述することができます。

function_definition: 
    type_name declarator 
     { fprintf(..function prefix code..); } 
    compound_statement 
     { fprintf(..function suffix code..); } 
; 

と直接compound_statement出力コードのルールを持ち続けます。問題は、残りの文法によっては、コンパイルされたアクションがcompound_statementを解析する前に(アクションコードを実行するための)追加のNULL削減を導入するため、シフト/リダクションまたはリダクション/リダクションの競合が発生する可能性があるということです。

+0

これはサイモン・リッチャーが「ミッド・ルール」で提案したものです。それは私のために働いているようです。 –

0

2つの方法があります。

  • あなたは、その後、function_definitionルールのコードに引数として渡されcompound_statementルール、のコード内の関数本体の表現が含まれているオブジェクトを構築することができますいずれかまたは
  • mid-ruleコードにはGNU拡張機能を使用できます。
+0

したがって、 'compound_statement'に子ノードの出力を得る方法はありませんか?表現を行うことは非常に難しいでしょう。 –

+0

ミッドルールコードは標準のyacc機能であり、GNU拡張ではありません。ただし、これを使用すると、シフト/リダクションまたはリダクション/リダクションの競合が発生する可能性があります。 –

+0

「生成された出力を伴う文字列」を表現として使用できます。 –

関連する問題