blob: f5e503ed9d379c66533d35df7de712ca0929a722 (
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 (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))))
|