Ruby和Python如何实现他们的交互式控制台?

在为我的编程语言实现解释器时,我首先想到了一个简单的控制台窗口,它允许用户输入一些代码,然后作为shell独立程序执行。

但是存在严重的问题:如果用户输入的每一行代码都作为独立程序处理,它必须通过标记器和解析器,然后由解释器执行 – 那么函数呢?

  • Python / Ruby交互式控制台(IDLE,irb)如何“共享”代码? 如何处理代码?

例:

>> def x: >> print("Blah") >> >> x() 

函数存储在哪里,以便可以在任何时候再次调用它?

交互式控制台如何将所有输入的内容视为一个程序,而不是一遍又一遍地执行所有操作?

对于Python,在所有括号,括号等匹配之前,表达式不完整。 这很容易检测到。 在输入完全空行之前,函数/类定义不完整。 然后编译器编译输入的表达式或定义,并运行它。

与正常的函数,类,模块等非常相似,REPL有自己的局部范围。 这个范围用于输入REPL的变量和定义。

您可以通过阅读代码模块的文档来了解有关Python交互式控制台的更多信息:

代码模块提供了在Python中实现read-eval-print循环的工具。 包括两个类和便利函数,可用于构建提供交互式解释器提示的应用程序。

http://docs.python.org/library/code.html

这些语言中的大多数使用具有一种“令牌流”的解析器 – 也就是说,解析器继续从输入流中获取令牌(字符串,符号,运算符等),直到它具有完整表达式,然后它返回解析表达式,它可能被编译为字节码或以其他方式执行。 在给定该结构的情况下,REPL循环处理相对简单,因为解析器基本上要求更多输入,并且您向用户提供提示并让用户输入更多输入。 您可能需要从解析器到读取器的一些通信,以使其呈现诸如继续提示之类的内容。

Python和Ruby都按顺序立即执行语句(函数声明是一个语句)。 因此,您可以在解释器上执行代码语句,与源文件中的效果大致相同。