(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)) (list 'const int)) (((or 'neg 'not) expr ...) (list 'expr (car tokens) (expression expr))) (('left-paren expr ... 'right-paren) (expression expr)) (_ (die))))