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

但是有一个严重的问题:如果用户输入的每一行代码都作为一个独立的程序来处理,则它必须经过令牌生成器和解析器,然后才由解释器执行-那么函数呢?

Python / Ruby交互式控制台(IDLE,irb)如何"共享"代码? 输入的代码如何处理?

例:

>> def x:

>>  print("Blah")

>>

>> x()

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

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

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

与普通函数,类,模块等类似,REPL具有其自己的本地范围。该范围用于输入REPL的变量和定义。

这些语言中的大多数都使用具有一种"令牌流"的解析器-也就是说,解析器不断从输入流中获取令牌(字符串,符号,运算符等),直到具有完整的表达式,然后返回解析后的表达式,可能会将其编译为字节码或以其他方式执行。给定这种结构,REPL循环相对来说比较简单,因为解析器基本上要求输入更多信息,并且给用户提示并让用户输入更多输入。您可能需要从解析器到阅读器进行一点通信,以使其呈现诸如连续提示之类的东西。

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

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

The code module provides facilities to implement read-eval-print loops in Python. Two classes and convenience functions are included which can be used to build applications which provide an interactive interpreter prompt.