我正在学习一个编译器设计课程,我们必须在其中实现我们自己的编译器(使用 flex 和 bison)。我有解析(编写 EBNF 和递归下降解析器)的经验,但这是我第一次编写编译器。
语言设计是相当开放的(教授已经把它留给了我们)。在课堂上,教授复习了生成中间代码。他说,我们不需要在解析的时候构建抽象语法树或者解析树,我们可以随手生成中间代码。
我发现这令人困惑有两个原因:
如果你在定义之前调用一个函数怎么办?如何解决分支目标?我想您必须制定一个规则,即您必须在使用函数之前定义它们,或者可能预先定义它们(就像 C 一样?)
你会如何处理条件语句?如果您有一个
if-else
,甚至只有一个if
,您如何解决if
条件为时的分支目标false
(如果您正在生成代码)?
我计划生成一个 AST,然后在创建它之后遍历树,以解析函数和分支目标的地址。这是正确的还是我错过了什么?