我正在制作一个简单的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指令包装它们?
答案 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
规则的代码或