diff options
Diffstat (limited to 'src/modules/parser')
-rw-r--r-- | src/modules/parser/driver.scm | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/modules/parser/driver.scm b/src/modules/parser/driver.scm new file mode 100644 index 0000000..8fd42a4 --- /dev/null +++ b/src/modules/parser/driver.scm @@ -0,0 +1,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)))) |