8

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

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

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

例子:

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

函数存储在哪里以便可以随时再次调用?

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

4

3 回答 3

4

For Python, an expression isn't complete until all parentheses, brackets, etc. match up. This is fairly easy to detect. A function/class definition isn't complete until a completely blank line is entered. The compiler then compiles the entered expression or definition, and runs it.

Much like a normal function, class, module, etc., the REPL has its own local scope. It's this scope that is used for variables and definitions entered into the REPL.

于 2010-04-15T22:07:34.460 回答
3

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

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

于 2010-04-16T03:01:27.947 回答
3

You can learn more about the Python interactive console by reading the documentation for the code module:

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.

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

于 2010-04-15T22:07:57.893 回答