语法导向翻译

时间:2012-12-17 20:29:58

标签: compiler-construction syntax context-free-grammar

我需要有关语法导向翻译的帮助。我不知道如何分解语法,以便我可以为它生成四倍。

举个例子:

S ::= If E then S1 else S2 

分解为此(因为我们不知道跳跃目标)

1. <ifstmt> ::= <truepart> S2
2. <truepart> ::= <ifclause> S1 else
3. <ifclause> ::= if E then

分解时的一般方法是什么?

1 个答案:

答案 0 :(得分:1)

通常,您可以在需要生成代码的地方(在if-then-else中演示)将每个语法结构分开,并将代码生成操作附加到解析器的语法规则减少操作

虽然你可以这样做,但你会得到相当笨拙的代码;从根本上说,你最终会实现一个堆栈机器,因为纯语法不能跟踪上下文,所以你必须假设它是递归构造的(例如,类似堆栈)。如果你这样做,你将会以比你真正想要的更多和愚蠢的四倍结束。所有这一切都浪费了后端的时间,如果它正在优化,或者导致它产生愚蠢的代码,如果没有。

主要是当一个人生成四边形时,一个人比一个比“语法导向翻译”更复杂的东西更有趣。在这种情况下,最好构建一个AST,构造符号表并控制流程图,甚至可能是数据流图,然后从中构建四元组。

然后,您可以专注于构建一个良好的后端来处理这些四边形。