diff options
Diffstat (limited to 'src/cljcc/parser.clj')
| -rw-r--r-- | src/cljcc/parser.clj | 14 |
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]))))) |
