diff options
Diffstat (limited to 'src')
-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 |
3 files changed, 35 insertions, 10 deletions
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))))) |