summaryrefslogtreecommitdiff
path: root/src/modules/parser/parser.scm
blob: fa9202d7eb1b8cb31236bb720e297eb2ca3d35cd (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
35
36
37
(define-module (modules parser parser)
  #:use-module (ice-9 match)
  #:use-module (modules ast syntax-tree)
  #:export (p-program))


(define (die)
  (error "syntax error"))

(define (p-program tokens)
  (match tokens
    ((func ...)
     (make-program (p-function func)))
    (_ (die))))

(define (p-function tokens)
  (match tokens
    (('int (? string? id) 'left-paren 'void 'right-paren 'open-brace stmt ... 'close-brace)
     (make-function (make-id id) (p-stmt stmt)))
    (_ (die))))

(define (p-stmt tokens)
  (match tokens
    (('return expr ... 'semi-colon)
     (make-stmt (p-expr expr)))
    (_ (die))))

(define (p-expr tokens)
  (make-expr
   (match tokens
     (((? integer? int))
      (make-const int))
     (((or 'sub 'complement) expr ...)
      (make-unary (car tokens) (p-expr expr)))
     (('left-paren expr ... 'right-paren)
      (p-expr expr))
     (_ (die)))))