branch: elpa/parseclj
commit 67171853f585dd3e447ce4f0147400c1ddf8598b
Author: Arne Brasseur <[email protected]>
Commit: Arne Brasseur <[email protected]>
lex characters
---
clj-lex-test.el | 17 ++++++++++++-----
clj-lex.el | 30 ++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 5 deletions(-)
diff --git a/clj-lex-test.el b/clj-lex-test.el
index d70b706e35..89035d54cd 100644
--- a/clj-lex-test.el
+++ b/clj-lex-test.el
@@ -63,11 +63,18 @@
(goto-char 1)
(should (equal (clj-lex-next) '((type . :symbol) (form . "hello-world")
(pos . 1)))))
- ;; (with-temp-buffer
- ;; (insert "\\newline\\return\\space\\tab\\a\\b\\c")
- ;; (goto-char 1)
- ;; (should (equal (clj-lex-next) (clj-lex-token :character "\\newline"
1))))
- )
+ (with-temp-buffer
+ (insert "\\newline\\return\\space\\tab\\a\\b\\c")
+ (goto-char 1)
+ (should (equal (clj-lex-next) (clj-lex-token :character "\\newline" 1)))
+ (should (equal (clj-lex-next) (clj-lex-token :character "\\return" 9)))
+ (should (equal (clj-lex-next) (clj-lex-token :character "\\space" 16)))
+ (should (equal (clj-lex-next) (clj-lex-token :character "\\tab" 22)))
+ (should (equal (clj-lex-next) (clj-lex-token :character "\\a" 26)))
+ (should (equal (clj-lex-next) (clj-lex-token :character "\\b" 28)))
+ (should (equal (clj-lex-next) (clj-lex-token :character "\\c" 30)))
+
+ ))
(ert-deftest clj-lex-test-at-number? ()
(dolist (str '("123" ".9" "+1" "0" "-456"))
diff --git a/clj-lex.el b/clj-lex.el
index 0dc28a0da0..38f1b7d00c 100644
--- a/clj-lex.el
+++ b/clj-lex.el
@@ -111,6 +111,33 @@
(clj-lex-token :string (buffer-substring-no-properties pos (point))
pos))
(clj-lex-token :lex-error (buffer-substring-no-properties pos (point))
pos))))
+(defun clj-lex-lookahead (n)
+ (buffer-substring-no-properties (point) (min (+ (point) n) (point-max))))
+
+(defun clj-lex-character ()
+ (let ((pos (point)))
+ (right-char)
+ (cond
+ ((equal (clj-lex-lookahead 3) "tab")
+ (right-char 3)
+ (clj-lex-token :character (buffer-substring-no-properties pos (point))
pos))
+
+ ((equal (clj-lex-lookahead 5) "space")
+ (right-char 5)
+ (clj-lex-token :character (buffer-substring-no-properties pos (point))
pos))
+
+ ((equal (clj-lex-lookahead 6) "return")
+ (right-char 6)
+ (clj-lex-token :character (buffer-substring-no-properties pos (point))
pos))
+
+ ((equal (clj-lex-lookahead 7) "newline")
+ (right-char 7)
+ (clj-lex-token :character (buffer-substring-no-properties pos (point))
pos))
+
+ (t
+ (right-char)
+ (clj-lex-token :character (buffer-substring-no-properties pos (point))
pos)))))
+
(defun clj-lex-next ()
(if (clj-lex-at-eof?)
(clj-lex-token :eof nil (point))
@@ -137,6 +164,9 @@
((equal char ?\")
(clj-lex-string))
+ ((equal char ?\\)
+ (clj-lex-character))
+
":("))))
(provide 'clj-lex)