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