Compiler construction 句法定向翻译

Compiler construction 句法定向翻译,compiler-construction,syntax,context-free-grammar,Compiler Construction,Syntax,Context Free Grammar,我需要语法指导翻译方面的帮助。我不知道如何分解语法,这样我就可以为它生成四倍 举个例子: S ::= If E then S1 else S2 被分解成这个(因为我们不知道跳转目标) 1.:=S2 2. ::= S1其他 3. ::= 如果E那么 分解时的一般方法是什么?通常,在可能需要生成代码的位置将每个语法构造分开(如您在if-then-else中所演示的),并将代码生成操作附加到解析器的语法规则简化操作 虽然您可以这样做,但您将得到相当笨拙的代码;从根本上说,您最终将实现一个堆

我需要语法指导翻译方面的帮助。我不知道如何分解语法,这样我就可以为它生成四倍

举个例子:

S ::= If E then S1 else S2 
被分解成这个(因为我们不知道跳转目标)

1.:=S2
2.  ::=  S1其他
3.  ::= 如果E那么

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

通常,在可能需要生成代码的位置将每个语法构造分开(如您在if-then-else中所演示的),并将代码生成操作附加到解析器的语法规则简化操作

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

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

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

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