2010-10-11 8 views
6

Ho scritto il parser che legge l'input della stringa. Che funzioni. Ho anche scritto il valutatore che sputa il risultato. Ma c'è un piccolo dettaglio che ho problemi nell'implementazione. Guardate il seguente esempio:Valutazione di un linguaggio di tipo matematico piccolo che supporta una variabile

+(sw+(2,2),sr) 

Il sw costrutto di questa piccola lingua è supponiamo di valutare "+ (2,2)" e riporlo da qualche parte. Il costrutto sr leggerebbe questa area di memoria. L'intera espressione su sarebbe valutata a 8.

I miei pensieri su di esso sarebbero di utilizzare un parametro aggiuntivo per la funzione eval, che memorizza il risultato. Ma non riesco a vederlo funzionare. Nota Sono nuovo di haskell, quindi sii gentile. Oh, questo è compito. Quindi non darmi una soluzione, dammi un suggerimento.

risposta

5

Poiché le espressioni possono leggere e scrivere nell'area di memoria, la funzione di valutazione dovrebbe ottenere lo stato di memoria come parametro e restituire un nuovo stato nel risultato.

evaluate :: Expr -> Int -> (Float, Int) 

[dove Int è il tipo di stoccaggio, e Float è tipo di risultato, naturalmente, si può cambiare la situazione].

Quando si implementa evaluate (Sum a b), è necessario passare la memoria in evaluate a, ottenere un nuovo valore di memoria e assegnarlo a evaluate b.

 | 
    | m 
    \/
|----------| x 
|evaluate a|--------| 
|-----------  | 
    |    | 
    | m'   | 
    \/   \/
|----------| y --- 
|evaluate b|----->| + | 
|----------|  --- 
    |    | 
    |    | 
    \/   \/
    final   final 
    value of  result 
    memory 

Utilizzare la corrispondenza del modello. Inizia con let (x,m') = evaluate a m in ....

+0

Grazie! Non ho usato espressioni difficili. Ma l'ho fatto funzionare. – Algific

+0

Ottimo lavoro nel rispondere a una domanda di compiti a casa nel modo giusto. – Davorak