Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.53 KB | None | 0 0
  1. (define (operator? a)
  2. (member a '(#\+ #\- #\/ #\* #\^)))
  3.  
  4. (define (constant? a)
  5. (and (> (char->integer a) 47)
  6. (< (char->integer a) 58)))
  7.  
  8. (define (variable? a)
  9. (and (> (char->integer a) 96)
  10. (< (char->integer a) 123)))
  11.  
  12. (define (paranthesis? a)
  13. (or (equal? a #\()
  14. (equal? a #\))))
  15.  
  16. (define (delimiter? a)
  17. (or (equal? a #\space)
  18. (equal? a #\newline)
  19. (equal? a #\tab)))
  20.  
  21. (define (return-constant str)
  22. (define (f a a1)
  23. (cond ((null? a) a)
  24. ((constant? (car a)) (f (cdr a) (cdr a1)))
  25. ((equal? (car a) #\E) (f (cdr a) (cdr a1)))
  26. ((equal? (car a) #\e) (f (cdr a) (cdr a1)))
  27. ((and (member (car a) '(#\+ #\-))
  28. (or (equal? (car a1) #\e)
  29. (equal? (car a1) #\E))) (f (cdr a) (cdr a1)))
  30. ((equal? (car a) #\.) (f (cdr a) (cdr a1)))
  31. (else a)))
  32. (f str (append '(#\() str)))
  33.  
  34.  
  35. (define (return-variable str)
  36. (define (f a)
  37. (cond ((null? a) a)
  38. ((variable? (car a)) (return-variable (cdr a)))
  39. (else a)))
  40. (f str))
  41.  
  42.  
  43. (define (tokenize str)
  44. (define (f a res)
  45. (cond ((null? a) (reverse res))
  46. ((operator? (car a)) (f (cdr a) (cons (string->symbol (string (car a))) res)))
  47. ((constant? (car a)) (f (return-constant a) (cons (string->number (list->string (substring+ a (car a) (return-constant a)))) res)))
  48. ((paranthesis? (car a)) (f (cdr a) (cons (string (car a)) res)))
  49. ((variable? (car a)) (f (return-variable a) (cons (string->symbol (list->string (substring+ a (car a) (return-variable a)))) res)))
  50. ((delimiter? (car a)) (f (cdr a) res))
  51. (else #f)))
  52. (f (string->list str) '()))
  53.  
  54. (define (substring+ str a b)
  55. (define (f e r g res i)
  56. (cond ((null? e) (reverse res))
  57. ((and (equal? (car e) r) (= i 0)) (f (cdr e) r g (cons (car e) '()) 1))
  58. ((and (equal? e g) (= i 1)) (f '() r g res 1))
  59. ((not (null? res)) (f (cdr e) r g (cons (car e) res) 1))))
  60. (f str a b '() 0))
  61.  
  62.  
  63. (define (parse lst)
  64.  
  65. (define ERROR 1)
  66.  
  67. (define (parse-expr)
  68. (let q ((answer (parse-term)))
  69. (cond ((null? lst) answer)
  70. ((equal? (car lst) '+) (begin (set! lst (cdr lst)) (q (list answer '+ (parse-term)))))
  71. ((equal? (car lst) '-) (begin (set! lst (cdr lst)) (q (list answer '- (parse-term)))))
  72. ((and (not (equal? (car lst) ")")) (not (null? lst))) (ERROR #f))
  73. (else answer))))
  74.  
  75. (define (parse-term)
  76. (let w ((answer (parse-factor)))
  77. (cond ((null? lst) answer)
  78. ((equal? (car lst) '/) (begin (set! lst (cdr lst)) (w (list answer '/ (parse-factor)))))
  79. ((equal? (car lst) '*) (begin (set! lst (cdr lst)) (w (list answer '* (parse-factor)))))
  80. (else answer))))
  81.  
  82. (define (parse-factor)
  83. (let ((answer (parse-power)))
  84. (cond ((null? lst) answer)
  85. ((equal? (car lst) '^) (begin (set! lst (cdr lst)) (list answer '^ (parse-factor))))
  86. (else answer))))
  87.  
  88. (define (parse-power)
  89. (if (null? lst)
  90. (ERROR #f)
  91. (let ((token (car lst)))
  92. (cond ((number? token) (begin (set! lst (cdr lst)) token))
  93. ((equal? token "(") (begin (set! lst (cdr lst)) (let ((answer (parse-expr)))
  94. (if (and (not (null? lst)) (equal? (car lst) ")"))
  95. (begin
  96. (set! lst (cdr lst))
  97. answer)
  98. (ERROR #f)))))
  99. ((equal? token '-) (begin (set! lst (cdr lst)) (list '- (parse-power))))
  100. ((member token '(+ * / =)) (ERROR #f))
  101. ((symbol? token) (begin (set! lst (cdr lst)) token))
  102. (else (ERROR #f))))))
  103.  
  104. (call-with-current-continuation
  105. (lambda (exit)
  106. (set! ERROR exit)
  107. (parse-expr))))
  108.  
  109. (define (tree->scheme lst)
  110. (if (and (pair? lst) (= (length lst) 3))
  111. (let ((x (car lst))
  112. (op (cadr lst))
  113. (y (caddr lst)))
  114. (cond ((equal? op '^) (list 'expt (tree->scheme x) (tree->scheme y)))
  115. (else (list op (tree->scheme x) (tree->scheme y)))))
  116. lst))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement