diff options
| -rw-r--r-- | README.md | 3 | ||||
| -rw-r--r-- | src/cljcc/lexer.clj | 10 | ||||
| -rw-r--r-- | src/cljcc/token.clj | 3 |
3 files changed, 13 insertions, 3 deletions
@@ -53,4 +53,5 @@ bb run-main "path/to/file.c" Some talks / projects which helped in implementation. * [What's So Hard About Writing A Compiler, Anyway? Oh - Ramsey Nasser](https://www.youtube.com/watch?v=_7sncBhluXI) - +* [Clojure Lexer implementation by github.com/Vikasg7](https://github.com/ThePrimeagen/ts-rust-zig-deez/tree/master/clj) + diff --git a/src/cljcc/lexer.clj b/src/cljcc/lexer.clj index 10742f0..9922887 100644 --- a/src/cljcc/lexer.clj +++ b/src/cljcc/lexer.clj @@ -9,10 +9,12 @@ :line 1 :col 1}) +(str \1 nil) + (defn lex ([source] (lex source 0 (lexer-ctx))) - ([[ch :as source] pos {:keys [line col] :as ctx}] + ([[ch pk :as source] pos {:keys [line col] :as ctx}] (cond (empty? source) (update ctx :tokens #(conj % (t/create :eof line col))) (newline? ch) (recur (next source) @@ -21,6 +23,12 @@ (update :line inc) (update :col (fn [_] 1)))) (contains? + t/chrs-kind-map (str ch pk)) (recur (next (next source)) + (+ pos 2) + (-> ctx + (update :col #(+ % 2)) + (update :tokens #(conj % (t/create (get t/chrs-kind-map (str ch pk)) line col))))) + (contains? t/chrs-kind-map ch) (recur (next source) (+ pos 1) (-> ctx diff --git a/src/cljcc/token.clj b/src/cljcc/token.clj index 6df4f43..63c1eda 100644 --- a/src/cljcc/token.clj +++ b/src/cljcc/token.clj @@ -47,7 +47,8 @@ "++" :increment \; :semicolon \+ :plus - \- :minus + \- :hyphen + \~ :complement \* :multiply \% :remainder \/ :divide}) |
