aboutsummaryrefslogtreecommitdiff
path: root/src/cljcc/tacky.clj
diff options
context:
space:
mode:
authorShagun Agrawal <agrawalshagun07@gmail.com>2024-08-22 00:51:56 +0530
committerShagun Agrawal <agrawalshagun07@gmail.com>2024-08-22 00:51:56 +0530
commite88635d6d32055cc7d3a4ccf16c1a74cb5b88d1c (patch)
tree103ed07e89ae47cc723382ee712a0ca61b869844 /src/cljcc/tacky.clj
parent502a23ce2966d4ad96ad65735718fcaaebc8d4e1 (diff)
Add analyzer for validating program semantics
Add validator for semantic analysis Pass ch5 test cases for validate flag
Diffstat (limited to 'src/cljcc/tacky.clj')
-rw-r--r--src/cljcc/tacky.clj31
1 files changed, 5 insertions, 26 deletions
diff --git a/src/cljcc/tacky.clj b/src/cljcc/tacky.clj
index 52d830e..b7d6e2e 100644
--- a/src/cljcc/tacky.clj
+++ b/src/cljcc/tacky.clj
@@ -2,37 +2,19 @@
(:require
[clojure.pprint :as pp]
[cljcc.lexer :as l]
- [clojure.string :as s]
+ [cljcc.util :as u]
[cljcc.parser :as p]))
-(def counter "Global integer counter for generating unique identifier names." (atom 0))
-
-(defn- create-identifier
- "Returns a unique identifier. Used for generating tacky variable names.
-
- Removes : from keywords.
- Replaces all - with _ for generating valid assembly names."
- ([]
- (create-identifier "tmp"))
- ([identifier]
- (let [n @counter
- _ (swap! counter #(+ % 1))]
- (-> identifier
- (str "." n)
- (s/replace #":" "")
- (s/replace #"-" "_")))))
-
(defn- variable
([]
- {:type :variable
- :value (create-identifier "var")})
+ (variable "var"))
([identifier]
{:type :variable
- :value (create-identifier (str identifier))}))
+ :value (u/create-identifier! (str identifier))}))
(defn- label
- ([] (create-identifier "label"))
- ([ident] (create-identifier ident)))
+ ([] (label "label"))
+ ([ident] (u/create-identifier! ident)))
(defn constant [^Integer v]
{:type :constant
@@ -201,7 +183,6 @@
(remove nil? (ret-instructions (:value statement))))
(defn tacky-generate [ast]
- (reset! counter 0)
(map (fn [f]
(-> f
(assoc :instructions (flatten (map ast-statement->tacky-instructions (:statements f))))
@@ -210,8 +191,6 @@
(comment
- (reset! counter 0)
-
(pp/pprint
(tacky-generate
(p/parse (l/lex "int main(void) {return -(~1);}"))))