parser: extends grammar to support annotations
[nit.git] / src / parser / lexer.nit
index e66dc87..588180e 100644 (file)
@@ -6,13 +6,18 @@ intrude import parser_nodes
 private import tables
 
 redef class Token
-    readable var _text: String
+    var _text: nullable String
 
-    fun parser_index: Int is abstract
-
-    redef fun to_s: String do
-        return "'{_text}'"
+    redef fun text
+    do
+        var res = _text
+        if res != null then return res
+        res = location.text
+       _text = res
+       return res
     end
+
+    fun parser_index: Int is abstract
 end
 
 redef class TEol
@@ -21,9 +26,8 @@ redef class TEol
        return 0
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
@@ -34,9 +38,8 @@ redef class TComment
        return 1
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
@@ -47,9 +50,8 @@ redef class TKwmodule
        return 2
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
@@ -62,7 +64,6 @@ redef class TKwimport
 
     init init_tk(loc: Location)
     do
-        _text = once "import"
                _location = loc
     end
 end
@@ -75,7 +76,6 @@ redef class TKwclass
 
     init init_tk(loc: Location)
     do
-        _text = once "class"
                _location = loc
     end
 end
@@ -88,7 +88,6 @@ redef class TKwabstract
 
     init init_tk(loc: Location)
     do
-        _text = once "abstract"
                _location = loc
     end
 end
@@ -101,7 +100,6 @@ redef class TKwinterface
 
     init init_tk(loc: Location)
     do
-        _text = once "interface"
                _location = loc
     end
 end
@@ -112,14 +110,13 @@ redef class TKwenum
        return 7
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TKwspecial
+redef class TKwend
     redef fun parser_index: Int
     do
        return 8
@@ -127,12 +124,11 @@ redef class TKwspecial
 
     init init_tk(loc: Location)
     do
-        _text = once "special"
                _location = loc
     end
 end
 
-redef class TKwend
+redef class TKwmeth
     redef fun parser_index: Int
     do
        return 9
@@ -140,12 +136,11 @@ redef class TKwend
 
     init init_tk(loc: Location)
     do
-        _text = once "end"
                _location = loc
     end
 end
 
-redef class TKwmeth
+redef class TKwtype
     redef fun parser_index: Int
     do
        return 10
@@ -153,12 +148,11 @@ redef class TKwmeth
 
     init init_tk(loc: Location)
     do
-        _text = once "fun"
                _location = loc
     end
 end
 
-redef class TKwtype
+redef class TKwinit
     redef fun parser_index: Int
     do
        return 11
@@ -166,12 +160,11 @@ redef class TKwtype
 
     init init_tk(loc: Location)
     do
-        _text = once "type"
                _location = loc
     end
 end
 
-redef class TKwinit
+redef class TKwredef
     redef fun parser_index: Int
     do
        return 12
@@ -179,12 +172,11 @@ redef class TKwinit
 
     init init_tk(loc: Location)
     do
-        _text = once "init"
                _location = loc
     end
 end
 
-redef class TKwredef
+redef class TKwis
     redef fun parser_index: Int
     do
        return 13
@@ -192,12 +184,11 @@ redef class TKwredef
 
     init init_tk(loc: Location)
     do
-        _text = once "redef"
                _location = loc
     end
 end
 
-redef class TKwis
+redef class TKwdo
     redef fun parser_index: Int
     do
        return 14
@@ -205,12 +196,11 @@ redef class TKwis
 
     init init_tk(loc: Location)
     do
-        _text = once "is"
                _location = loc
     end
 end
 
-redef class TKwdo
+redef class TKwreadable
     redef fun parser_index: Int
     do
        return 15
@@ -218,12 +208,11 @@ redef class TKwdo
 
     init init_tk(loc: Location)
     do
-        _text = once "do"
                _location = loc
     end
 end
 
-redef class TKwreadable
+redef class TKwwritable
     redef fun parser_index: Int
     do
        return 16
@@ -231,12 +220,11 @@ redef class TKwreadable
 
     init init_tk(loc: Location)
     do
-        _text = once "readable"
                _location = loc
     end
 end
 
-redef class TKwwritable
+redef class TKwvar
     redef fun parser_index: Int
     do
        return 17
@@ -244,12 +232,11 @@ redef class TKwwritable
 
     init init_tk(loc: Location)
     do
-        _text = once "writable"
                _location = loc
     end
 end
 
-redef class TKwvar
+redef class TKwintern
     redef fun parser_index: Int
     do
        return 18
@@ -257,12 +244,11 @@ redef class TKwvar
 
     init init_tk(loc: Location)
     do
-        _text = once "var"
                _location = loc
     end
 end
 
-redef class TKwintern
+redef class TKwextern
     redef fun parser_index: Int
     do
        return 19
@@ -270,12 +256,11 @@ redef class TKwintern
 
     init init_tk(loc: Location)
     do
-        _text = once "intern"
                _location = loc
     end
 end
 
-redef class TKwextern
+redef class TKwprotected
     redef fun parser_index: Int
     do
        return 20
@@ -283,12 +268,11 @@ redef class TKwextern
 
     init init_tk(loc: Location)
     do
-        _text = once "extern"
                _location = loc
     end
 end
 
-redef class TKwprotected
+redef class TKwprivate
     redef fun parser_index: Int
     do
        return 21
@@ -296,12 +280,11 @@ redef class TKwprotected
 
     init init_tk(loc: Location)
     do
-        _text = once "protected"
                _location = loc
     end
 end
 
-redef class TKwprivate
+redef class TKwintrude
     redef fun parser_index: Int
     do
        return 22
@@ -309,12 +292,11 @@ redef class TKwprivate
 
     init init_tk(loc: Location)
     do
-        _text = once "private"
                _location = loc
     end
 end
 
-redef class TKwintrude
+redef class TKwif
     redef fun parser_index: Int
     do
        return 23
@@ -322,12 +304,11 @@ redef class TKwintrude
 
     init init_tk(loc: Location)
     do
-        _text = once "intrude"
                _location = loc
     end
 end
 
-redef class TKwif
+redef class TKwthen
     redef fun parser_index: Int
     do
        return 24
@@ -335,12 +316,11 @@ redef class TKwif
 
     init init_tk(loc: Location)
     do
-        _text = once "if"
                _location = loc
     end
 end
 
-redef class TKwthen
+redef class TKwelse
     redef fun parser_index: Int
     do
        return 25
@@ -348,12 +328,11 @@ redef class TKwthen
 
     init init_tk(loc: Location)
     do
-        _text = once "then"
                _location = loc
     end
 end
 
-redef class TKwelse
+redef class TKwwhile
     redef fun parser_index: Int
     do
        return 26
@@ -361,12 +340,11 @@ redef class TKwelse
 
     init init_tk(loc: Location)
     do
-        _text = once "else"
                _location = loc
     end
 end
 
-redef class TKwwhile
+redef class TKwloop
     redef fun parser_index: Int
     do
        return 27
@@ -374,12 +352,11 @@ redef class TKwwhile
 
     init init_tk(loc: Location)
     do
-        _text = once "while"
                _location = loc
     end
 end
 
-redef class TKwloop
+redef class TKwfor
     redef fun parser_index: Int
     do
        return 28
@@ -387,12 +364,11 @@ redef class TKwloop
 
     init init_tk(loc: Location)
     do
-        _text = once "loop"
                _location = loc
     end
 end
 
-redef class TKwfor
+redef class TKwin
     redef fun parser_index: Int
     do
        return 29
@@ -400,12 +376,11 @@ redef class TKwfor
 
     init init_tk(loc: Location)
     do
-        _text = once "for"
                _location = loc
     end
 end
 
-redef class TKwin
+redef class TKwand
     redef fun parser_index: Int
     do
        return 30
@@ -413,12 +388,11 @@ redef class TKwin
 
     init init_tk(loc: Location)
     do
-        _text = once "in"
                _location = loc
     end
 end
 
-redef class TKwand
+redef class TKwor
     redef fun parser_index: Int
     do
        return 31
@@ -426,12 +400,11 @@ redef class TKwand
 
     init init_tk(loc: Location)
     do
-        _text = once "and"
                _location = loc
     end
 end
 
-redef class TKwor
+redef class TKwnot
     redef fun parser_index: Int
     do
        return 32
@@ -439,12 +412,11 @@ redef class TKwor
 
     init init_tk(loc: Location)
     do
-        _text = once "or"
                _location = loc
     end
 end
 
-redef class TKwnot
+redef class TKwreturn
     redef fun parser_index: Int
     do
        return 33
@@ -452,12 +424,11 @@ redef class TKwnot
 
     init init_tk(loc: Location)
     do
-        _text = once "not"
                _location = loc
     end
 end
 
-redef class TKwreturn
+redef class TKwcontinue
     redef fun parser_index: Int
     do
        return 34
@@ -465,12 +436,11 @@ redef class TKwreturn
 
     init init_tk(loc: Location)
     do
-        _text = once "return"
                _location = loc
     end
 end
 
-redef class TKwcontinue
+redef class TKwbreak
     redef fun parser_index: Int
     do
        return 35
@@ -478,12 +448,11 @@ redef class TKwcontinue
 
     init init_tk(loc: Location)
     do
-        _text = once "continue"
                _location = loc
     end
 end
 
-redef class TKwbreak
+redef class TKwabort
     redef fun parser_index: Int
     do
        return 36
@@ -491,12 +460,11 @@ redef class TKwbreak
 
     init init_tk(loc: Location)
     do
-        _text = once "break"
                _location = loc
     end
 end
 
-redef class TKwabort
+redef class TKwassert
     redef fun parser_index: Int
     do
        return 37
@@ -504,12 +472,11 @@ redef class TKwabort
 
     init init_tk(loc: Location)
     do
-        _text = once "abort"
                _location = loc
     end
 end
 
-redef class TKwassert
+redef class TKwnew
     redef fun parser_index: Int
     do
        return 38
@@ -517,12 +484,11 @@ redef class TKwassert
 
     init init_tk(loc: Location)
     do
-        _text = once "assert"
                _location = loc
     end
 end
 
-redef class TKwnew
+redef class TKwisa
     redef fun parser_index: Int
     do
        return 39
@@ -530,12 +496,11 @@ redef class TKwnew
 
     init init_tk(loc: Location)
     do
-        _text = once "new"
                _location = loc
     end
 end
 
-redef class TKwisa
+redef class TKwonce
     redef fun parser_index: Int
     do
        return 40
@@ -543,12 +508,11 @@ redef class TKwisa
 
     init init_tk(loc: Location)
     do
-        _text = once "isa"
                _location = loc
     end
 end
 
-redef class TKwonce
+redef class TKwsuper
     redef fun parser_index: Int
     do
        return 41
@@ -556,12 +520,11 @@ redef class TKwonce
 
     init init_tk(loc: Location)
     do
-        _text = once "once"
                _location = loc
     end
 end
 
-redef class TKwsuper
+redef class TKwself
     redef fun parser_index: Int
     do
        return 42
@@ -569,12 +532,11 @@ redef class TKwsuper
 
     init init_tk(loc: Location)
     do
-        _text = once "super"
                _location = loc
     end
 end
 
-redef class TKwself
+redef class TKwtrue
     redef fun parser_index: Int
     do
        return 43
@@ -582,12 +544,11 @@ redef class TKwself
 
     init init_tk(loc: Location)
     do
-        _text = once "self"
                _location = loc
     end
 end
 
-redef class TKwtrue
+redef class TKwfalse
     redef fun parser_index: Int
     do
        return 44
@@ -595,12 +556,11 @@ redef class TKwtrue
 
     init init_tk(loc: Location)
     do
-        _text = once "true"
                _location = loc
     end
 end
 
-redef class TKwfalse
+redef class TKwnull
     redef fun parser_index: Int
     do
        return 45
@@ -608,12 +568,11 @@ redef class TKwfalse
 
     init init_tk(loc: Location)
     do
-        _text = once "false"
                _location = loc
     end
 end
 
-redef class TKwnull
+redef class TKwas
     redef fun parser_index: Int
     do
        return 46
@@ -621,12 +580,11 @@ redef class TKwnull
 
     init init_tk(loc: Location)
     do
-        _text = once "null"
                _location = loc
     end
 end
 
-redef class TKwas
+redef class TKwnullable
     redef fun parser_index: Int
     do
        return 47
@@ -634,12 +592,11 @@ redef class TKwas
 
     init init_tk(loc: Location)
     do
-        _text = once "as"
                _location = loc
     end
 end
 
-redef class TKwnullable
+redef class TKwisset
     redef fun parser_index: Int
     do
        return 48
@@ -647,12 +604,11 @@ redef class TKwnullable
 
     init init_tk(loc: Location)
     do
-        _text = once "nullable"
                _location = loc
     end
 end
 
-redef class TKwisset
+redef class TKwlabel
     redef fun parser_index: Int
     do
        return 49
@@ -660,12 +616,11 @@ redef class TKwisset
 
     init init_tk(loc: Location)
     do
-        _text = once "isset"
                _location = loc
     end
 end
 
-redef class TKwlabel
+redef class TKwdebug
     redef fun parser_index: Int
     do
        return 50
@@ -673,7 +628,6 @@ redef class TKwlabel
 
     init init_tk(loc: Location)
     do
-        _text = once "label"
                _location = loc
     end
 end
@@ -686,7 +640,6 @@ redef class TOpar
 
     init init_tk(loc: Location)
     do
-        _text = once "("
                _location = loc
     end
 end
@@ -699,7 +652,6 @@ redef class TCpar
 
     init init_tk(loc: Location)
     do
-        _text = once ")"
                _location = loc
     end
 end
@@ -712,7 +664,6 @@ redef class TObra
 
     init init_tk(loc: Location)
     do
-        _text = once "["
                _location = loc
     end
 end
@@ -725,7 +676,6 @@ redef class TCbra
 
     init init_tk(loc: Location)
     do
-        _text = once "]"
                _location = loc
     end
 end
@@ -738,7 +688,6 @@ redef class TComma
 
     init init_tk(loc: Location)
     do
-        _text = once ","
                _location = loc
     end
 end
@@ -751,7 +700,6 @@ redef class TColumn
 
     init init_tk(loc: Location)
     do
-        _text = once ":"
                _location = loc
     end
 end
@@ -764,7 +712,6 @@ redef class TQuad
 
     init init_tk(loc: Location)
     do
-        _text = once "::"
                _location = loc
     end
 end
@@ -777,7 +724,6 @@ redef class TAssign
 
     init init_tk(loc: Location)
     do
-        _text = once "="
                _location = loc
     end
 end
@@ -790,7 +736,6 @@ redef class TPluseq
 
     init init_tk(loc: Location)
     do
-        _text = once "+="
                _location = loc
     end
 end
@@ -803,7 +748,6 @@ redef class TMinuseq
 
     init init_tk(loc: Location)
     do
-        _text = once "-="
                _location = loc
     end
 end
@@ -816,7 +760,6 @@ redef class TDotdotdot
 
     init init_tk(loc: Location)
     do
-        _text = once "..."
                _location = loc
     end
 end
@@ -829,7 +772,6 @@ redef class TDotdot
 
     init init_tk(loc: Location)
     do
-        _text = once ".."
                _location = loc
     end
 end
@@ -842,7 +784,6 @@ redef class TDot
 
     init init_tk(loc: Location)
     do
-        _text = once "."
                _location = loc
     end
 end
@@ -855,7 +796,6 @@ redef class TPlus
 
     init init_tk(loc: Location)
     do
-        _text = once "+"
                _location = loc
     end
 end
@@ -868,7 +808,6 @@ redef class TMinus
 
     init init_tk(loc: Location)
     do
-        _text = once "-"
                _location = loc
     end
 end
@@ -881,7 +820,6 @@ redef class TStar
 
     init init_tk(loc: Location)
     do
-        _text = once "*"
                _location = loc
     end
 end
@@ -894,7 +832,6 @@ redef class TSlash
 
     init init_tk(loc: Location)
     do
-        _text = once "/"
                _location = loc
     end
 end
@@ -907,7 +844,6 @@ redef class TPercent
 
     init init_tk(loc: Location)
     do
-        _text = once "%"
                _location = loc
     end
 end
@@ -920,7 +856,6 @@ redef class TEq
 
     init init_tk(loc: Location)
     do
-        _text = once "=="
                _location = loc
     end
 end
@@ -933,7 +868,6 @@ redef class TNe
 
     init init_tk(loc: Location)
     do
-        _text = once "!="
                _location = loc
     end
 end
@@ -946,7 +880,6 @@ redef class TLt
 
     init init_tk(loc: Location)
     do
-        _text = once "<"
                _location = loc
     end
 end
@@ -959,7 +892,6 @@ redef class TLe
 
     init init_tk(loc: Location)
     do
-        _text = once "<="
                _location = loc
     end
 end
@@ -972,7 +904,6 @@ redef class TLl
 
     init init_tk(loc: Location)
     do
-        _text = once "<<"
                _location = loc
     end
 end
@@ -985,7 +916,6 @@ redef class TGt
 
     init init_tk(loc: Location)
     do
-        _text = once ">"
                _location = loc
     end
 end
@@ -998,7 +928,6 @@ redef class TGe
 
     init init_tk(loc: Location)
     do
-        _text = once ">="
                _location = loc
     end
 end
@@ -1011,7 +940,6 @@ redef class TGg
 
     init init_tk(loc: Location)
     do
-        _text = once ">>"
                _location = loc
     end
 end
@@ -1024,7 +952,6 @@ redef class TStarship
 
     init init_tk(loc: Location)
     do
-        _text = once "<=>"
                _location = loc
     end
 end
@@ -1037,137 +964,174 @@ redef class TBang
 
     init init_tk(loc: Location)
     do
-        _text = once "!"
                _location = loc
     end
 end
 
-redef class TClassid
+redef class TAt
     redef fun parser_index: Int
     do
        return 79
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TId
+redef class TClassid
     redef fun parser_index: Int
     do
        return 80
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TAttrid
+redef class TId
     redef fun parser_index: Int
     do
        return 81
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TNumber
+redef class TAttrid
     redef fun parser_index: Int
     do
        return 82
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TFloat
+redef class TNumber
     redef fun parser_index: Int
     do
        return 83
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TChar
+redef class TFloat
     redef fun parser_index: Int
     do
        return 84
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TString
+redef class TChar
     redef fun parser_index: Int
     do
        return 85
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TStartString
+redef class TString
     redef fun parser_index: Int
     do
        return 86
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TMidString
+redef class TStartString
     redef fun parser_index: Int
     do
        return 87
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
 
-redef class TEndString
+redef class TMidString
     redef fun parser_index: Int
     do
        return 88
     end
 
-    init init_tk(text: String, loc: Location)
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TEndString
+    redef fun parser_index: Int
+    do
+       return 89
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TBadChar
+    redef fun parser_index: Int
+    do
+       return 90
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TBadString
+    redef fun parser_index: Int
+    do
+       return 91
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TExternCodeSegment
+    redef fun parser_index: Int
+    do
+       return 92
+    end
+
+    init init_tk(loc: Location)
     do
-        _text = text
                _location = loc
     end
 end
@@ -1176,7 +1140,7 @@ end
 redef class EOF
     redef fun parser_index: Int
     do
-       return 89
+       return 93
     end
 
     init(loc: Location)
@@ -1207,17 +1171,11 @@ class Lexer
        # Lexer current state
        var _state: Int = 0
 
-       # Name of the stream (as given to tokens)
-       readable var _filename: String
-
-       # Input stream where character are read
-       var _stream: IStream
-
-       # Pushback buffer to store unread character
-       var _stream_buf: Buffer
+       # The source file
+       readable var _file: SourceFile
 
-       # Number of character stored in the pushback buffer
-       var _stream_pos: Int
+       # Current character in the stream
+       var _stream_pos: Int = 0
 
        # Current line number in the input stream
        var _line: Int = 0
@@ -1228,23 +1186,13 @@ class Lexer
        # Was the last character a cariage-return?
        var _cr: Bool = false
 
-       # If the end of stream?
-       var _eof: Bool = false
-
-       # Current working text read from the input stream
-       var _text: Buffer
-
        # Constante state values
        private fun state_initial: Int do return 0 end
 
        # Create a new lexer for a stream (and a name)
-       init(stream: IStream, fname: String)
+       init(file: SourceFile)
        do
-               _filename = fname
-               _text = new Buffer
-               _stream = stream
-               _stream_pos = -1
-               _stream_buf = new Buffer
+               _file = file
        end
 
        # Give the next token (but do not consume it)
@@ -1272,8 +1220,12 @@ class Lexer
        do
                var dfa_state = 0
 
+               var sp = _stream_pos
+               var start_stream_pos = sp
                var start_pos = _pos
                var start_line = _line
+               var string = _file.string
+               var string_len = string.length
 
                var accept_state = -1
                var accept_token = -1
@@ -1281,34 +1233,35 @@ class Lexer
                var accept_pos = -1
                var accept_line = -1
 
-               var text = _text
-               text.clear
-
                loop
-                       var c = get_char
+                       if sp >= string_len then
+                               dfa_state = -1
+                       else
+                               var c = string[sp].ascii
+                               sp += 1
 
-                       if c != -1 then
                                var cr = _cr
                                var line = _line
                                var pos = _pos
                                if c == 10 then
                                        if cr then
                                                cr = false
+                                               _file.line_starts[line] = sp
                                        else
                                                line = line + 1
                                                pos = 0
+                                               _file.line_starts[line] = sp
                                        end
                                else if c == 13 then
                                        line = line + 1
                                        pos = 0
                                        cr = true
+                                       _file.line_starts[line] = sp
                                else
                                        pos = pos + 1
                                        cr = false
                                end
 
-                               text.add(c.ascii)
-
                                loop
                                        var old_state = dfa_state
                                        if dfa_state < -1 then
@@ -1341,8 +1294,6 @@ class Lexer
                                _cr = cr
                                _line = line
                                _pos = pos
-                       else
-                               dfa_state = -1
                        end
 
                        if dfa_state >= 0 then
@@ -1350,30 +1301,27 @@ class Lexer
                                if tok != -1 then
                                        accept_state = dfa_state
                                        accept_token = tok
-                                       accept_length = text.length
+                                       accept_length = sp - start_stream_pos
                                        accept_pos = _pos
                                        accept_line = _line
                                end
                        else
                                if accept_state != -1 then
-                                       var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos)
+                                       var location = new Location(_file, start_line + 1, accept_line + 1, start_pos + 1, accept_pos)
                                        _pos = accept_pos
                                        _line = accept_line
-                                       push_back(accept_length)
+                                       _stream_pos = start_stream_pos + accept_length
                                        if accept_token == 0 then
                                                return null
                                        end
                                        if accept_token == 1 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TEol.init_tk(token_text, location)
+                                               return new TEol.init_tk(location)
                                        end
                                        if accept_token == 2 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TComment.init_tk(token_text, location)
+                                               return new TComment.init_tk(location)
                                        end
                                        if accept_token == 3 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TKwmodule.init_tk(token_text, location)
+                                               return new TKwmodule.init_tk(location)
                                        end
                                        if accept_token == 4 then
                                                return new TKwimport.init_tk(location)
@@ -1388,137 +1336,136 @@ class Lexer
                                                return new TKwinterface.init_tk(location)
                                        end
                                        if accept_token == 8 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TKwenum.init_tk(token_text, location)
+                                               return new TKwenum.init_tk(location)
                                        end
                                        if accept_token == 9 then
-                                               return new TKwspecial.init_tk(location)
+                                               return new TKwend.init_tk(location)
                                        end
                                        if accept_token == 10 then
-                                               return new TKwend.init_tk(location)
+                                               return new TKwmeth.init_tk(location)
                                        end
                                        if accept_token == 11 then
-                                               return new TKwmeth.init_tk(location)
+                                               return new TKwtype.init_tk(location)
                                        end
                                        if accept_token == 12 then
-                                               return new TKwtype.init_tk(location)
+                                               return new TKwinit.init_tk(location)
                                        end
                                        if accept_token == 13 then
-                                               return new TKwinit.init_tk(location)
+                                               return new TKwredef.init_tk(location)
                                        end
                                        if accept_token == 14 then
-                                               return new TKwredef.init_tk(location)
+                                               return new TKwis.init_tk(location)
                                        end
                                        if accept_token == 15 then
-                                               return new TKwis.init_tk(location)
+                                               return new TKwdo.init_tk(location)
                                        end
                                        if accept_token == 16 then
-                                               return new TKwdo.init_tk(location)
+                                               return new TKwreadable.init_tk(location)
                                        end
                                        if accept_token == 17 then
-                                               return new TKwreadable.init_tk(location)
+                                               return new TKwwritable.init_tk(location)
                                        end
                                        if accept_token == 18 then
-                                               return new TKwwritable.init_tk(location)
+                                               return new TKwvar.init_tk(location)
                                        end
                                        if accept_token == 19 then
-                                               return new TKwvar.init_tk(location)
+                                               return new TKwintern.init_tk(location)
                                        end
                                        if accept_token == 20 then
-                                               return new TKwintern.init_tk(location)
+                                               return new TKwextern.init_tk(location)
                                        end
                                        if accept_token == 21 then
-                                               return new TKwextern.init_tk(location)
+                                               return new TKwprotected.init_tk(location)
                                        end
                                        if accept_token == 22 then
-                                               return new TKwprotected.init_tk(location)
+                                               return new TKwprivate.init_tk(location)
                                        end
                                        if accept_token == 23 then
-                                               return new TKwprivate.init_tk(location)
+                                               return new TKwintrude.init_tk(location)
                                        end
                                        if accept_token == 24 then
-                                               return new TKwintrude.init_tk(location)
+                                               return new TKwif.init_tk(location)
                                        end
                                        if accept_token == 25 then
-                                               return new TKwif.init_tk(location)
+                                               return new TKwthen.init_tk(location)
                                        end
                                        if accept_token == 26 then
-                                               return new TKwthen.init_tk(location)
+                                               return new TKwelse.init_tk(location)
                                        end
                                        if accept_token == 27 then
-                                               return new TKwelse.init_tk(location)
+                                               return new TKwwhile.init_tk(location)
                                        end
                                        if accept_token == 28 then
-                                               return new TKwwhile.init_tk(location)
+                                               return new TKwloop.init_tk(location)
                                        end
                                        if accept_token == 29 then
-                                               return new TKwloop.init_tk(location)
+                                               return new TKwfor.init_tk(location)
                                        end
                                        if accept_token == 30 then
-                                               return new TKwfor.init_tk(location)
+                                               return new TKwin.init_tk(location)
                                        end
                                        if accept_token == 31 then
-                                               return new TKwin.init_tk(location)
+                                               return new TKwand.init_tk(location)
                                        end
                                        if accept_token == 32 then
-                                               return new TKwand.init_tk(location)
+                                               return new TKwor.init_tk(location)
                                        end
                                        if accept_token == 33 then
-                                               return new TKwor.init_tk(location)
+                                               return new TKwnot.init_tk(location)
                                        end
                                        if accept_token == 34 then
-                                               return new TKwnot.init_tk(location)
+                                               return new TKwreturn.init_tk(location)
                                        end
                                        if accept_token == 35 then
-                                               return new TKwreturn.init_tk(location)
+                                               return new TKwcontinue.init_tk(location)
                                        end
                                        if accept_token == 36 then
-                                               return new TKwcontinue.init_tk(location)
+                                               return new TKwbreak.init_tk(location)
                                        end
                                        if accept_token == 37 then
-                                               return new TKwbreak.init_tk(location)
+                                               return new TKwabort.init_tk(location)
                                        end
                                        if accept_token == 38 then
-                                               return new TKwabort.init_tk(location)
+                                               return new TKwassert.init_tk(location)
                                        end
                                        if accept_token == 39 then
-                                               return new TKwassert.init_tk(location)
+                                               return new TKwnew.init_tk(location)
                                        end
                                        if accept_token == 40 then
-                                               return new TKwnew.init_tk(location)
+                                               return new TKwisa.init_tk(location)
                                        end
                                        if accept_token == 41 then
-                                               return new TKwisa.init_tk(location)
+                                               return new TKwonce.init_tk(location)
                                        end
                                        if accept_token == 42 then
-                                               return new TKwonce.init_tk(location)
+                                               return new TKwsuper.init_tk(location)
                                        end
                                        if accept_token == 43 then
-                                               return new TKwsuper.init_tk(location)
+                                               return new TKwself.init_tk(location)
                                        end
                                        if accept_token == 44 then
-                                               return new TKwself.init_tk(location)
+                                               return new TKwtrue.init_tk(location)
                                        end
                                        if accept_token == 45 then
-                                               return new TKwtrue.init_tk(location)
+                                               return new TKwfalse.init_tk(location)
                                        end
                                        if accept_token == 46 then
-                                               return new TKwfalse.init_tk(location)
+                                               return new TKwnull.init_tk(location)
                                        end
                                        if accept_token == 47 then
-                                               return new TKwnull.init_tk(location)
+                                               return new TKwas.init_tk(location)
                                        end
                                        if accept_token == 48 then
-                                               return new TKwas.init_tk(location)
+                                               return new TKwnullable.init_tk(location)
                                        end
                                        if accept_token == 49 then
-                                               return new TKwnullable.init_tk(location)
+                                               return new TKwisset.init_tk(location)
                                        end
                                        if accept_token == 50 then
-                                               return new TKwisset.init_tk(location)
+                                               return new TKwlabel.init_tk(location)
                                        end
                                        if accept_token == 51 then
-                                               return new TKwlabel.init_tk(location)
+                                               return new TKwdebug.init_tk(location)
                                        end
                                        if accept_token == 52 then
                                                return new TOpar.init_tk(location)
@@ -1605,48 +1552,52 @@ class Lexer
                                                return new TBang.init_tk(location)
                                        end
                                        if accept_token == 80 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TClassid.init_tk(token_text, location)
+                                               return new TAt.init_tk(location)
                                        end
                                        if accept_token == 81 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TId.init_tk(token_text, location)
+                                               return new TClassid.init_tk(location)
                                        end
                                        if accept_token == 82 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TAttrid.init_tk(token_text, location)
+                                               return new TId.init_tk(location)
                                        end
                                        if accept_token == 83 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TNumber.init_tk(token_text, location)
+                                               return new TAttrid.init_tk(location)
                                        end
                                        if accept_token == 84 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TFloat.init_tk(token_text, location)
+                                               return new TNumber.init_tk(location)
                                        end
                                        if accept_token == 85 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TChar.init_tk(token_text, location)
+                                               return new TFloat.init_tk(location)
                                        end
                                        if accept_token == 86 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TString.init_tk(token_text, location)
+                                               return new TChar.init_tk(location)
                                        end
                                        if accept_token == 87 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TStartString.init_tk(token_text, location)
+                                               return new TString.init_tk(location)
                                        end
                                        if accept_token == 88 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TMidString.init_tk(token_text, location)
+                                               return new TStartString.init_tk(location)
                                        end
                                        if accept_token == 89 then
-                                               var token_text = text.substring(0, accept_length)
-                                               return new TEndString.init_tk(token_text, location)
+                                               return new TMidString.init_tk(location)
+                                       end
+                                       if accept_token == 90 then
+                                               return new TEndString.init_tk(location)
+                                       end
+                                       if accept_token == 91 then
+                                               return new TBadChar.init_tk(location)
+                                       end
+                                       if accept_token == 92 then
+                                               return new TBadString.init_tk(location)
+                                       end
+                                       if accept_token == 93 then
+                                               return new TExternCodeSegment.init_tk(location)
                                        end
                                else
-                                       var location = new Location(_filename, start_line + 1, start_line + 1, start_pos + 1, start_pos + 1)
-                                       if text.length > 0 then
+                                       _stream_pos = sp
+                                       var location = new Location(_file, start_line + 1, start_line + 1, start_pos + 1, start_pos + 1)
+                                       if sp > start_stream_pos then
+                                               var text = string.substring(start_stream_pos, sp-start_stream_pos)
                                                var token = new AError.init_error("Syntax error: unknown token {text}.", location)
                                                return token
                                        else
@@ -1657,45 +1608,5 @@ class Lexer
                        end
                end
        end
-
-       # Read the next character.
-       # The character is read from the stream of from the pushback buffer.
-       private fun get_char: Int
-       do
-               if _eof then
-                       return -1
-               end
-
-               var result: Int
-
-               var sp = _stream_pos
-               if sp >= 0 then
-                       var res = _stream_buf[_stream_pos]
-                       _stream_pos = sp - 1
-                       result = res.ascii
-               else
-                       result = _stream.read_char
-               end
-
-               if result == -1 then
-                       _eof = true
-               end
-
-               return result
-       end
-
-       # Unread some characters.
-       # Unread characters are stored in the pushback buffer.
-       private fun push_back(accept_length: Int)
-       do
-               var length = _text.length
-               var i = length - 1
-               while i >= accept_length do
-                       _eof = false
-                       _stream_pos = _stream_pos + 1
-                       _stream_buf[_stream_pos] = _text[i]
-                       i = i - 1
-               end
-       end
 end