summaryrefslogtreecommitdiff
path: root/full-parse.rkt
blob: 25239a2dad7e20f4d717d8a3794c15dbcfe6ff52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#lang racket

(provide full-parse)

; + - * / ^ ( ) [0-9]

(define (full-parse str)
  (define (get-general expr operator next-operation)
    (define (char->wanted c)
      ((if (char-numeric? c)
        string->number string->symbol)
       (string c)))
    (define (add-operation-to-list operation seq)
      (cons (if (= (length operation) 1) 
              (char->wanted (car operation))
              (next-operation operation))
            seq))
    (define (inner cfac facts rexpr)
      (cond
        ((null? rexpr)
         (reverse (add-operation-to-list cfac facts)))
        ((eqv? (car rexpr) operator)
         (inner '() (add-operation-to-list cfac facts) (cdr rexpr)))
        (else
          (inner (cons (car rexpr) cfac) facts (cdr rexpr)))))
    (cons (char->wanted operator) (inner '() '() expr)))

  (define (get-parts expr)
    (get-general 
      expr 
      #\+ 
      (lambda (expr)
        (get-general expr #\* (lambda (x) x)))))
  (get-parts (string->list str)))