3

我需要语法导向翻译方面的帮助。我不知道如何分解语法,以便为它生成四元组。

举个例子:

S ::= If E then S1 else S2 

被分解成这个(因为我们不知道跳跃目标)

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

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

4

1 回答 1

1

通常,您在可能需要生成代码的地方将每个语法构造分开(正如您使用 if-then-else 演示的那样),并将代码生成操作附加到解析器的语法规则缩减操作。

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

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

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

于 2012-12-18T01:24:04.330 回答