Changeset 12


Ignore:
Timestamp:
06/25/2007 10:35:32 PM (19 years ago)
Author:
dsowen
Message:

Fixed: Support different mode for repeatedly lexing tail to avoid
slow-downs from deeply-displaced arrays.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lex.lisp

    r10 r12  
    3333                 regex-list)))
    3434    (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)))
    3836
    3937(defmacro deflexer (name &body body)
     
    4745        (classes (map 'vector #'second body))
    4846        (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))))
    5249        (let ((idx (position-if #'identity parts)))
    5350          (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.