diff options
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/lexer/lexer.scm | 12 | ||||
-rw-r--r-- | src/modules/parser/parser.scm | 35 |
2 files changed, 40 insertions, 7 deletions
diff --git a/src/modules/lexer/lexer.scm b/src/modules/lexer/lexer.scm index dae7107..e6d96df 100644 --- a/src/modules/lexer/lexer.scm +++ b/src/modules/lexer/lexer.scm @@ -18,15 +18,15 @@ current input port." ((char-whitespace? chr) (read-token)) - ((eq? chr #\() + ((eqv? chr #\() 'left-paren) - ((eq? chr #\)) + ((eqv? chr #\)) 'right-paren) - ((eq? chr #\{) + ((eqv? chr #\{) 'open-brace) - ((eq? chr #\}) + ((eqv? chr #\}) 'close-brace) - ((eq? chr #\;) + ((eqv? chr #\;) 'semi-colon) ((char-alphabetic? chr) @@ -53,7 +53,7 @@ current input port." (cond ((and (not (eof-object? chr)) (or (char-alphabetic? chr) (char-numeric? chr) - (eq? chr #\_))) + (eqv? chr #\_))) (read-identifier-helper (cons (read-char) chrs-so-far))) (#t (reverse chrs-so-far))))) (list->string (read-identifier-helper (list chr)))) 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)))) |