summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-01-04 22:43:31 -0700
committerbd <bdunahu@operationnull.com>2025-01-04 22:43:31 -0700
commit0d69984338399a78a3ba6f3a2493f1ffb34964f8 (patch)
treea0ed32f2d0fb5a9ea8d47a4239425a4c87b26e07
parent28116b7a9e77df0476f5dc15369637d508c1bfcb (diff)
Modify parser to handle unary operators
-rw-r--r--README.org3
-rw-r--r--src/modules/ast/syntax-tree.scm26
-rw-r--r--src/modules/generator/generator.scm2
-rw-r--r--src/modules/parser/parser.scm17
4 files changed, 37 insertions, 11 deletions
diff --git a/README.org b/README.org
index d79da6a..33c5ac4 100644
--- a/README.org
+++ b/README.org
@@ -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)))))