使用抽象/具体语法创建序列(方案)

时间:2017-04-13 23:54:24

标签: scheme racket abstract-syntax-tree

首先,这是家庭作业。我没有打算获得完整的解决方案,但我仍然坚持如何解释这个问题。

我们基本上是从词法分析器和解析器中为我们在课堂上创建的语言编写解释器。

具体来说,我坚持使用Scheme / Drracket来实现使用调用方法" make-seq"的解析器来创建序列。可以通过以下规则来定义:

(make-seq (e)) = e
(make-seq (e1 e2 ... en)) = (make-let '*temp* e1 (make-seq (e2 ... en)))

make-let定义为:

(define (make-let var exp1 exp2)
  (list 'let var exp1 exp2))

我已经实现了下面的make-seq方法:

(define (make-seq e)
  (if (null? (cdr e))
      e
      (make-let '*temp* (car e) (make-seq (cdr e)))))

但我不确定如何在上述规则中表示' temp 。我相当确定我实际上不应该在实现中使用符号' temp ,但我不确定我应该在那里做什么。

有人能指点我应该如何向前推进吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

使用*temp不会有问题,除非它所解释的程序也有*test

(let ((*temp 10))
  (seq
    expression1
    (* *temp *temp))) ; end up using the result from the previous element in the sequence 

要解决此问题,您可以引入对解释器可以使用但不能在代码中创建的变量。我经常使用符号和列表,其中第一个元素是特殊值。您的make-seq会创建它,而您的翻译也需要将它们视为符号。通常,解释器使用eq?,因此基本上每个创建为带有标记的列表的结构对于该扩展都是唯一的,这使得每个嵌套*temp甚至不会打扰先前创建的其他嵌套。