(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)))))