2010-04-15 95 views
8

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

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

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

例子:

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

在哪里存储功能,因此它可以在任何时候再次叫什么名字?

交互式控制台怎么能把所有输入的东西当作一个程序而不需要一遍又一遍地执行?

回答

5

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

与正常的函数,类,模块等非常相似,REPL有其自己的本地范围。这是用于输入到REPL中的变量和定义的范围。

3

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

的代码模块,提供设施,以实现读-EVAL-打印在Python循环。包括两个类和便利功能,可用于构建提供交互式解释器提示的应用程序。

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

3

大多数语言的使用具有一种“令牌流”的分析器 - 也就是说,解析器会采取标记(字符串,符号,运营商等)从输入直到它有一个完整的表达式,然后它返回解析后的表达式,它可能被编译为字节码或以其他方式执行。由于解析器基本上要求更多输入,因此REPL循环相对比较简单,因此给出用户提示并让用户输入更多输入。您可能需要从解析器到读取器进行一些通信,使其呈现诸如继续提示之类的内容。

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

相关问题