summaryrefslogtreecommitdiff
path: root/src/modules/parser/driver.scm
blob: 8fd42a4b51d6b1e5dbba2733e62c9be60a5b6d6e (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
(define-module (modules parser driver)
  #:use-module (ice-9 match)
  #:export (tokens->ast))


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

(define (tokens->ast tokens)
  (match tokens
    ((func ...)
     (list 'prog (function func)))
    (_ (die))))

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

(define (statement tokens)
  (match tokens
    (('return expr ... 'semi-colon)
     (list 'stmt (expression expr)))
    (_ (die))))

(define (expression tokens)
  (match tokens
    (((? integer? int))
     int)
    (((or 'neg 'not) expr ...)
     (list 'expr (car tokens) (expression expr)))
    (('left-paren expr ... 'right-paren)
     (expression expr))
    (_ (die))))