2017-04-13 36 views
0

首先,這是作業。我不打算得到一個完整的解決方案,但我堅持如何解釋這個問題。抽象/具體語法的序列創建(方案)

我們基本上是從詞法分析器和解析器中爲我們在課堂上創建的語言做出解釋。

具體來說,就是我被困在正在使用計劃/ Drracket實現使用調用該方法的解析器「讓-SEQ」,可以通過以下規則定義創建序列:

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

在哪裏使-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

也許使用'gensym'生成一個永遠不會與對象語言中的標識符衝突的唯一標籤? –

回答

0

使用*temp將不會是一個問題,除非它的解釋程序也有*test

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

爲了解決這個問題,你可以引入都OK瞭解釋,但不可能在代碼創建變量。我經常使用符號和列表,其中第一個元素是特殊值。你的make-seq創建,而你的解釋器也需要把它們當作符號。通常解釋器使用eq?,所以基本上每一個創建爲帶有標籤的列表的結構對於該擴展都是唯一的,使得每個嵌套*temp甚至不會打擾先前創建的其他結構。