diff options
-rw-r--r-- | README.org | 3 | ||||
-rw-r--r-- | src/modules/ast/syntax-tree.scm | 26 | ||||
-rw-r--r-- | src/modules/generator/generator.scm | 2 | ||||
-rw-r--r-- | src/modules/parser/parser.scm | 17 |
4 files changed, 37 insertions, 11 deletions
@@ -1,7 +1,7 @@ * General This compiler was made following the general guidelines provided in /Writing a C Compiler/ by Nora Sandler. -It is written solely using tools distributed with Guile. +It is written from scratch solely using tools distributed with Guile. * Feature Agenda @@ -16,6 +16,7 @@ It is written solely using tools distributed with Guile. - [X] Trivial Programs - [ ] Unary Operators + - bitwise complement, negation - [ ] Binary Operators - [ ] Logical and Relational Operators - [ ] Local Variables diff --git a/src/modules/ast/syntax-tree.scm b/src/modules/ast/syntax-tree.scm index 738b115..b7db8dd 100644 --- a/src/modules/ast/syntax-tree.scm +++ b/src/modules/ast/syntax-tree.scm @@ -15,7 +15,16 @@ make-expr expr? - expr-int + expr-type + + make-unary + unary? + unary-operator + unary-expr + + make-const + const? + const-int make-id id? @@ -38,9 +47,20 @@ (expr stmt-expr)) (define-record-type <expr> - (make-expr int) + (make-expr type) expr? - (int expr-int)) + (type expr-type)) + +(define-record-type <unary> + (make-unary op expr) + unary? + (op unary-operator) + (expr unary-expr)) + +(define-record-type <const> + (make-const int) + const? + (int const-int)) (define-record-type <id> (make-id symbol) diff --git a/src/modules/generator/generator.scm b/src/modules/generator/generator.scm index 53be252..4a36b92 100644 --- a/src/modules/generator/generator.scm +++ b/src/modules/generator/generator.scm @@ -16,7 +16,7 @@ (define (g-expr e) ;; for now, we assume only 'return'! - (list (make-instruction "movl" (string-append/shared "$" (number->string (expr-int e))) "%eax") + (list (make-instruction "movl" (string-append/shared "$" (number->string (const-int (expr-type e)))) "%eax") (make-instruction "ret" #f #f))) (define (g-id i) diff --git a/src/modules/parser/parser.scm b/src/modules/parser/parser.scm index ceac389..fa9202d 100644 --- a/src/modules/parser/parser.scm +++ b/src/modules/parser/parser.scm @@ -21,12 +21,17 @@ (define (p-stmt tokens) (match tokens - (`(return ,expr semi-colon) - (make-stmt (p-expr (list expr)))) + (('return expr ... 'semi-colon) + (make-stmt (p-expr expr))) (_ (die)))) (define (p-expr tokens) - (match tokens - (((? number? int)) - (make-expr int)) - (_ (die)))) + (make-expr + (match tokens + (((? integer? int)) + (make-const int)) + (((or 'sub 'complement) expr ...) + (make-unary (car tokens) (p-expr expr))) + (('left-paren expr ... 'right-paren) + (p-expr expr)) + (_ (die))))) |