Changeset 12 for trunk/lex.lisp
- Timestamp:
- 06/25/2007 10:35:32 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/lex.lisp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/lex.lisp
r10 r12 33 33 regex-list))) 34 34 (when (rest mapped) (setq mapped `((:alternation ,@mapped)))) 35 `(:sequence (:flags :single-line-mode-p) :start-anchor 36 (:group ,@mapped) 37 (:register (:greedy-repetition 0 nil :everything))))) 35 `(:sequence (:flags :single-line-mode-p) :start-anchor ,@mapped))) 38 36 39 37 (defmacro deflexer (name &body body) … … 47 45 (classes (map 'vector #'second body)) 48 46 (filters (map 'vector #'third body))) 49 `(defun ,name (line) 50 (let ((parts 51 (nth-value 1 (scan-to-strings (quote ,regex) line)))) 47 `(defun ,name (input &optional (start 0)) 48 (let ((parts (nth-value 3 (scan (quote ,regex) input :start start)))) 52 49 (let ((idx (position-if #'identity parts))) 53 50 (when idx 54 (let ((token (aref parts idx)) 55 (filter (aref ,filters idx))) 56 (values (aref ,classes idx) 57 (if filter (funcall filter token) token) 58 (aref parts ,(length classes)))))))))) 51 (let ((end (aref parts idx))) 52 (let ((image (make-array (- end start) 53 :element-type 'character 54 :displaced-to input 55 :displaced-index-offset start)) 56 (filter (aref ,filters idx))) 57 (values (aref ,classes idx) 58 (if filter (funcall filter image) image) 59 end)))))))))
Note: See TracChangeset
for help on using the changeset viewer.
