通过某些ASM代码包装函数指令

时间:2012-01-19 20:17:02

标签: c++ c compiler-construction bison yacc

我正在制作一个简单的C编译器作为作业。我有以下语法规则:

function_definition
: type_name declarator compound_statement

我的语义规则应该将其转换为:

declarator:
  push %ebp
  mov %esp %ebp

  // compound_statement (function instructions)

  pop %ebp
  ret

由于compound_statement规则在 function_definition之前将被称为,我不能在其语义规则中直接fprintf()函数指令。但是,我无法在Yacc类型中定义任何streamstring(请参阅:my previous question)。

那么我该如何将函数指令放在一个字符串中(很容易,不使用strcat这会在内存分配方面搞乱)然后用之前的ASM指令包装它们?

2 个答案:

答案 0 :(得分:1)

您可以将该规则写为:

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

并继续直接拥有compound_statement输出代码的规则。问题在于,根据语法的其余部分,这可能会引入shift / reduce或reduce / reduce冲突,因为嵌入式操作会在解析compound_statement之前引入额外的null减少(运行动作代码)。

答案 1 :(得分:0)

有两种方法:

  • 您可以在compound_statement规则的代码中构建一个包含函数体表示的对象,然后将其作为参数传递给function_definition规则的代码
  • 您可以将GNU扩展用于中规则代码。