X-Git-Url: http://nitlanguage.org diff --git a/src/parser/lexer.nit b/src/parser/lexer.nit index 257b305..5b830d1 100644 --- a/src/parser/lexer.nit +++ b/src/parser/lexer.nit @@ -3,9 +3,10 @@ package lexer intrude import parser_nodes +private import tables redef class Token - readable writable var _text: String + readable var _text: String fun parser_index: Int is abstract @@ -40,15 +41,15 @@ redef class TComment end end -redef class TKwpackage +redef class TKwmodule redef fun parser_index: Int do return 2 end - init init_tk(loc: Location) + init init_tk(text: String, loc: Location) do - _text = once "package" + _text = text _location = loc end end @@ -105,15 +106,15 @@ redef class TKwinterface end end -redef class TKwuniversal +redef class TKwenum redef fun parser_index: Int do return 7 end - init init_tk(loc: Location) + init init_tk(text: String, loc: Location) do - _text = once "universal" + _text = text _location = loc end end @@ -150,9 +151,9 @@ redef class TKwmeth return 10 end - init init_tk(text: String, loc: Location) + init init_tk(loc: Location) do - _text = text + _text = once "fun" _location = loc end end @@ -170,23 +171,10 @@ redef class TKwtype end end -redef class TKwattr - redef fun parser_index: Int - do - return 12 - end - - init init_tk(loc: Location) - do - _text = once "attr" - _location = loc - end -end - redef class TKwinit redef fun parser_index: Int do - return 13 + return 12 end init init_tk(loc: Location) @@ -199,7 +187,7 @@ end redef class TKwredef redef fun parser_index: Int do - return 14 + return 13 end init init_tk(loc: Location) @@ -212,7 +200,7 @@ end redef class TKwis redef fun parser_index: Int do - return 15 + return 14 end init init_tk(loc: Location) @@ -225,7 +213,7 @@ end redef class TKwdo redef fun parser_index: Int do - return 16 + return 15 end init init_tk(loc: Location) @@ -238,7 +226,7 @@ end redef class TKwreadable redef fun parser_index: Int do - return 17 + return 16 end init init_tk(loc: Location) @@ -251,7 +239,7 @@ end redef class TKwwritable redef fun parser_index: Int do - return 18 + return 17 end init init_tk(loc: Location) @@ -264,7 +252,7 @@ end redef class TKwvar redef fun parser_index: Int do - return 19 + return 18 end init init_tk(loc: Location) @@ -277,7 +265,7 @@ end redef class TKwintern redef fun parser_index: Int do - return 20 + return 19 end init init_tk(loc: Location) @@ -290,7 +278,7 @@ end redef class TKwextern redef fun parser_index: Int do - return 21 + return 20 end init init_tk(loc: Location) @@ -303,7 +291,7 @@ end redef class TKwprotected redef fun parser_index: Int do - return 22 + return 21 end init init_tk(loc: Location) @@ -316,7 +304,7 @@ end redef class TKwprivate redef fun parser_index: Int do - return 23 + return 22 end init init_tk(loc: Location) @@ -329,7 +317,7 @@ end redef class TKwintrude redef fun parser_index: Int do - return 24 + return 23 end init init_tk(loc: Location) @@ -342,7 +330,7 @@ end redef class TKwif redef fun parser_index: Int do - return 25 + return 24 end init init_tk(loc: Location) @@ -355,7 +343,7 @@ end redef class TKwthen redef fun parser_index: Int do - return 26 + return 25 end init init_tk(loc: Location) @@ -368,7 +356,7 @@ end redef class TKwelse redef fun parser_index: Int do - return 27 + return 26 end init init_tk(loc: Location) @@ -381,7 +369,7 @@ end redef class TKwwhile redef fun parser_index: Int do - return 28 + return 27 end init init_tk(loc: Location) @@ -391,6 +379,19 @@ redef class TKwwhile end end +redef class TKwloop + redef fun parser_index: Int + do + return 28 + end + + init init_tk(loc: Location) + do + _text = once "loop" + _location = loc + end +end + redef class TKwfor redef fun parser_index: Int do @@ -638,23 +639,10 @@ redef class TKwas end end -redef class TKwwith - redef fun parser_index: Int - do - return 48 - end - - init init_tk(loc: Location) - do - _text = once "with" - _location = loc - end -end - redef class TKwnullable redef fun parser_index: Int do - return 49 + return 48 end init init_tk(loc: Location) @@ -667,7 +655,7 @@ end redef class TKwisset redef fun parser_index: Int do - return 50 + return 49 end init init_tk(loc: Location) @@ -680,7 +668,7 @@ end redef class TKwlabel redef fun parser_index: Int do - return 51 + return 50 end init init_tk(loc: Location) @@ -693,7 +681,7 @@ end redef class TOpar redef fun parser_index: Int do - return 52 + return 51 end init init_tk(loc: Location) @@ -706,7 +694,7 @@ end redef class TCpar redef fun parser_index: Int do - return 53 + return 52 end init init_tk(loc: Location) @@ -719,7 +707,7 @@ end redef class TObra redef fun parser_index: Int do - return 54 + return 53 end init init_tk(loc: Location) @@ -732,7 +720,7 @@ end redef class TCbra redef fun parser_index: Int do - return 55 + return 54 end init init_tk(loc: Location) @@ -745,7 +733,7 @@ end redef class TComma redef fun parser_index: Int do - return 56 + return 55 end init init_tk(loc: Location) @@ -758,7 +746,7 @@ end redef class TColumn redef fun parser_index: Int do - return 57 + return 56 end init init_tk(loc: Location) @@ -771,7 +759,7 @@ end redef class TQuad redef fun parser_index: Int do - return 58 + return 57 end init init_tk(loc: Location) @@ -784,7 +772,7 @@ end redef class TAssign redef fun parser_index: Int do - return 59 + return 58 end init init_tk(loc: Location) @@ -797,7 +785,7 @@ end redef class TPluseq redef fun parser_index: Int do - return 60 + return 59 end init init_tk(loc: Location) @@ -810,7 +798,7 @@ end redef class TMinuseq redef fun parser_index: Int do - return 61 + return 60 end init init_tk(loc: Location) @@ -823,7 +811,7 @@ end redef class TDotdotdot redef fun parser_index: Int do - return 62 + return 61 end init init_tk(loc: Location) @@ -836,7 +824,7 @@ end redef class TDotdot redef fun parser_index: Int do - return 63 + return 62 end init init_tk(loc: Location) @@ -849,7 +837,7 @@ end redef class TDot redef fun parser_index: Int do - return 64 + return 63 end init init_tk(loc: Location) @@ -862,7 +850,7 @@ end redef class TPlus redef fun parser_index: Int do - return 65 + return 64 end init init_tk(loc: Location) @@ -875,7 +863,7 @@ end redef class TMinus redef fun parser_index: Int do - return 66 + return 65 end init init_tk(loc: Location) @@ -888,7 +876,7 @@ end redef class TStar redef fun parser_index: Int do - return 67 + return 66 end init init_tk(loc: Location) @@ -901,7 +889,7 @@ end redef class TSlash redef fun parser_index: Int do - return 68 + return 67 end init init_tk(loc: Location) @@ -914,7 +902,7 @@ end redef class TPercent redef fun parser_index: Int do - return 69 + return 68 end init init_tk(loc: Location) @@ -927,7 +915,7 @@ end redef class TEq redef fun parser_index: Int do - return 70 + return 69 end init init_tk(loc: Location) @@ -940,7 +928,7 @@ end redef class TNe redef fun parser_index: Int do - return 71 + return 70 end init init_tk(loc: Location) @@ -953,7 +941,7 @@ end redef class TLt redef fun parser_index: Int do - return 72 + return 71 end init init_tk(loc: Location) @@ -966,7 +954,7 @@ end redef class TLe redef fun parser_index: Int do - return 73 + return 72 end init init_tk(loc: Location) @@ -976,6 +964,19 @@ redef class TLe end end +redef class TLl + redef fun parser_index: Int + do + return 73 + end + + init init_tk(loc: Location) + do + _text = once "<<" + _location = loc + end +end + redef class TGt redef fun parser_index: Int do @@ -1002,7 +1003,7 @@ redef class TGe end end -redef class TStarship +redef class TGg redef fun parser_index: Int do return 76 @@ -1010,15 +1011,41 @@ redef class TStarship init init_tk(loc: Location) do + _text = once ">>" + _location = loc + end +end + +redef class TStarship + redef fun parser_index: Int + do + return 77 + end + + init init_tk(loc: Location) + do _text = once "<=>" _location = loc end end +redef class TBang + redef fun parser_index: Int + do + return 78 + end + + init init_tk(loc: Location) + do + _text = once "!" + _location = loc + end +end + redef class TClassid redef fun parser_index: Int do - return 77 + return 79 end init init_tk(text: String, loc: Location) @@ -1031,7 +1058,7 @@ end redef class TId redef fun parser_index: Int do - return 78 + return 80 end init init_tk(text: String, loc: Location) @@ -1044,7 +1071,7 @@ end redef class TAttrid redef fun parser_index: Int do - return 79 + return 81 end init init_tk(text: String, loc: Location) @@ -1057,7 +1084,7 @@ end redef class TNumber redef fun parser_index: Int do - return 80 + return 82 end init init_tk(text: String, loc: Location) @@ -1070,7 +1097,7 @@ end redef class TFloat redef fun parser_index: Int do - return 81 + return 83 end init init_tk(text: String, loc: Location) @@ -1083,7 +1110,7 @@ end redef class TChar redef fun parser_index: Int do - return 82 + return 84 end init init_tk(text: String, loc: Location) @@ -1096,7 +1123,7 @@ end redef class TString redef fun parser_index: Int do - return 83 + return 85 end init init_tk(text: String, loc: Location) @@ -1109,7 +1136,7 @@ end redef class TStartString redef fun parser_index: Int do - return 84 + return 86 end init init_tk(text: String, loc: Location) @@ -1122,7 +1149,7 @@ end redef class TMidString redef fun parser_index: Int do - return 85 + return 87 end init init_tk(text: String, loc: Location) @@ -1135,7 +1162,7 @@ end redef class TEndString redef fun parser_index: Int do - return 86 + return 88 end init init_tk(text: String, loc: Location) @@ -1149,7 +1176,7 @@ end redef class EOF redef fun parser_index: Int do - return 87 + return 89 end init(loc: Location) @@ -1160,7 +1187,7 @@ redef class EOF end redef class AError - readable writable var _message: String + readable var _message: String init init_error(message: String, loc: Location) do @@ -1173,23 +1200,18 @@ end # The lexer extract NIT tokens from an input stream. # It is better user with the Parser class Lexer + super TablesCapable # Last peeked token var _token: nullable Token # 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 + # The source file + readable var _file: SourceFile - # Pushback buffer to store unread character - var _stream_buf: Buffer - - # 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 @@ -1200,25 +1222,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 - build_goto_table - build_accept_table + _file = file end # Give the next token (but do not consume it) @@ -1238,7 +1248,7 @@ class Lexer result = get_token end _token = null - return result.as(not null) + return result end # Get a token, or null if it is discarded @@ -1246,8 +1256,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 @@ -1255,38 +1269,36 @@ class Lexer var accept_pos = -1 var accept_line = -1 - var goto_table = _goto_table[_state] - var accept = _accept_table[_state] - var text = _text - text.clear - - while true do - var c = get_char + loop + 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) - - var first_loop = true # aka until - while dfa_state < -1 or first_loop do + loop var old_state = dfa_state if dfa_state < -1 then old_state = -2 - dfa_state @@ -1294,766 +1306,337 @@ class Lexer dfa_state = -1 - var tmp0 = goto_table[old_state] var low = 0 - var high = tmp0.length - 1 + var high = lexer_goto(old_state, 0) - 1 if high >= 0 then - var tmp1 = tmp0.intern_items while low <= high do var middle = (low + high) / 2 - var tmp2 = tmp1[middle].intern_items + var offset = middle * 3 + 1 # +1 because length is at 0 - if c < tmp2[0] then + if c < lexer_goto(old_state, offset) then high = middle - 1 - else if c > tmp2[1] then + else if c > lexer_goto(old_state, offset+1) then low = middle + 1 else - dfa_state = tmp2[2] - low = high + 1 # aka break + dfa_state = lexer_goto(old_state, offset+2) + break end end end - first_loop = false # aka until + if dfa_state > -2 then break end _cr = cr _line = line _pos = pos - else - dfa_state = -1 end if dfa_state >= 0 then - if accept[dfa_state] != -1 then + var tok = lexer_accept(dfa_state) + if tok != -1 then accept_state = dfa_state - accept_token = accept[dfa_state] - accept_length = text.length + accept_token = tok + accept_length = sp - start_stream_pos accept_pos = _pos accept_line = _line end else if accept_state != -1 then + var location = new Location(_file, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) + _pos = accept_pos + _line = accept_line + _stream_pos = start_stream_pos + accept_length if accept_token == 0 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - push_back(accept_length) - _pos = accept_pos - _line = accept_line return null end if accept_token == 1 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TEol.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TEol.init_tk(token_text, location) end if accept_token == 2 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TComment.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TComment.init_tk(token_text, location) end if accept_token == 3 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwpackage.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TKwmodule.init_tk(token_text, location) end if accept_token == 4 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwimport.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwimport.init_tk(location) end if accept_token == 5 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwclass.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwclass.init_tk(location) end if accept_token == 6 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwabstract.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwabstract.init_tk(location) end if accept_token == 7 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwinterface.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwinterface.init_tk(location) end if accept_token == 8 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwuniversal.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TKwenum.init_tk(token_text, location) end if accept_token == 9 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwspecial.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwspecial.init_tk(location) end if accept_token == 10 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwend.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwend.init_tk(location) end if accept_token == 11 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TKwmeth.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwmeth.init_tk(location) end if accept_token == 12 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwtype.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwtype.init_tk(location) end if accept_token == 13 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwattr.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwinit.init_tk(location) end if accept_token == 14 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwinit.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwredef.init_tk(location) end if accept_token == 15 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwredef.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwis.init_tk(location) end if accept_token == 16 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwis.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwdo.init_tk(location) end if accept_token == 17 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwdo.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwreadable.init_tk(location) end if accept_token == 18 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwreadable.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwwritable.init_tk(location) end if accept_token == 19 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwwritable.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwvar.init_tk(location) end if accept_token == 20 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwvar.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwintern.init_tk(location) end if accept_token == 21 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwintern.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwextern.init_tk(location) end if accept_token == 22 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwextern.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwprotected.init_tk(location) end if accept_token == 23 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwprotected.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwprivate.init_tk(location) end if accept_token == 24 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwprivate.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwintrude.init_tk(location) end if accept_token == 25 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwintrude.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwif.init_tk(location) end if accept_token == 26 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwif.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwthen.init_tk(location) end if accept_token == 27 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwthen.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwelse.init_tk(location) end if accept_token == 28 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwelse.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwwhile.init_tk(location) end if accept_token == 29 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwwhile.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwloop.init_tk(location) end if accept_token == 30 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwfor.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwfor.init_tk(location) end if accept_token == 31 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwin.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwin.init_tk(location) end if accept_token == 32 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwand.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwand.init_tk(location) end if accept_token == 33 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwor.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwor.init_tk(location) end if accept_token == 34 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwnot.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwnot.init_tk(location) end if accept_token == 35 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwreturn.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwreturn.init_tk(location) end if accept_token == 36 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwcontinue.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwcontinue.init_tk(location) end if accept_token == 37 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwbreak.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwbreak.init_tk(location) end if accept_token == 38 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwabort.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwabort.init_tk(location) end if accept_token == 39 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwassert.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwassert.init_tk(location) end if accept_token == 40 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwnew.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwnew.init_tk(location) end if accept_token == 41 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwisa.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwisa.init_tk(location) end if accept_token == 42 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwonce.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwonce.init_tk(location) end if accept_token == 43 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwsuper.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwsuper.init_tk(location) end if accept_token == 44 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwself.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwself.init_tk(location) end if accept_token == 45 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwtrue.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwtrue.init_tk(location) end if accept_token == 46 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwfalse.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwfalse.init_tk(location) end if accept_token == 47 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwnull.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwnull.init_tk(location) end if accept_token == 48 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwas.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwas.init_tk(location) end if accept_token == 49 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwwith.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwnullable.init_tk(location) end if accept_token == 50 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwnullable.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwisset.init_tk(location) end if accept_token == 51 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwisset.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TKwlabel.init_tk(location) end if accept_token == 52 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TKwlabel.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TOpar.init_tk(location) end if accept_token == 53 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TOpar.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TCpar.init_tk(location) end if accept_token == 54 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TCpar.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TObra.init_tk(location) end if accept_token == 55 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TObra.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TCbra.init_tk(location) end if accept_token == 56 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TCbra.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TComma.init_tk(location) end if accept_token == 57 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TComma.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TColumn.init_tk(location) end if accept_token == 58 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TColumn.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TQuad.init_tk(location) end if accept_token == 59 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TQuad.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TAssign.init_tk(location) end if accept_token == 60 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TAssign.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TPluseq.init_tk(location) end if accept_token == 61 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TPluseq.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TMinuseq.init_tk(location) end if accept_token == 62 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TMinuseq.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TDotdotdot.init_tk(location) end if accept_token == 63 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TDotdotdot.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TDotdot.init_tk(location) end if accept_token == 64 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TDotdot.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TDot.init_tk(location) end if accept_token == 65 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TDot.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TPlus.init_tk(location) end if accept_token == 66 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TPlus.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TMinus.init_tk(location) end if accept_token == 67 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TMinus.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TStar.init_tk(location) end if accept_token == 68 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TStar.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TSlash.init_tk(location) end if accept_token == 69 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TSlash.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TPercent.init_tk(location) end if accept_token == 70 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TPercent.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TEq.init_tk(location) end if accept_token == 71 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TEq.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TNe.init_tk(location) end if accept_token == 72 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TNe.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TLt.init_tk(location) end if accept_token == 73 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TLt.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TLe.init_tk(location) end if accept_token == 74 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TLe.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TLl.init_tk(location) end if accept_token == 75 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TGt.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TGt.init_tk(location) end if accept_token == 76 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TGe.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TGe.init_tk(location) end if accept_token == 77 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token = new TStarship.init_tk(location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TGg.init_tk(location) end if accept_token == 78 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TClassid.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TStarship.init_tk(location) end if accept_token == 79 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TId.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + return new TBang.init_tk(location) end if accept_token == 80 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TAttrid.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TClassid.init_tk(token_text, location) end if accept_token == 81 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TNumber.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TId.init_tk(token_text, location) end if accept_token == 82 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TFloat.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TAttrid.init_tk(token_text, location) end if accept_token == 83 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TChar.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TNumber.init_tk(token_text, location) end if accept_token == 84 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TString.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TFloat.init_tk(token_text, location) end if accept_token == 85 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TStartString.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TChar.init_tk(token_text, location) end if accept_token == 86 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TMidString.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TString.init_tk(token_text, location) end if accept_token == 87 then - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - var token_text = text.substring(0, accept_length) - var token = new TEndString.init_tk(token_text, location) - push_back(accept_length) - _pos = accept_pos - _line = accept_line - return token + var token_text = string.substring(start_stream_pos, accept_length) + return new TStartString.init_tk(token_text, location) + end + if accept_token == 88 then + var token_text = string.substring(start_stream_pos, accept_length) + return new TMidString.init_tk(token_text, location) + end + if accept_token == 89 then + var token_text = string.substring(start_stream_pos, accept_length) + return new TEndString.init_tk(token_text, location) end else - var location = new Location(_filename, start_line + 1, accept_line + 1, start_pos + 1, accept_pos) - if text.length > 0 then - var token = new AError.init_error("Unknown token: {text}", location) + _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 var token = new EOF(location) @@ -2062,1297 +1645,6 @@ class Lexer end end end - return null - 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 - - var _goto_table: Array[Array[Array[Array[Int]]]] - private fun build_goto_table - do - _goto_table = once [ - [ - [ - [9, 9, 1], - [10, 10, 2], - [13, 13, 3], - [32, 32, 4], - [33, 33, 5], - [34, 34, 6], - [35, 35, 7], - [37, 37, 8], - [39, 39, 9], - [40, 40, 10], - [41, 41, 11], - [42, 42, 12], - [43, 43, 13], - [44, 44, 14], - [45, 45, 15], - [46, 46, 16], - [47, 47, 17], - [48, 57, 18], - [58, 58, 19], - [60, 60, 20], - [61, 61, 21], - [62, 62, 22], - [65, 90, 23], - [91, 91, 24], - [93, 93, 25], - [95, 95, 26], - [97, 97, 27], - [98, 98, 28], - [99, 99, 29], - [100, 100, 30], - [101, 101, 31], - [102, 102, 32], - [103, 104, 33], - [105, 105, 34], - [106, 107, 33], - [108, 108, 35], - [109, 109, 36], - [110, 110, 37], - [111, 111, 38], - [112, 112, 39], - [113, 113, 33], - [114, 114, 40], - [115, 115, 41], - [116, 116, 42], - [117, 117, 43], - [118, 118, 44], - [119, 119, 45], - [120, 122, 33], - [125, 125, 46] - ], - [ - [9, 9, 1], - [32, 32, 4] - ], - nil_array, - [ - [10, 10, 47] - ], - [ - [9, 32, -3] - ], - [ - [61, 61, 48] - ], - [ - [0, 9, 49], - [11, 12, 49], - [14, 33, 49], - [34, 34, 50], - [35, 91, 49], - [92, 92, 51], - [93, 122, 49], - [123, 123, 52], - [124, 255, 49] - ], - [ - [0, 9, 53], - [10, 10, 54], - [11, 12, 53], - [13, 13, 55], - [14, 255, 53] - ], - nil_array, - [ - [0, 9, 56], - [11, 12, 56], - [14, 38, 56], - [39, 39, 57], - [40, 255, 56] - ], - nil_array, - nil_array, - nil_array, - [ - [61, 61, 58] - ], - nil_array, - [ - [61, 61, 59] - ], - [ - [46, 46, 60], - [48, 57, 61] - ], - nil_array, - [ - [46, 46, 62], - [48, 57, 18] - ], - [ - [58, 58, 63] - ], - [ - [61, 61, 64] - ], - [ - [61, 61, 65] - ], - [ - [61, 61, 66] - ], - [ - [48, 57, 67], - [65, 90, 68], - [95, 95, 69], - [97, 122, 70] - ], - nil_array, - nil_array, - [ - [97, 122, 71] - ], - [ - [48, 57, 72], - [65, 90, 73], - [95, 95, 74], - [97, 97, 75], - [98, 98, 76], - [99, 109, 75], - [110, 110, 77], - [111, 114, 75], - [115, 115, 78], - [116, 116, 79], - [117, 122, 75] - ], - [ - [48, 95, -29], - [97, 113, 75], - [114, 114, 80], - [115, 122, 75] - ], - [ - [48, 95, -29], - [97, 107, 75], - [108, 108, 81], - [109, 110, 75], - [111, 111, 82], - [112, 122, 75] - ], - [ - [48, 95, -29], - [97, 110, 75], - [111, 111, 83], - [112, 122, 75] - ], - [ - [48, 107, -31], - [108, 108, 84], - [109, 109, 75], - [110, 110, 85], - [111, 119, 75], - [120, 120, 86], - [121, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 87], - [98, 110, 75], - [111, 111, 88], - [112, 116, 75], - [117, 117, 89], - [118, 122, 75] - ], - [ - [48, 95, -29], - [97, 122, 75] - ], - [ - [48, 95, -29], - [97, 101, 75], - [102, 102, 90], - [103, 108, 75], - [109, 109, 91], - [110, 110, 92], - [111, 114, 75], - [115, 115, 93], - [116, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 94], - [98, 122, 75] - ], - [ - [48, 95, -29], - [97, 100, 75], - [101, 101, 95], - [102, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 96], - [102, 110, 75], - [111, 111, 97], - [112, 116, 75], - [117, 117, 98], - [118, 122, 75] - ], - [ - [48, 95, -29], - [97, 109, 75], - [110, 110, 99], - [111, 113, 75], - [114, 114, 100], - [115, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 101], - [98, 113, 75], - [114, 114, 102], - [115, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 103], - [102, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 104], - [102, 111, 75], - [112, 112, 105], - [113, 116, 75], - [117, 117, 106], - [118, 122, 75] - ], - [ - [48, 95, -29], - [97, 103, 75], - [104, 104, 107], - [105, 113, 75], - [114, 114, 108], - [115, 120, 75], - [121, 121, 109], - [122, 122, 75] - ], - [ - [48, 109, -40], - [110, 110, 110], - [111, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 111], - [98, 122, 75] - ], - [ - [48, 103, -44], - [104, 104, 112], - [105, 105, 113], - [106, 113, 75], - [114, 114, 114], - [115, 122, 75] - ], - [ - [0, 9, 115], - [11, 12, 115], - [14, 33, 115], - [34, 34, 116], - [35, 91, 115], - [92, 92, 117], - [93, 122, 115], - [123, 123, 118], - [124, 255, 115] - ], - nil_array, - nil_array, - [ - [0, 255, -8] - ], - nil_array, - [ - [0, 9, 119], - [11, 12, 119], - [14, 255, 119] - ], - nil_array, - [ - [0, 255, -9] - ], - nil_array, - [ - [10, 10, 120] - ], - [ - [0, 255, -11] - ], - nil_array, - nil_array, - nil_array, - [ - [46, 46, 121] - ], - [ - [48, 57, 61] - ], - [ - [48, 57, 61] - ], - nil_array, - [ - [62, 62, 122] - ], - nil_array, - nil_array, - [ - [48, 122, -25] - ], - [ - [48, 122, -25] - ], - [ - [48, 122, -25] - ], - [ - [48, 122, -25] - ], - [ - [48, 57, 123], - [65, 90, 124], - [95, 95, 125], - [97, 122, 126] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 110, -32], - [111, 111, 127], - [112, 114, 75], - [115, 115, 128], - [116, 122, 75] - ], - [ - [48, 95, -29], - [97, 99, 75], - [100, 100, 129], - [101, 122, 75] - ], - [ - [48, 95, -29], - [97, 114, 75], - [115, 115, 130], - [116, 122, 75] - ], - [ - [48, 95, -29], - [97, 115, 75], - [116, 116, 131], - [117, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 132], - [102, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 133], - [98, 122, 75] - ], - [ - [48, 109, -40], - [110, 110, 134], - [111, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 114, -80], - [115, 115, 135], - [116, 122, 75] - ], - [ - [48, 99, -79], - [100, 100, 136], - [101, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 137], - [117, 122, 75] - ], - [ - [48, 107, -31], - [108, 108, 138], - [109, 122, 75] - ], - [ - [48, 113, -30], - [114, 114, 139], - [115, 122, 75] - ], - [ - [48, 109, -40], - [110, 110, 140], - [111, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 95, -29], - [97, 111, 75], - [112, 112, 141], - [113, 122, 75] - ], - [ - [48, 95, -29], - [97, 104, 75], - [105, 105, 142], - [106, 115, 75], - [116, 116, 143], - [117, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 144], - [98, 114, 75], - [115, 115, 145], - [116, 122, 75] - ], - [ - [48, 97, -29], - [98, 98, 146], - [99, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 147], - [117, 122, 75] - ], - [ - [48, 95, -29], - [97, 118, 75], - [119, 119, 148], - [120, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 149], - [117, 122, 75] - ], - [ - [48, 107, -31], - [108, 108, 150], - [109, 122, 75] - ], - [ - [48, 95, -29], - [97, 98, 75], - [99, 99, 151], - [100, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 98, -101], - [99, 99, 152], - [100, 122, 75] - ], - [ - [48, 104, -94], - [105, 105, 153], - [106, 110, 75], - [111, 111, 154], - [112, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 155], - [98, 99, 75], - [100, 100, 156], - [101, 115, 75], - [116, 116, 157], - [117, 122, 75] - ], - [ - [48, 107, -31], - [108, 108, 158], - [109, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 159], - [102, 122, 75] - ], - [ - [48, 111, -93], - [112, 112, 160], - [113, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 161], - [102, 122, 75] - ], - [ - [48, 95, -29], - [97, 116, 75], - [117, 117, 162], - [118, 122, 75] - ], - [ - [48, 111, -93], - [112, 112, 163], - [113, 122, 75] - ], - [ - [48, 104, -94], - [105, 105, 164], - [106, 122, 75] - ], - [ - [48, 113, -30], - [114, 114, 165], - [115, 122, 75] - ], - [ - [48, 104, -94], - [105, 105, 166], - [106, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 167], - [117, 122, 75] - ], - [ - [48, 104, -94], - [105, 105, 168], - [106, 122, 75] - ], - [ - [0, 255, -48] - ], - nil_array, - [ - [0, 9, 169], - [11, 12, 169], - [14, 255, 169] - ], - nil_array, - [ - [0, 255, -8] - ], - nil_array, - nil_array, - nil_array, - [ - [48, 122, -73] - ], - [ - [48, 122, -73] - ], - [ - [48, 122, -73] - ], - [ - [48, 122, -73] - ], - [ - [48, 113, -30], - [114, 114, 170], - [115, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 171], - [117, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 100, -38], - [101, 101, 172], - [102, 122, 75] - ], - [ - [48, 113, -30], - [114, 114, 173], - [115, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 174], - [98, 122, 75] - ], - [ - [48, 114, -80], - [115, 115, 175], - [116, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 176], - [117, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 177], - [102, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 100, -38], - [101, 101, 178], - [102, 122, 75] - ], - [ - [48, 114, -80], - [115, 115, 179], - [116, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 110, -32], - [111, 111, 180], - [112, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 181], - [117, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 182], - [102, 113, 75], - [114, 114, 183], - [115, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 100, -38], - [101, 101, 184], - [102, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 185], - [102, 122, 75] - ], - [ - [48, 103, -44], - [104, 104, 186], - [105, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 107, -31], - [108, 108, 187], - [109, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 188], - [102, 122, 75] - ], - [ - [48, 95, -29], - [97, 106, 75], - [107, 107, 189], - [108, 122, 75] - ], - [ - [48, 95, -29], - [97, 117, 75], - [118, 118, 190], - [119, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 191], - [117, 122, 75] - ], - [ - [48, 99, -79], - [100, 100, 192], - [101, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 193], - [102, 122, 75] - ], - [ - [48, 116, -110], - [117, 117, 194], - [118, 122, 75] - ], - [ - [48, 101, -36], - [102, 102, 195], - [103, 122, 75] - ], - [ - [48, 98, -101], - [99, 99, 196], - [100, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 197], - [102, 122, 75] - ], - [ - [48, 109, -40], - [110, 110, 198], - [111, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 199], - [102, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 200], - [102, 122, 75] - ], - [ - [48, 117, -155], - [118, 118, 201], - [119, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 107, -31], - [108, 108, 202], - [109, 122, 75] - ], - [ - [48, 103, -44], - [104, 104, 203], - [105, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 204], - [117, 122, 75] - ], - [ - [0, 255, -48] - ], - [ - [48, 115, -81], - [116, 116, 205], - [117, 122, 75] - ], - [ - [48, 113, -30], - [114, 114, 206], - [115, 122, 75] - ], - [ - [48, 113, -30], - [114, 114, 207], - [115, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 106, -154], - [107, 107, 208], - [108, 122, 75] - ], - [ - [48, 114, -80], - [115, 115, 209], - [116, 122, 75] - ], - [ - [48, 104, -94], - [105, 105, 210], - [106, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 113, -30], - [114, 114, 211], - [115, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 212], - [102, 122, 75] - ], - [ - [48, 113, -30], - [114, 114, 213], - [115, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 113, -30], - [114, 114, 214], - [115, 122, 75] - ], - [ - [48, 116, -110], - [117, 117, 215], - [118, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 216], - [117, 122, 75] - ], - [ - [48, 107, -31], - [108, 108, 217], - [109, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 95, -29], - [97, 97, 218], - [98, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 95, -29], - [97, 97, 219], - [98, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 220], - [98, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 221], - [102, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 222], - [98, 122, 75] - ], - [ - [48, 101, -36], - [102, 102, 223], - [103, 122, 75] - ], - [ - [48, 113, -30], - [114, 114, 224], - [115, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 104, -94], - [105, 105, 225], - [106, 122, 75] - ], - [ - [48, 113, -30], - [114, 114, 226], - [115, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 100, -38], - [101, 101, 227], - [102, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 228], - [102, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 95, -29], - [97, 97, 229], - [98, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 95, -29], - [97, 97, 230], - [98, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 231], - [117, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 109, -40], - [110, 110, 232], - [111, 122, 75] - ], - [ - [48, 109, -40], - [110, 110, 233], - [111, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 115, -81], - [116, 116, 234], - [117, 122, 75] - ], - [ - [48, 101, -36], - [102, 102, 235], - [103, 109, 75], - [110, 110, 236], - [111, 122, 75] - ], - [ - [48, 99, -79], - [100, 100, 237], - [101, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 97, -29], - [98, 98, 238], - [99, 122, 75] - ], - [ - [48, 95, -29], - [97, 102, 75], - [103, 103, 239], - [104, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 240], - [117, 122, 75] - ], - [ - [48, 98, -101], - [99, 99, 241], - [100, 122, 75] - ], - [ - [48, 97, -29], - [98, 98, 242], - [99, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 109, -40], - [110, 110, 243], - [111, 122, 75] - ], - [ - [48, 95, -29], - [97, 97, 244], - [98, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 113, -30], - [114, 114, 245], - [115, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 97, -29], - [98, 98, 246], - [99, 122, 75] - ], - [ - [48, 98, -101], - [99, 99, 247], - [100, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 116, -110], - [117, 117, 248], - [118, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 95, -29], - [97, 97, 249], - [98, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 100, -38], - [101, 101, 250], - [102, 122, 75] - ], - [ - [48, 107, -31], - [108, 108, 251], - [109, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 252], - [102, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 253], - [102, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 254], - [117, 122, 75] - ], - [ - [48, 107, -31], - [108, 108, 255], - [109, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 107, -31], - [108, 108, 256], - [109, 122, 75] - ], - [ - [48, 114, -80], - [115, 115, 257], - [116, 122, 75] - ], - [ - [48, 107, -31], - [108, 108, 258], - [109, 122, 75] - ], - [ - [48, 115, -81], - [116, 116, 259], - [117, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 260], - [102, 122, 75] - ], - [ - [48, 98, -101], - [99, 99, 261], - [100, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 100, -38], - [101, 101, 262], - [102, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 100, -38], - [101, 101, 263], - [102, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 264], - [102, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 95, -29], - [97, 97, 265], - [98, 122, 75] - ], - [ - [48, 100, -38], - [101, 101, 266], - [102, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 100, -38], - [101, 101, 267], - [102, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 99, -79], - [100, 100, 268], - [101, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 107, -31], - [108, 108, 269], - [109, 122, 75] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ], - [ - [48, 122, -35] - ] - ] - ] - end - - private fun nil_array: Array[Array[Int]] - do - return once new Array[Array[Int]] - end - - var _accept_table: Array[Array[Int]] - private fun build_accept_table do - _accept_table = once [ - [ - -1,0,1,1,0,-1,-1,-1,70,-1,53,54,68,66,57,67,65,69,81,58,73,60,75,78,55,56,-1,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,-1,1,72,-1,84,-1,85,-1,2,2,-1,83,61,62,64,82,-1,59,74,71,76,78,78,78,78,80,79,79,79,79,79,79,48,79,79,79,79,17,79,79,79,79,79,79,26,79,31,16,79,79,79,79,79,79,33,79,79,79,79,79,79,79,79,79,79,79,79,79,79,-1,87,-1,86,-1,2,63,77,80,80,80,80,79,79,32,79,79,79,79,79,79,10,79,79,30,11,79,79,79,41,79,79,79,40,34,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,20,79,79,79,-1,79,79,79,13,79,79,79,28,79,79,79,14,79,79,79,79,11,47,42,79,79,79,79,79,79,44,79,79,27,45,12,79,79,49,79,38,79,79,37,5,79,79,46,79,79,79,51,52,79,79,79,79,79,15,79,79,43,79,29,79,79,39,79,22,4,79,21,79,79,79,79,79,79,35,79,79,79,79,79,79,25,79,3,24,79,79,9,79,79,6,36,79,50,79,18,79,19,7,23,8 - - ] - ] end end