2011-05-15 63 views
3

对于编程语言解释器,我想知道解释器经历的事件顺序。举例来说,我觉得这是怎么一回事呢:在翻译中,词法分析器之后是什么(通常)?

  • 解释得到了一些输入
  • 词法分析器/标记生成器获取输入和标定令牌
  • X得到令牌的列表
  • ???
  • 该代码被执行

什么步骤(一个或多个)属于在??? x(也就是说,在词法分析器产生的令牌上接收和操作了什么)?

回答

2

我会推荐的经典和免费书籍开始:Structure and Interpretation of Computer Programsvideo lectures

Lisp是基线的解释和其他一切是在某些方面对主题的变化。

通常的步骤是:

  • 词法分析采取焦炭流并产生令牌
  • 解析取令牌(平面列表),并构建数据结构称为抽象语法树(AST) 。这一步可能非常简单(Lisp)或者非常复杂(C++,Ruby)。
  • 评估AST。细节有点不同,但这首先深入树木。叶子是data(数字,字符串,常量,变量)节点是原始函数(数学,数据操作,控制结构)或更高级别的复合函数。每个节点应该减少到可以直接馈送到它上面的节点的东西。

最后一步“代码被执行”。对于编译或即时(JIT)语言,最后一步是将AST翻译成机器指令。注意可能存在的其他两个步骤也很重要。一种是转换成简单的语言,如c--,LLVM,.NET或Java bitecode。另一个是解析器和评估器之间可能发生的脱钩和/或优化。例如Haskell对于大量的desugaring继续下去有些臭名昭着。

我最终会鼓励你尝试编写Scheme(Lisp的一种方言)口译员的许多步骤之一。在网络上可能有一种您喜欢的语言。

+0

老问题,但一个很好的答案。我希望这是第一张贴。 – 2011-06-18 21:23:00

1

对于解释解析器通常会做两件事情

  1. 生成p代码
  2. 添加项目符号表

在此之后,executor将执行P码和查找标识符等在符号表中。

解析器解析它接收到的令牌流,并生成更简单更高效的执行p-code同时在解析阶段中找到的任何符号,如变量,函数,复杂数据类型结构等都被输入到符号表并在p代码中引用。

执行程序然后处理p代码流并执行指令并使用符号表来查找它在符号表中遇到的任何标识符。

2

解析发生,将令牌流转换为结构化,验证的语法信息。如果你想评价,说,算术表达式:

(x+4)*3

你不从左至右扫描令牌做到这一点。你需要弄清操作顺序。您需要将关键字if和大括号之间的标记转换为描述if语句的高级结构,因此您可以在不处理一堆标记的情况下对其进行评估。而且你需要检查语法,如果没有正确解析,语法基本上是不可能的。请阅读上下文无关文法。上述

表达将成为一个抽象语法树类似如下:

* 
    + 3 
x y 

评估,这是非常简单 - 只要遍历树,并期待xy环境。

同样,假如一系列语句是这样的:

if(p&&q){foo;bar;}else{baz;}

抽象语法树可能有以下一般结构:

IfStatement: 
    Condition: 
    LogicalConjunction: 
     LeftOperand: p 
     RightOperand: q 
    TruePart: 
    BasicBlock: 
     Statement: foo 
     Statement: bar 
    FalsePart: 
    BasicBlock: 
     Statement: baz 

希望你可以想象你将如何遍历这棵树来解释代码。

我强烈推荐的口译教材是Essentials of Programming Languages

+0

因此,解析器基本上是把所有东西都按顺序排列,以便在逻辑上查看它,而不必担心任何东西的有效性或顺序(因为它已经被排序和验证)? – 2011-05-15 05:23:47

+0

两者都用于验证语法,因为这是任何有趣语言的必要步骤。一个拒绝任何程序的口译员是无聊的。 – 2011-05-15 05:25:16

+0

因为对于任何优秀的语言来说,验证语法的步骤是什么?顺便说一句,这个答案是非常有帮助的。 – 2011-05-15 05:25:57