aboutsummaryrefslogtreecommitdiff
path: root/src/cljcc/parser.clj
diff options
context:
space:
mode:
authorShagun Agrawal <agrawalshagun07@gmail.com>2024-08-30 18:49:17 +0530
committerShagun Agrawal <agrawalshagun07@gmail.com>2024-08-30 18:49:17 +0530
commit276b0c200e5159b1d099ff85aab544480c2ac757 (patch)
tree8cb86289809936901b2a49344818528799fa81da /src/cljcc/parser.clj
parent7a3e7151ea7e05952ec58648d71d9ed33168109d (diff)
Add compound assignment operators
Added compound assignment operators ( >>==, += etc ) Pass chapter 5 extra credit tests
Diffstat (limited to 'src/cljcc/parser.clj')
-rw-r--r--src/cljcc/parser.clj11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/cljcc/parser.clj b/src/cljcc/parser.clj
index 4cc6c3b..b3e7eeb 100644
--- a/src/cljcc/parser.clj
+++ b/src/cljcc/parser.clj
@@ -50,9 +50,10 @@
:left l
:right r})
-(defn assignment-exp-node [l r]
+(defn assignment-exp-node [l r op]
{:type :exp
:exp-type :assignment-exp
+ :assignment-operator op
:left l
:right r})
@@ -76,10 +77,10 @@
tokens rst]
(let [[{kind :kind :as _token} :as tokens] tokens]
(if (and (t/binary-op? kind) (>= (t/precedence kind) min-prec))
- (if (= kind :assignment)
- (let [[_ tokens] (expect :assignment tokens)
+ (if (t/assignment-op? kind)
+ (let [[_ tokens] (expect kind tokens)
[right rst] (parse-exp tokens (t/precedence kind))]
- (recur [(assignment-exp-node left right)] rst))
+ (recur [(assignment-exp-node left right kind)] rst))
(let [[right rst] (parse-exp (rest tokens) (+ (t/precedence kind) 1))]
(recur [(binary-exp-node left right kind)] rst)))
[left tokens])))))
@@ -192,6 +193,8 @@
(pp/pprint (parse-from-src "
int main(void) {
int a = b = 4;
+int var0 = 2;
+var0 = 41;
}"))
(pp/pprint