# Lexer and its tokens.
# This file was generated by SableCC (http://www.sablecc.org/).
-package lexer
+module lexer
intrude import parser_nodes
private import tables
return res
end
+ redef fun text=(text)
+ do
+ _text = text
+ end
+
fun parser_index: Int is abstract
end
end
end
-redef class TKwmodule
+redef class TKwpackage
redef fun parser_index: Int
do
return 2
end
end
-redef class TKwimport
+redef class TKwmodule
redef fun parser_index: Int
do
return 3
end
end
-redef class TKwclass
+redef class TKwimport
redef fun parser_index: Int
do
return 4
end
end
-redef class TKwabstract
+redef class TKwclass
redef fun parser_index: Int
do
return 5
end
end
-redef class TKwinterface
+redef class TKwabstract
redef fun parser_index: Int
do
return 6
end
end
-redef class TKwenum
+redef class TKwinterface
redef fun parser_index: Int
do
return 7
end
end
-redef class TKwspecial
+redef class TKwenum
redef fun parser_index: Int
do
return 8
end
end
-redef class TKwreturn
+redef class TKwimplies
redef fun parser_index: Int
do
return 34
end
end
-redef class TKwcontinue
+redef class TKwreturn
redef fun parser_index: Int
do
return 35
end
end
-redef class TKwbreak
+redef class TKwcontinue
redef fun parser_index: Int
do
return 36
end
end
-redef class TKwabort
+redef class TKwbreak
redef fun parser_index: Int
do
return 37
end
end
-redef class TKwassert
+redef class TKwabort
redef fun parser_index: Int
do
return 38
end
end
-redef class TKwnew
+redef class TKwassert
redef fun parser_index: Int
do
return 39
end
end
-redef class TKwisa
+redef class TKwnew
redef fun parser_index: Int
do
return 40
end
end
-redef class TKwonce
+redef class TKwisa
redef fun parser_index: Int
do
return 41
end
end
-redef class TKwsuper
+redef class TKwonce
redef fun parser_index: Int
do
return 42
end
end
-redef class TKwself
+redef class TKwsuper
redef fun parser_index: Int
do
return 43
end
end
-redef class TKwtrue
+redef class TKwself
redef fun parser_index: Int
do
return 44
end
end
-redef class TKwfalse
+redef class TKwtrue
redef fun parser_index: Int
do
return 45
end
end
-redef class TKwnull
+redef class TKwfalse
redef fun parser_index: Int
do
return 46
end
end
-redef class TKwas
+redef class TKwnull
redef fun parser_index: Int
do
return 47
end
end
-redef class TKwnullable
+redef class TKwas
redef fun parser_index: Int
do
return 48
end
end
-redef class TKwisset
+redef class TKwnullable
redef fun parser_index: Int
do
return 49
end
end
-redef class TKwlabel
+redef class TKwisset
redef fun parser_index: Int
do
return 50
end
end
-redef class TKwdebug
+redef class TKwlabel
redef fun parser_index: Int
do
return 51
end
end
-redef class TOpar
+redef class TKwdebug
redef fun parser_index: Int
do
return 52
end
end
-redef class TCpar
+redef class TOpar
redef fun parser_index: Int
do
return 53
end
end
-redef class TObra
+redef class TCpar
redef fun parser_index: Int
do
return 54
end
end
-redef class TCbra
+redef class TObra
redef fun parser_index: Int
do
return 55
end
end
-redef class TComma
+redef class TCbra
redef fun parser_index: Int
do
return 56
end
end
-redef class TColumn
+redef class TComma
redef fun parser_index: Int
do
return 57
end
end
-redef class TQuad
+redef class TColumn
redef fun parser_index: Int
do
return 58
end
end
-redef class TAssign
+redef class TQuad
redef fun parser_index: Int
do
return 59
end
end
-redef class TPluseq
+redef class TAssign
redef fun parser_index: Int
do
return 60
end
end
-redef class TMinuseq
+redef class TPluseq
redef fun parser_index: Int
do
return 61
end
end
-redef class TDotdotdot
+redef class TMinuseq
redef fun parser_index: Int
do
return 62
end
end
-redef class TDotdot
+redef class TDotdotdot
redef fun parser_index: Int
do
return 63
end
end
-redef class TDot
+redef class TDotdot
redef fun parser_index: Int
do
return 64
end
end
-redef class TPlus
+redef class TDot
redef fun parser_index: Int
do
return 65
end
end
-redef class TMinus
+redef class TPlus
redef fun parser_index: Int
do
return 66
end
end
-redef class TStar
+redef class TMinus
redef fun parser_index: Int
do
return 67
end
end
-redef class TSlash
+redef class TStar
redef fun parser_index: Int
do
return 68
end
end
-redef class TPercent
+redef class TSlash
redef fun parser_index: Int
do
return 69
end
end
-redef class TEq
+redef class TPercent
redef fun parser_index: Int
do
return 70
end
end
-redef class TNe
+redef class TEq
redef fun parser_index: Int
do
return 71
end
end
-redef class TLt
+redef class TNe
redef fun parser_index: Int
do
return 72
end
end
-redef class TLe
+redef class TLt
redef fun parser_index: Int
do
return 73
end
end
-redef class TLl
+redef class TLe
redef fun parser_index: Int
do
return 74
end
end
-redef class TGt
+redef class TLl
redef fun parser_index: Int
do
return 75
end
end
-redef class TGe
+redef class TGt
redef fun parser_index: Int
do
return 76
end
end
-redef class TGg
+redef class TGe
redef fun parser_index: Int
do
return 77
end
end
-redef class TStarship
+redef class TGg
redef fun parser_index: Int
do
return 78
end
end
-redef class TBang
+redef class TStarship
redef fun parser_index: Int
do
return 79
end
end
-redef class TClassid
+redef class TBang
redef fun parser_index: Int
do
return 80
end
end
-redef class TId
+redef class TAt
redef fun parser_index: Int
do
return 81
end
end
-redef class TAttrid
+redef class TClassid
redef fun parser_index: Int
do
return 82
end
end
-redef class TNumber
+redef class TId
redef fun parser_index: Int
do
return 83
end
end
-redef class TFloat
+redef class TAttrid
redef fun parser_index: Int
do
return 84
end
end
-redef class TChar
+redef class TNumber
redef fun parser_index: Int
do
return 85
end
end
-redef class TString
+redef class TFloat
redef fun parser_index: Int
do
return 86
end
end
-redef class TStartString
+redef class TString
redef fun parser_index: Int
do
return 87
end
end
-redef class TMidString
+redef class TStartString
redef fun parser_index: Int
do
return 88
end
end
-redef class TEndString
+redef class TMidString
redef fun parser_index: Int
do
return 89
end
end
-redef class TBadChar
+redef class TEndString
redef fun parser_index: Int
do
return 90
end
end
-redef class TBadString
+redef class TChar
redef fun parser_index: Int
do
return 91
end
end
+redef class TBadString
+ redef fun parser_index: Int
+ do
+ return 92
+ end
+
+ init init_tk(loc: Location)
+ do
+ _location = loc
+ end
+end
+
+redef class TBadChar
+ redef fun parser_index: Int
+ do
+ return 93
+ end
+
+ init init_tk(loc: Location)
+ do
+ _location = loc
+ end
+end
+
+redef class TExternCodeSegment
+ redef fun parser_index: Int
+ do
+ return 94
+ end
+
+ init init_tk(loc: Location)
+ do
+ _location = loc
+ end
+end
+
redef class EOF
redef fun parser_index: Int
do
- return 92
+ return 95
end
- init(loc: Location)
+ init init_tk(loc: Location)
do
_text = ""
_location = loc
init init_error(message: String, loc: Location)
do
- init(loc)
+ init_tk(loc)
_message = message
end
end
+redef class ALexerError
+ readable var _string: String
+
+ init init_lexer_error(message: String, loc: Location, string: String)
+ do
+ init_error(message, loc)
+ _string = string
+ end
+end
+
+redef class AParserError
+ readable var _token: Token
+
+ init init_parser_error(message: String, loc: Location, token: Token)
+ do
+ init_error(message, loc)
+ _token = token
+ end
+end
# The lexer extract NIT tokens from an input stream.
# It is better user with the Parser
_file = file
end
+ # The last peeked token to chain them
+ private var last_token: nullable Token = null
+
# Give the next token (but do not consume it)
fun peek: Token
do
- while _token == null do
- _token = get_token
+ var t = _token
+ if t != null then return t
+
+ t = get_token
+ while t == null do t = get_token
+
+ var l = last_token
+ if l != null then
+ l.next_token = t
+ t.prev_token = l
end
- return _token.as(not null)
+
+ last_token = t
+ _token = t
+ return t
end
# Give and consume the next token
fun next: Token
do
- var result = _token
- while result == null do
- result = get_token
- end
+ var result = peek
_token = null
return result
end
- # Get a token, or null if it is discarded
- private fun get_token: nullable Token
+ # Primitive method to return a token, or return null if it is discarded
+ # Is used to implement `peek` and `next`
+ protected fun get_token: nullable Token
do
var dfa_state = 0
if sp >= string_len then
dfa_state = -1
else
- var c = string[sp].ascii
+ var c = string.chars[sp].ascii
sp += 1
var cr = _cr
return new TComment.init_tk(location)
end
if accept_token == 3 then
- return new TKwmodule.init_tk(location)
+ return new TKwpackage.init_tk(location)
end
if accept_token == 4 then
- return new TKwimport.init_tk(location)
+ return new TKwmodule.init_tk(location)
end
if accept_token == 5 then
- return new TKwclass.init_tk(location)
+ return new TKwimport.init_tk(location)
end
if accept_token == 6 then
- return new TKwabstract.init_tk(location)
+ return new TKwclass.init_tk(location)
end
if accept_token == 7 then
- return new TKwinterface.init_tk(location)
+ return new TKwabstract.init_tk(location)
end
if accept_token == 8 then
- return new TKwenum.init_tk(location)
+ return new TKwinterface.init_tk(location)
end
if accept_token == 9 then
- return new TKwspecial.init_tk(location)
+ return new TKwenum.init_tk(location)
end
if accept_token == 10 then
return new TKwend.init_tk(location)
return new TKwnot.init_tk(location)
end
if accept_token == 35 then
- return new TKwreturn.init_tk(location)
+ return new TKwimplies.init_tk(location)
end
if accept_token == 36 then
- return new TKwcontinue.init_tk(location)
+ return new TKwreturn.init_tk(location)
end
if accept_token == 37 then
- return new TKwbreak.init_tk(location)
+ return new TKwcontinue.init_tk(location)
end
if accept_token == 38 then
- return new TKwabort.init_tk(location)
+ return new TKwbreak.init_tk(location)
end
if accept_token == 39 then
- return new TKwassert.init_tk(location)
+ return new TKwabort.init_tk(location)
end
if accept_token == 40 then
- return new TKwnew.init_tk(location)
+ return new TKwassert.init_tk(location)
end
if accept_token == 41 then
- return new TKwisa.init_tk(location)
+ return new TKwnew.init_tk(location)
end
if accept_token == 42 then
- return new TKwonce.init_tk(location)
+ return new TKwisa.init_tk(location)
end
if accept_token == 43 then
- return new TKwsuper.init_tk(location)
+ return new TKwonce.init_tk(location)
end
if accept_token == 44 then
- return new TKwself.init_tk(location)
+ return new TKwsuper.init_tk(location)
end
if accept_token == 45 then
- return new TKwtrue.init_tk(location)
+ return new TKwself.init_tk(location)
end
if accept_token == 46 then
- return new TKwfalse.init_tk(location)
+ return new TKwtrue.init_tk(location)
end
if accept_token == 47 then
- return new TKwnull.init_tk(location)
+ return new TKwfalse.init_tk(location)
end
if accept_token == 48 then
- return new TKwas.init_tk(location)
+ return new TKwnull.init_tk(location)
end
if accept_token == 49 then
- return new TKwnullable.init_tk(location)
+ return new TKwas.init_tk(location)
end
if accept_token == 50 then
- return new TKwisset.init_tk(location)
+ return new TKwnullable.init_tk(location)
end
if accept_token == 51 then
- return new TKwlabel.init_tk(location)
+ return new TKwisset.init_tk(location)
end
if accept_token == 52 then
- return new TKwdebug.init_tk(location)
+ return new TKwlabel.init_tk(location)
end
if accept_token == 53 then
- return new TOpar.init_tk(location)
+ return new TKwdebug.init_tk(location)
end
if accept_token == 54 then
- return new TCpar.init_tk(location)
+ return new TOpar.init_tk(location)
end
if accept_token == 55 then
- return new TObra.init_tk(location)
+ return new TCpar.init_tk(location)
end
if accept_token == 56 then
- return new TCbra.init_tk(location)
+ return new TObra.init_tk(location)
end
if accept_token == 57 then
- return new TComma.init_tk(location)
+ return new TCbra.init_tk(location)
end
if accept_token == 58 then
- return new TColumn.init_tk(location)
+ return new TComma.init_tk(location)
end
if accept_token == 59 then
- return new TQuad.init_tk(location)
+ return new TColumn.init_tk(location)
end
if accept_token == 60 then
- return new TAssign.init_tk(location)
+ return new TQuad.init_tk(location)
end
if accept_token == 61 then
- return new TPluseq.init_tk(location)
+ return new TAssign.init_tk(location)
end
if accept_token == 62 then
- return new TMinuseq.init_tk(location)
+ return new TPluseq.init_tk(location)
end
if accept_token == 63 then
- return new TDotdotdot.init_tk(location)
+ return new TMinuseq.init_tk(location)
end
if accept_token == 64 then
- return new TDotdot.init_tk(location)
+ return new TDotdotdot.init_tk(location)
end
if accept_token == 65 then
- return new TDot.init_tk(location)
+ return new TDotdot.init_tk(location)
end
if accept_token == 66 then
- return new TPlus.init_tk(location)
+ return new TDot.init_tk(location)
end
if accept_token == 67 then
- return new TMinus.init_tk(location)
+ return new TPlus.init_tk(location)
end
if accept_token == 68 then
- return new TStar.init_tk(location)
+ return new TMinus.init_tk(location)
end
if accept_token == 69 then
- return new TSlash.init_tk(location)
+ return new TStar.init_tk(location)
end
if accept_token == 70 then
- return new TPercent.init_tk(location)
+ return new TSlash.init_tk(location)
end
if accept_token == 71 then
- return new TEq.init_tk(location)
+ return new TPercent.init_tk(location)
end
if accept_token == 72 then
- return new TNe.init_tk(location)
+ return new TEq.init_tk(location)
end
if accept_token == 73 then
- return new TLt.init_tk(location)
+ return new TNe.init_tk(location)
end
if accept_token == 74 then
- return new TLe.init_tk(location)
+ return new TLt.init_tk(location)
end
if accept_token == 75 then
- return new TLl.init_tk(location)
+ return new TLe.init_tk(location)
end
if accept_token == 76 then
- return new TGt.init_tk(location)
+ return new TLl.init_tk(location)
end
if accept_token == 77 then
- return new TGe.init_tk(location)
+ return new TGt.init_tk(location)
end
if accept_token == 78 then
- return new TGg.init_tk(location)
+ return new TGe.init_tk(location)
end
if accept_token == 79 then
- return new TStarship.init_tk(location)
+ return new TGg.init_tk(location)
end
if accept_token == 80 then
- return new TBang.init_tk(location)
+ return new TStarship.init_tk(location)
end
if accept_token == 81 then
- return new TClassid.init_tk(location)
+ return new TBang.init_tk(location)
end
if accept_token == 82 then
- return new TId.init_tk(location)
+ return new TAt.init_tk(location)
end
if accept_token == 83 then
- return new TAttrid.init_tk(location)
+ return new TClassid.init_tk(location)
end
if accept_token == 84 then
- return new TNumber.init_tk(location)
+ return new TId.init_tk(location)
end
if accept_token == 85 then
- return new TFloat.init_tk(location)
+ return new TAttrid.init_tk(location)
end
if accept_token == 86 then
- return new TChar.init_tk(location)
+ return new TNumber.init_tk(location)
end
if accept_token == 87 then
- return new TString.init_tk(location)
+ return new TFloat.init_tk(location)
end
if accept_token == 88 then
- return new TStartString.init_tk(location)
+ return new TString.init_tk(location)
end
if accept_token == 89 then
- return new TMidString.init_tk(location)
+ return new TStartString.init_tk(location)
end
if accept_token == 90 then
- return new TEndString.init_tk(location)
+ return new TMidString.init_tk(location)
end
if accept_token == 91 then
- return new TBadChar.init_tk(location)
+ return new TEndString.init_tk(location)
end
if accept_token == 92 then
+ return new TChar.init_tk(location)
+ end
+ if accept_token == 93 then
return new TBadString.init_tk(location)
end
+ if accept_token == 94 then
+ return new TBadChar.init_tk(location)
+ end
+ if accept_token == 95 then
+ return new TExternCodeSegment.init_tk(location)
+ end
else
_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)
+ var token = new ALexerError.init_lexer_error("Syntax error: unknown token {text}.", location, text)
return token
else
- var token = new EOF(location)
+ var token = new EOF.init_tk(location)
return token
end
end