aboutsummaryrefslogtreecommitdiff
path: root/src/cljcc/parser.clj
diff options
context:
space:
mode:
authorShagun Agrawal <agrawalshagun07@gmail.com>2024-08-19 19:05:36 +0530
committerShagun Agrawal <agrawalshagun07@gmail.com>2024-08-19 19:05:36 +0530
commit5d09a16488112ab5d611a3693efcf1e73479a835 (patch)
tree454c956b9dc3f2730beb0b65c1064728331b528c /src/cljcc/parser.clj
parentf0b04ec099de12ae713e3a381d17b1af478f769a (diff)
Lexer and parser changes for ch4
Add logical and relational operators
Diffstat (limited to 'src/cljcc/parser.clj')
-rw-r--r--src/cljcc/parser.clj14
1 files changed, 5 insertions, 9 deletions
diff --git a/src/cljcc/parser.clj b/src/cljcc/parser.clj
index e8f1791..f0ee777 100644
--- a/src/cljcc/parser.clj
+++ b/src/cljcc/parser.clj
@@ -39,18 +39,14 @@
(defn- parse-factor [[{kind :kind :as token} :as tokens]]
(cond
(= kind :number) [(constant-exp-node (:literal token)) (rest tokens)]
- (contains?
- #{:complement :hyphen} kind) (let [operator kind
- [e rst] (parse-factor (rest tokens))]
- [(unary-exp-node operator e) rst])
+ (t/unary-op? kind) (let [op kind
+ [e rst] (parse-factor (rest tokens))]
+ [(unary-exp-node op e) rst])
(= kind :left-paren) (let [[e rst] (parse-exp (rest tokens))
[_ rst] (expect :right-paren rst)]
[e rst])
:else (throw (ex-info "Parser Error. Malformed token." {:token token}))))
-(defn- precedence [kind]
- (kind t/bin-ops))
-
(defn- parse-exp
([tokens]
(parse-exp tokens 0))
@@ -58,8 +54,8 @@
(loop [[left rst] (parse-factor tokens)
tokens rst]
(let [[{kind :kind :as _token} :as tokens] tokens]
- (if (and (contains? t/bin-ops kind) (>= (precedence kind) min-prec))
- (let [[right rst] (parse-exp (rest tokens) (+ (precedence kind) 1))]
+ (if (and (t/binary-op? kind) (>= (t/precedence kind) min-prec))
+ (let [[right rst] (parse-exp (rest tokens) (+ (t/precedence kind) 1))]
(recur [(binary-exp-node left right kind)] rst))
[left tokens])))))