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

使用抽象/具体语法创建序列(Scheme),scheme,racket,abstract-syntax-tree,Scheme,Racket,Abstract Syntax Tree,首先,这是家庭作业。我不想得到一个完整的解决方案,但我一直在思考如何解释这个问题 我们基本上是从一个lexer和一个解析器为我们在课堂上创建的语言制作一个解释器 具体来说,我一直坚持使用Scheme/Drracket来实现使用调用方法“make seq”的解析器创建序列,该方法可以通过以下规则定义: (make-seq (e)) = e (make-seq (e1 e2 ... en)) = (make-let '*temp* e1 (make-seq (e2 ... en))) 其中,mak

首先,这是家庭作业。我不想得到一个完整的解决方案,但我一直在思考如何解释这个问题

我们基本上是从一个lexer和一个解析器为我们在课堂上创建的语言制作一个解释器

具体来说,我一直坚持使用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
不会有问题,除非它所解释的程序也有
*test

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

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

可以使用
gensym
生成一个不会与目标语言中的标识符冲突的唯一标记?