flex bison编译器中的相互递归函数定义

时间:2017-03-10 19:46:57

标签: c bison flex-lexer

我正在为不存在的语言编写编译器(它是大学项目的示例语言)。在为函数定义保留的部分中,编译器应该能够正确编译这样的定义:

function a() {
    //some code...
    b();
    //other code...
}
//other function definitions
function b() {
    printf("hello\n");
}

编译器应解析函数“挂起”函数a中函数b使用的存在性检查的定义。在所有函数定义结束时,编译器将检查所有使用的函数是否先前已定义。任何人都可以提出一个聪明的方法吗?

1 个答案:

答案 0 :(得分:2)

除非您的语法存在严重的歧义问题,否则您不应该知道b是一个函数才能正确解析b()。所以在一般原则上,我说答案很简单:不做任何特别的事情,解析应该可以正常工作。

一旦你构建了AST,你就会想要进行一些语义分析,其中包括验证每个用作函数的名称​​是一个函数。您可能也会有其他语义限制。 AST的简单树步行应该能够告诉你需要知道什么。