我需要学习什么来构建口译员



对于我的 AQA A2 级计算项目,我决定创建一个基本的解释型编程语言,输出到 Console。我不知道如何建立一个解释器。我有一本紫龙书,里面都是关于编译器设计的,正如user166390在回答这个问题时所说,构建编译器的初始步骤与构建解释器相同。我的问题是:这是真的吗?

我可以使用龙书中描述的技巧来编写解释器吗?如果是这样,我需要使用哪些步骤并学习如何使用?

例如,我是否需要编写词法分析器、语法分析器、语义分析器和中间代码生成器?

我是否可以编写一个基本的解析器来读取源代码的每一行,解析它,并立即执行指令,或者这是一个臭名昭著的坏主意?

是的,你可以使用龙书中描述的技术来编写解释器。

无论如何,您都需要一个词法分析器和一个解析器。

正如其他人所指出的,你确实需要编写代码来执行实际执行 - 但对于一个简单的解释器,这可以与dragon书中描述的语法导向翻译基本相同。

其他一切都是可选的。


如果你想直接从解析器跳到执行,你可以。 这将给你留下一个非常简单的语言,它可以是好的,也可以是坏的 - 看看Tcl的例子。

如果你想在解析时解释每一行,你也可以这样做;这是大多数命令行解释器(Unix shell脚本,Microsoft的 cmd.com 和PowerShell)所做的,以及用于Python和Ruby等语言的交互式"REPL"(Read-Eval-Print-Loops)。

"语义分析器"对我来说似乎很模糊,但听起来它应该包括大多数类型的加载时间一致性检查。 这也是可选的,但是解释器的优点是不会接受任何旧垃圾并尝试将其作为程序执行......

"中间代码"也有点模糊,但它可以说是可选的。 如果你不是直接从程序字符串执行(如在Tcl中),你需要某种内部表示来存储你的代码,一旦你读入它。 一种流行的选择是从内部树结构执行,或多或少地基于解析树,这可以说与生成"中间代码"不同。 另一方面,如果你的"中间代码"可以或多或少地直接从你的内部树结构中写出来,你不妨把内部结构算作你的"中间代码"。


有一些重要的问题你还没有解决;一个突出的问题是:你想如何处理名字? 大概你会希望程序员能够定义和使用他自己的名称(例如,变量、函数等),所以你需要为此实现某种机制。

确切地说,名称的处理方式是一项重大的设计决策,对语言的可用性和可实现性有重大影响。 最简单的实现选项是使用单个全局哈希映射来实现单个全局命名空间 - 但请注意,此选择具有众所周知的可用性问题......

我可以编写一个基本的解析器来读取源代码并立即执行步骤吗?

你可以,但你会以艰难的方式做到这一点。

例如,我是否需要编写词法分析器、语法分析器、语义分析器和中间代码生成器?

可以跳过中间代码生成,除非要编写基于 VM 的解释器。例如 Perl,用于直接执行其解析图;这与生成中间字节码的Java或Python形成对比。

基于 VM 的语言的解释器部分通常比必须理解解析图的解释器更简单(因此系统中的每个组件都更简单),但是当您不需要定义中间字节码语言时,整个解释器堆栈的复杂性通常更简单。所以选择你的毒药。

相关内容

  • 没有找到相关文章

最新更新