【问题标题】:Is there any way to write a compiler front end without using syntax-directed translation?有没有办法在不使用语法导向翻译的情况下编写编译器前端?
【发布时间】:2011-10-02 08:08:32
【问题描述】:

我的问题和标题一样。我只是想知道有没有其他翻译技术可以得到不依赖于将动作嵌入到解析器中的中间代码(即解析器会严格创建抽象语法树,它不会生成任何代码) .感谢您的任何回答。

【问题讨论】:

  • 我想您可以构建一个神经网络并对其进行训练,而无需任何嵌入知识 - 您是否有特殊需要避免在解析器中嵌入操作?
  • 不,我只是想知道是否有其他选择,我发现很难找到有关此事的信息。

标签: parsing compiler-construction code-translation intermediate-code


【解决方案1】:

如果您拥有解析器,那么解析器必须做的不仅仅是将输入流“识别”为该语言的有效实例。如果您希望编译器生成任何内容,则必须将某种操作附加到匹配语言片段的活动。从某种意义上说,它只能是“语法指导”;在解析阶段,你只有语法。

从根本上说,解析操作必须构建“更可编译”的程序表示。我只知道几个基本的方法:

  • 生成一组虚拟机指令
  • 构建抽象语法树以传递给编译器的其余部分
  • 构建代码的某种控制/数据流表示(例如,“三元组”)

这些在抽象上实际上几乎相同,因为解析器生成的表示包含链接结构,其元素具有一些直接的语义解释。 这些具有隐含语义的结构位是编译器的其余部分所关闭的。

现在,文本程序的表示。如果您决定将编译器实现为 Post 系统(一组重写字符串的规则),则可以完全避免“解析”过程(某种程度上)。这些是“如果你看到这个字符串,用这个另一个字符串替换它”的形式。 Post 系统具有图灵能力,因此从技术上讲,您可以使用一组足够聪明的字符串重写规则将源代码转换为代表目标程序的字符串。我认识的没有人以这种方式构建真正的编译器。我敢肯定,如果你足够努力地挖掘,你可以找到一篇不为人知的技术论文来做到这一点。

人们可以合理地争辩说,按照 Post 系统的要求,匹配字符串是一种解析(例如,识别有趣的结构),让您回到最初的问题。

有趣的是,程序转换系统(我在商业上构建了其中一个)通常使用编译器前端来构建 AST,然后应用 AST 树到树的重写来实现其目的。以这种方式构建它们的原因是因为它们实际上是伪装的 Post 系统。您程序的任何 AST 都可以简单地转换为字符串(例如,S 表达式),并且可以将树重写转换为等效的字符串重写。所以树重写系统只是一个 Post 系统,但这使得它非常强大。当然,可以将此功能与其他更传统的编译器方法相结合,这就是我们对产品所做的。这使它更方便;您不必像 Post 系统那样做所有事情。

【讨论】:

  • 非常感谢您的详细回答。这是否意味着您可以使用 AST 而不是 IR 来生成代码?这就是我最初的想法,但我不确定是否可能......
  • 可以直接从 AST 生成简单代码,只需遍历它并为遇到的每个运算符/操作数生成代码。如果您直接从解析中生成,那么生成的代码将几乎是您所得到的。更复杂的方案遍历 AST 并生成“三元组”,然后将其传递给编译器的其余部分。如果您想真正了解编译器如何生成代码,您真的应该参考标准文本;看到这个答案:stackoverflow.com/questions/1669/learning-to-write-a-compiler
【解决方案2】:

您所描述的实际上是标准编译器设计。可以编写一次性编译器,实际上我已经这样做了,它在解析期间生成目标代码,但规范是解析器生成 AST 并随后遍历 AST 以生成输出或在许多情况下,还有进一步的中间形式,例如三元组、RTL 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多