From 11ecac1d0686d5ed75b73eee0c860d7d67f6d6f0 Mon Sep 17 00:00:00 2001 From: bd Date: Tue, 5 Nov 2024 12:42:29 -0500 Subject: Add parser and ast generation for trivial programs --- src/modules/parser/parser.scm | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'src/modules/parser/parser.scm') diff --git a/src/modules/parser/parser.scm b/src/modules/parser/parser.scm index b2ca12f..e70a825 100644 --- a/src/modules/parser/parser.scm +++ b/src/modules/parser/parser.scm @@ -1 +1,34 @@ -(define-module (modules parser parser)) +(define-module (modules parser parser) + #:use-module (ice-9 match) + #:export (p-program)) + + +(define (die) + (error "syntax error")) + + +(define (p-program tokens) + (match tokens + ((func ...) + `(program ,(p-function func))) + (_ (die)))) + +(define (p-function tokens) + (match tokens + (('int (? string? id) 'left-paren 'void 'right-paren 'open-brace stmt ... 'close-brace) + `(function (identifier ,id) ,(p-statement stmt))) + (_ (die)))) + +(define (p-statement tokens) + (match tokens + (`(return ,expr semi-colon) + `(return ,(p-exp (list expr)))) + (_ (die)))) + +(define (p-exp tokens) + "Matches any list containing a single number, +" + (match tokens + (((? number? const)) + `(constant ,const)) + (_ (die)))) -- cgit v1.2.3