[climacs-cvs] CVS update: climacs/prolog-syntax.lisp
Christophe Rhodes
crhodes at common-lisp.net
Wed Apr 6 11:54:27 UTC 2005
Update of /project/climacs/cvsroot/climacs
In directory common-lisp.net:/tmp/cvs-serv14737
Modified Files:
prolog-syntax.lisp
Log Message:
Implement incremental lexing.
The contract is that
* UPDATE-SYNTAX notes the latest possible position that is known to be valid.
* UPDATE-SYNTAX-FOR-DISPLAY, within the display bounds, attempts to revalidate
the previous lex if possible, or relex if not. After
UPDATE-SYNTAX-FOR-DISPLAY has finished, the entirety of the remaining
lexemes are known valid (all the rest have been deleted).
This may be wrong: it may be that, since lexing takes essentially no time
at all, the whole buffer should be relexed each time.
Date: Wed Apr 6 13:54:27 2005
Author: crhodes
Index: climacs/prolog-syntax.lisp
diff -u climacs/prolog-syntax.lisp:1.12 climacs/prolog-syntax.lisp:1.13
--- climacs/prolog-syntax.lisp:1.12 Wed Apr 6 11:30:19 2005
+++ climacs/prolog-syntax.lisp Wed Apr 6 13:54:27 2005
@@ -148,7 +148,7 @@
(make-instance 'layout-text :cont nil))
(defclass prolog-lexer (incremental-lexer)
- ((valid-lex :initarg :valid-lex :accessor valid-lex :initform 1)))
+ ((valid-lex :initarg :valid-lex :initform 1)))
(defmethod next-lexeme ((lexer prolog-lexer) scan)
(let ((string (make-array 0 :element-type 'character
@@ -852,21 +852,26 @@
(defmethod update-syntax-for-display (buffer (syntax prolog-syntax) top bot)
(with-slots (parser lexer valid-parse) syntax
(with-slots (climacs-syntax::lexemes valid-lex) lexer
- (let ((scan (clone-mark (low-mark buffer) :left)))
+ (let ((scan (clone-mark (low-mark buffer) :left))
+ (high-mark (high-mark buffer)))
(setf (offset scan)
(end-offset (lexeme lexer (1- valid-lex))))
- ;; lex as far as we need. We actually win quite a lot if we
- ;; can implement the splicing described in the FIXME note,
- ;; below, because there's then a good chance that CLIM's
- ;; incremental redisplay will Do The Right Thing (on the EQ
- ;; lexemes)
- (loop do (skip-inter-lexeme-objects lexer scan)
+ (loop named relex
+ do (skip-inter-lexeme-objects lexer scan)
until (end-of-buffer-p scan)
until (mark<= bot (start-offset (lexeme lexer (1- valid-lex))))
- ;; FIXME: a further criterion is when scan matches the
- ;; start-offset of an element in lexemes, at which point
- ;; we know that the entirety of the rest of the old lex
- ;; is valid without doing any further work.
+ do (when (mark>= scan high-mark)
+ (do ()
+ ((= (nb-lexemes lexer) valid-lex))
+ (let ((l (lexeme lexer i)))
+ (cond
+ ((mark< scan (start-offset l))
+ (return nil))
+ ((mark= scan (start-offset l))
+ (setf valid-lex (nb-lexemes lexer))
+ (return-from relex))
+ (t
+ (delete* climacs-syntax::lexemes valid-lex))))))
do (let* ((start-mark (clone-mark scan))
(lexeme (next-lexeme lexer scan))
(size (- (offset scan) (offset start-mark))))
@@ -874,16 +879,18 @@
(slot-value lexeme 'climacs-syntax::size) size)
(insert-lexeme lexer valid-lex lexeme)
(incf valid-lex)))
- ;; remove lexemes which we know to be invalid
- (let ((end (end-offset (lexeme lexer (1- valid-lex)))))
- (loop until (= (nb-lexemes lexer) valid-lex)
- while (< (start-offset (lexeme lexer valid-lex)) end)
- do (delete* climacs-syntax::lexemes valid-lex))))
+ ;; remove lexemes which we know to be invalid.
+ ;;
+ ;; If we wanted some additional complexity, we could maintain
+ ;; the possibility of not matching a start lexeme in the
+ ;; visible region, but possibly elsewhere instead; however,
+ ;; for now, simply assume that the VALID-LEX from above is
+ ;; definitive.
+ (loop until (= (nb-lexemes lexer) valid-lex)
+ do (delete* climacs-syntax::lexemes valid-lex)))
;; parse up to the limit of validity imposed by the lexer, or
- ;; the bottom of the visible area
+ ;; the bottom of the visible area, whichever comes sooner
(loop until (= valid-parse valid-lex)
- ;; NOTE: this ceases being the same condition as the above
- ;; as soon as the FIXME note above is implemented.
until (mark<= bot (start-offset (lexeme lexer (1- valid-parse))))
do (let ((current-token (lexeme lexer (1- valid-parse)))
(next-lexeme (lexeme lexer valid-parse)))
@@ -900,7 +907,8 @@
(let* ((low-mark (low-mark buffer))
(high-mark (high-mark buffer)))
(when (mark<= low-mark high-mark)
- (with-slots (climacs-syntax::lexemes valid-lex) lexer
+ (with-slots (climacs-syntax::lexemes valid-lex)
+ lexer
(let ((start 1)
(end (nb-elements climacs-syntax::lexemes)))
(loop while (< start end)
More information about the Climacs-cvs
mailing list