aboutsummaryrefslogtreecommitdiff
path: root/src/cljcc/util.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/cljcc/util.clj')
-rw-r--r--src/cljcc/util.clj34
1 files changed, 12 insertions, 22 deletions
diff --git a/src/cljcc/util.clj b/src/cljcc/util.clj
index f75dd5f..eb77ad6 100644
--- a/src/cljcc/util.clj
+++ b/src/cljcc/util.clj
@@ -6,6 +6,8 @@
(def ^:private counter "Global integer counter for generating unique identifier names." (atom 0))
+(set! *warn-on-reflection* true)
+
(defn create-identifier!
"Returns a unique identifier. Used for generating unique identifier.
@@ -74,36 +76,24 @@
(defn whitespace? [^Character ch]
(Character/isWhitespace ch))
-(defn- valid-long?
- "Validates string to be of form [0-9]+[lL]\b.
-
- Verifies that `l` or `L` occurs only once, and at the end."
- [s]
- (try
- (let [strip-l-or-L (if-let [_ (or (str/ends-with? s "l")
- (str/ends-with? s "L"))]
- (subs s 0 (dec (count s)))
- s)
- _ (-> strip-l-or-L
- Long/parseLong
- Long/toString)]
- s)
- (catch Exception _e
- false)))
-
-(defn- matches-regex [re s]
+(defn matches-regex [re s]
(not (nil? (re-matches re s))))
+(def unsigned-long-re #"[0-9]+([lL][uU]|[uU][lL])")
+(def signed-long-re #"[0-9]+[lL]")
+(def unsigned-int-re #"[0-9]+[uU]")
+(def signed-int-re #"[0-9]+")
+
(defn read-number
"Returns number in string form.
Checks whether number is valid long. If no, checks if it valid int.
Otherwise error."
[s line col]
- (if-let [_ (or (matches-regex #"[0-9]+" s)
- (matches-regex #"[0-9]+[lL]" s)
- (matches-regex #"[0-9]+[uU]" s)
- (matches-regex #"[0-9]+([lL][uU]|[uU][lL])" s))]
+ (if-let [_ (or (matches-regex signed-int-re s)
+ (matches-regex signed-long-re s)
+ (matches-regex unsigned-int-re s)
+ (matches-regex unsigned-long-re s))]
s
(exc/lex-error {:line line
:col col})))