A Toy Programming Language
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
2.8KB

  1. #lang racket
  2. ; utils - wont change
  3. (define def-symbol '())
  4. (define start-state '())
  5. (define input '())
  6. (define (set-def! x)
  7. (set! def-symbol x))
  8. (define (set-start! x)
  9. (set! start-state x))
  10. (define (set-input! x)
  11. (set! start-state x))
  12. (define (pre t)
  13. (car t))
  14. (define (cur t)
  15. (cadr t))
  16. (define (aft t)
  17. (caddr t))
  18. (define (shiftr t)
  19. (let* [(c (cur t))
  20. (p (pre t))
  21. (a (aft t))
  22. (a (if (null? a)
  23. (list def-symbol)
  24. a))]
  25. `(,(append p (list c))
  26. ,(car a)
  27. ,(cdr a))))
  28. (define (shiftl t)
  29. (let* [(c (cur t))
  30. (p (pre t))
  31. (a (aft t))
  32. (p (if (null? p)
  33. (list def-symbol)
  34. p))]
  35. `(,(reverse (cdr (reverse p)))
  36. ,(car (reverse p))
  37. ,(cons c a))))
  38. (define (write-sym s t)
  39. (let [(p (pre t))
  40. (a (aft t))]
  41. `(,p ,s ,a)))
  42. (define (list->tape l)
  43. `(() ,(car l) ,(cdr l)))
  44. (define trans-map (make-hash))
  45. (define (transition current-state tape)
  46. (let [(f (hash-ref trans-map `(,current-state ,(cur tape)) #f))]
  47. (if (eq? f #f)
  48. `(,current-state ,tape)
  49. (let* [(new-sym (first f))
  50. (dir (second f))
  51. (new-state (third f))
  52. (dir-op (if (eq? 'L dir)
  53. shiftl
  54. shiftr))
  55. (new-tape (dir-op (write-sym new-sym tape)))]
  56. (transition new-state new-tape)))))
  57. (define (tape->list t)
  58. (let [(flat-tape (append (pre t) (list (cur t)) (aft t)))
  59. (f (lambda (x) (eq? x def-symbol)))]
  60. (reverse (drop-while f (reverse (drop-while f flat-tape))))))
  61. (define (drop-while f l)
  62. (if (null? l)
  63. l
  64. (if (f (car l))
  65. (drop-while f (cdr l))
  66. l)))
  67. (define (display-result input)
  68. (let* [(res (transition start-state (list->tape input)))
  69. (fin-state (car res))
  70. (fin-tape (tape->list (cadr res)))]
  71. (void
  72. (printf "Initial State: ~a~nInitial Tape:~n~a~nFinal State: ~a~nFinal Tape:~n~a~n" start-state input fin-state fin-tape))))
  73. (provide trans-map)
  74. (provide display-result)
  75. (provide set-def!)
  76. (provide set-start!)
  77. ;; per machine - will change
  78. ;
  79. ;(define def-symbol 'e)
  80. ;(define start-state '1)
  81. ;
  82. ;(hash-set! trans-map '(1 a) '(b R 2))
  83. ;(hash-set! trans-map '(1 c) '(c R 4))
  84. ;
  85. ;(hash-set! trans-map '(2 a) '(a R 2))
  86. ;(hash-set! trans-map '(2 c) '(c R 2))
  87. ;(hash-set! trans-map '(2 e) '(c L 3))
  88. ;
  89. ;(hash-set! trans-map '(3 a) '(a L 3))
  90. ;(hash-set! trans-map '(3 c) '(c L 3))
  91. ;(hash-set! trans-map '(3 b) '(b R 1))
  92. ;
  93. ;(hash-set! trans-map '(4 c) '(c R 4))
  94. ;(hash-set! trans-map '(4 e) '(e L 5))
  95. ;
  96. ;(hash-set! trans-map '(5 c) '(a L 5))
  97. ;(hash-set! trans-map '(5 b) '(a L 5))
  98. ;(hash-set! trans-map '(5 e) '(e R F))
  99. ;
  100. ;; fin
  101. ;
  102. ;(display-result '(a a a a a))