Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 5.24 KB | None | 0 0
  1. #lang racket
  2. (require "opcodes.rkt")
  3. (provide make-stack-machine)
  4. (provide run-stack-machine)
  5. (provide get-stack)
  6. (provide get-varnames)
  7. (provide get-consts)
  8. (provide get-names)
  9. (provide get-code)
  10. (provide get-IC)
  11. (provide empty-stack)
  12. (provide make-stack)
  13. (provide push)
  14. (provide pop)
  15. (provide top)
  16.  
  17.  
  18. ;; TODO 1:
  19. ;; Alegeți metoda de reprezentarea a unei stive.
  20. ;; Implementați:
  21. (define empty-stack '())
  22. (define (make-stack) empty-stack)
  23.  
  24. (define (push element stack) (cons element stack))
  25. (define (top stack) (car stack))
  26. (define (pop stack) (cdr stack))
  27.  
  28. ;; TODO 2:
  29. ;; Alegeți metoda de reprezentare a unei mașini stivă.
  30. ;; Definiți make-stack-machine, acesta trebuie sa primeasca cele 4 segmente de date
  31. ;; Veți avea nevoie de o stivă pentru execuție și un counter ca să stiți
  32. ;; la ce instrucțiune sunteți.
  33. (define (make-stack-machine stack co-varnames co-consts co-names co-code IC)
  34.   (list stack co-varnames co-consts co-names co-code IC))
  35.  
  36. ;; Definiți funcțiile `get-varnames`, `get-consts`, `get-names`,
  37. ;; `get-code`, `get-stack`, `get-IC` care primesc o mașina stivă și întorc
  38. ;; componenta respectivă
  39.  
  40. ;; ex:
  41. ;; > (get-varnames (make-stack-machine empty-stack 'dummy-co-varnames (hash) (hash) (list) 0))
  42. ;; 'dummy-co-varnames
  43. (define (get-varnames stack-machine) (list-ref stack-machine 1))
  44.  
  45. ;; ex:
  46. ;; > (get-consts (make-stack-machine empty-stack (hash) 'dummy-co-consts (hash) (list) 0))
  47. ;; 'dummy-co-consts
  48. (define (get-consts stack-machine) (list-ref stack-machine 2))
  49.  
  50. ;; ex:
  51. ;; > (get-names (make-stack-machine empty-stack (hash) (hash) 'dummy-co-names (list) 0))
  52. ;; 'dummy-co-names
  53. (define (get-names stack-machine) (list-ref stack-machine 3))
  54.  
  55. ;; ex:
  56. ;; > (get-code (make-stack-machine empty-stack (hash) (hash) (hash) 'dummy-co-code 0))
  57. ;; dummy-co-code
  58. (define (get-code stack-machine) (list-ref stack-machine 4))
  59.  
  60. ;; Întoarce stiva de execuție.
  61. ;; ex:
  62. ;; > (get-code (make-stack-machine 'dummy-exec-stack (hash) (hash) (hash) (list) 0))
  63. ;; dummy-exec-stack
  64. (define (get-stack stack-machine) (list-ref stack-machine 0))
  65.  
  66. ;; Întoarce instruction counterul.
  67. ;; ex:
  68. ;; > (get-code (make-stack-machine empty-stack (hash) (hash) (hash) (list) 0))
  69. ;; 0
  70. (define (get-IC stack-machine) (list-ref stack-machine 5))
  71.  
  72.  
  73.  
  74. (define symbols (list 'STACK 'CO-VARNAMES 'CO-CONSTS 'CO-NAMES 'CO-CODE 'INSTRUCTION-COUNTER))
  75.  
  76. ;; TODO 3:
  77. ;; Definiți funcția get-symbol-index care gasește index-ul simbolului in listă.
  78. (define (get-symbol-index symbol)
  79.   (let iter ((list symbols)
  80.              (index 0))
  81.     (cond ([empty? symbols] #f)
  82.           ([equal? (car list) symbol] index)
  83.           (else (iter (cdr list) (+ index 1))))))
  84.  
  85. ;; Definiți funcția update-stack-machine care intoarce o noua mașina stivă
  86. ;; înlocuind componenta corespondentă simbolului cu item-ul dat în paremetri.
  87. ;; > (get-varnames (update-stack-machine "new-varnames" 'CO-VARNAMES stack-machine))
  88. ;; "new-varnames"
  89. ;; > (get-varnames (update-stack-machine "new-names" 'CO-NAMES stack-machine))
  90. ;; "new-names"
  91. (define (update-stack-machine item symbol stack-machine)
  92.   (let ((index (get-symbol-index symbol)))
  93.     (append (append (take stack-machine index) (list item)) (drop stack-machine (+ index 1)))))
  94.  
  95. ;; Definiți funcția push-exec-stack care primește o masină stivă și o valoare
  96. ;; și intoarce o noua mașina unde valoarea este pusă pe stiva de execuție
  97. ;;(define (push-exec-stack value stack-machine)
  98.   ;;(push value (car stack-machine)))
  99.  
  100. ;;  Definiți funcția pop-exec-stack care primește o masină stivă
  101. ;;  și intoarce o noua mașina aplicând pop pe stiva de execuție.
  102. ;;(define (pop-exec-stack stack-machine)
  103.   ;;(pop (car stack-machine)))
  104.  
  105. ;; TODO 4:
  106. ;; Definiți funcția run-stack-machine care execută operații pană epuizează co-code.
  107. (define (run-stack-machine stack-machine)
  108.   (cond ([(equal? (list-ref (get-code stack-machine) (get-IC stack-machine)) (get-opname 100))]
  109.          (run-stack-machine (load-const (cdr (car (get-code stack-machine))) stack-machine)))
  110.         ([(equal? (list-ref (get-code stack-machine) (get-IC stack-machine)) (get-opname 124))]
  111.          (run-stack-machine (load-fast (cdr (car (get-code stack-machine))) stack-machine)))
  112.         ([(equal? (list-ref (get-code stack-machine) (get-IC stack-machine)) (get-opname 125))]
  113.          (run-stack-machine (store-fast (cdr (car (get-code stack-machine))) stack-machine)))
  114.         (else stack-machine)))
  115.  
  116. (define (load-const position stack-machine)
  117.   (update-stack-machine (+ get-IC stack-machine 1) (get-IC stack-machine)
  118.                         (update-stack-machine (push (hash-ref (get-consts stack-machine) position) (get-stack stack-machine)) stack-machine)))
  119.  
  120. (define (load-fast position stack-machine)
  121.   (update-stack-machine (+ get-IC stack-machine 1) (get-IC stack-machine)
  122.                         (update-stack-machine (push (hash-ref (get-varnames stack-machine) position) (get-stack stack-machine)) stack-machine)))
  123.  
  124. (define (store-fast position stack-machine)
  125.   (let ((TOS (top (get-stack stack-machine))))
  126.     (update-stack-machine (+ get-IC stack-machine 1) (get-IC stack-machine)
  127.                           (update-stack-machine (hash-set (get-varnames stack-machine) position TOS) (pop stack-machine)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement