@@ -100,7 +100,8 @@ where TOKEN-KIND is a symbol like '[identifier]"
100
100
(bracket-level :accessor ls-bracket-level :initform 0 :type fixnum )
101
101
(open-deco :initform nil )
102
102
(return-count :initform 0 )
103
- (last-newline-in-source :reader ls-last-newline-in-source :initform :unknown ))
103
+ (last-newline-in-source :reader ls-last-newline-in-source :initform :unknown )
104
+ (last-returned-value :accessor ls-last-returned-value :initform nil ))
104
105
(:metaclass closer-mop :funcallable-standard-class))
105
106
106
107
(defmethod print-object ((lexer lexer) stream )
@@ -124,6 +125,7 @@ where TOKEN-KIND is a symbol like '[identifier]"
124
125
(define-symbol-macro %lex-curr-line-no% (ls-curr-line-no *lex-state* ))
125
126
(define-symbol-macro %lex-string% (ls-string *lex-state* ))
126
127
(define-symbol-macro %lex-tab-width% (ls-tab-width *lex-state* ))
128
+ (define-symbol-macro %lex-last-returned-value% (ls-last-returned-value *lex-state* ))
127
129
128
130
(defgeneric call-lexer (yacc-version lexer op)
129
131
(:documentation " Returns either the eof-token, or two values: TOKEN-KIND, TOKEN-VALUE" ))
@@ -162,6 +164,7 @@ On EOF returns: eof-token, eof-token."
162
164
(flet ((lex-return (token value source-loc &optional msg)
163
165
(when *lex-debug* (format t " Lexer returns: ~S ~S ~S ~@[ ~A ~] ~% " token value source-loc msg))
164
166
(incf return-count)
167
+ (setf %lex-last-returned-value% value)
165
168
(return-from call-lexer (values token value source-loc)))
166
169
(lex-todo (token value)
167
170
(when *lex-debug* (format t " Lexer todo: ~S ~S~% " token value))
@@ -234,6 +237,12 @@ On EOF returns: eof-token, eof-token."
234
237
(read-kind :string c)
235
238
(lex-return ' [literal-expr] (list ' [literal-expr] :string val) source-loc)))
236
239
240
+ ((and (char= c #\. )
241
+ (member %lex-last-returned-value% ' ([from] [.])))
242
+ (multiple-value-bind (val source-loc)
243
+ (read-kind :dot c)
244
+ (lex-return val val source-loc)))
245
+
237
246
((or (punct-char1-p c)
238
247
(punct-char-not-punct-char1-p c))
239
248
(multiple-value-bind (token source-loc)
@@ -422,6 +431,11 @@ Used by compiler to generate 'forbidden' identfiers.")
422
431
(or (find-symbol str (load-time-value (find-package :clpython.ast.reserved )))
423
432
(intern str (load-time-value (find-package :clpython.user ))))))
424
433
434
+ (defmethod read-kind ((kind (eql :dot )) c1 &rest args)
435
+ (declare (ignorable kind))
436
+ (assert (char= c1 #\. ))
437
+ ' [.])
438
+
425
439
; ; String
426
440
427
441
(defmethod read-kind ((kind (eql :string )) ch1 &key raw unicode)
0 commit comments