summaryrefslogtreecommitdiff
path: root/src/modules/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/parser')
-rw-r--r--src/modules/parser/driver.scm35
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))))