1 # Lexer and its tokens.
2 # This file was generated by SableCC (http://www.sablecc.org/).
5 intrude import parser_nodes
9 var _text
: nullable String
14 if res
!= null then return res
20 fun parser_index
: Int is abstract
24 redef fun parser_index
: Int
29 init init_tk
(loc
: Location)
36 redef fun parser_index
: Int
41 init init_tk
(loc
: Location)
48 redef fun parser_index
: Int
53 init init_tk
(loc
: Location)
60 redef fun parser_index
: Int
65 init init_tk
(loc
: Location)
72 redef fun parser_index
: Int
77 init init_tk
(loc
: Location)
83 redef class TKwabstract
84 redef fun parser_index
: Int
89 init init_tk
(loc
: Location)
95 redef class TKwinterface
96 redef fun parser_index
: Int
101 init init_tk
(loc
: Location)
108 redef fun parser_index
: Int
113 init init_tk
(loc
: Location)
120 redef fun parser_index
: Int
125 init init_tk
(loc
: Location)
132 redef fun parser_index
: Int
137 init init_tk
(loc
: Location)
144 redef fun parser_index
: Int
149 init init_tk
(loc
: Location)
156 redef fun parser_index
: Int
161 init init_tk
(loc
: Location)
168 redef fun parser_index
: Int
173 init init_tk
(loc
: Location)
180 redef fun parser_index
: Int
185 init init_tk
(loc
: Location)
192 redef fun parser_index
: Int
197 init init_tk
(loc
: Location)
203 redef class TKwreadable
204 redef fun parser_index
: Int
209 init init_tk
(loc
: Location)
215 redef class TKwwritable
216 redef fun parser_index
: Int
221 init init_tk
(loc
: Location)
228 redef fun parser_index
: Int
233 init init_tk
(loc
: Location)
239 redef class TKwintern
240 redef fun parser_index
: Int
245 init init_tk
(loc
: Location)
251 redef class TKwextern
252 redef fun parser_index
: Int
257 init init_tk
(loc
: Location)
263 redef class TKwprotected
264 redef fun parser_index
: Int
269 init init_tk
(loc
: Location)
275 redef class TKwprivate
276 redef fun parser_index
: Int
281 init init_tk
(loc
: Location)
287 redef class TKwintrude
288 redef fun parser_index
: Int
293 init init_tk
(loc
: Location)
300 redef fun parser_index
: Int
305 init init_tk
(loc
: Location)
312 redef fun parser_index
: Int
317 init init_tk
(loc
: Location)
324 redef fun parser_index
: Int
329 init init_tk
(loc
: Location)
336 redef fun parser_index
: Int
341 init init_tk
(loc
: Location)
348 redef fun parser_index
: Int
353 init init_tk
(loc
: Location)
360 redef fun parser_index
: Int
365 init init_tk
(loc
: Location)
372 redef fun parser_index
: Int
377 init init_tk
(loc
: Location)
384 redef fun parser_index
: Int
389 init init_tk
(loc
: Location)
396 redef fun parser_index
: Int
401 init init_tk
(loc
: Location)
408 redef fun parser_index
: Int
413 init init_tk
(loc
: Location)
419 redef class TKwreturn
420 redef fun parser_index
: Int
425 init init_tk
(loc
: Location)
431 redef class TKwcontinue
432 redef fun parser_index
: Int
437 init init_tk
(loc
: Location)
444 redef fun parser_index
: Int
449 init init_tk
(loc
: Location)
456 redef fun parser_index
: Int
461 init init_tk
(loc
: Location)
467 redef class TKwassert
468 redef fun parser_index
: Int
473 init init_tk
(loc
: Location)
480 redef fun parser_index
: Int
485 init init_tk
(loc
: Location)
492 redef fun parser_index
: Int
497 init init_tk
(loc
: Location)
504 redef fun parser_index
: Int
509 init init_tk
(loc
: Location)
516 redef fun parser_index
: Int
521 init init_tk
(loc
: Location)
528 redef fun parser_index
: Int
533 init init_tk
(loc
: Location)
540 redef fun parser_index
: Int
545 init init_tk
(loc
: Location)
552 redef fun parser_index
: Int
557 init init_tk
(loc
: Location)
564 redef fun parser_index
: Int
569 init init_tk
(loc
: Location)
576 redef fun parser_index
: Int
581 init init_tk
(loc
: Location)
587 redef class TKwnullable
588 redef fun parser_index
: Int
593 init init_tk
(loc
: Location)
600 redef fun parser_index
: Int
605 init init_tk
(loc
: Location)
612 redef fun parser_index
: Int
617 init init_tk
(loc
: Location)
624 redef fun parser_index
: Int
629 init init_tk
(loc
: Location)
636 redef fun parser_index
: Int
641 init init_tk
(loc
: Location)
648 redef fun parser_index
: Int
653 init init_tk
(loc
: Location)
660 redef fun parser_index
: Int
665 init init_tk
(loc
: Location)
672 redef fun parser_index
: Int
677 init init_tk
(loc
: Location)
684 redef fun parser_index
: Int
689 init init_tk
(loc
: Location)
696 redef fun parser_index
: Int
701 init init_tk
(loc
: Location)
708 redef fun parser_index
: Int
713 init init_tk
(loc
: Location)
720 redef fun parser_index
: Int
725 init init_tk
(loc
: Location)
732 redef fun parser_index
: Int
737 init init_tk
(loc
: Location)
744 redef fun parser_index
: Int
749 init init_tk
(loc
: Location)
755 redef class TDotdotdot
756 redef fun parser_index
: Int
761 init init_tk
(loc
: Location)
768 redef fun parser_index
: Int
773 init init_tk
(loc
: Location)
780 redef fun parser_index
: Int
785 init init_tk
(loc
: Location)
792 redef fun parser_index
: Int
797 init init_tk
(loc
: Location)
804 redef fun parser_index
: Int
809 init init_tk
(loc
: Location)
816 redef fun parser_index
: Int
821 init init_tk
(loc
: Location)
828 redef fun parser_index
: Int
833 init init_tk
(loc
: Location)
840 redef fun parser_index
: Int
845 init init_tk
(loc
: Location)
852 redef fun parser_index
: Int
857 init init_tk
(loc
: Location)
864 redef fun parser_index
: Int
869 init init_tk
(loc
: Location)
876 redef fun parser_index
: Int
881 init init_tk
(loc
: Location)
888 redef fun parser_index
: Int
893 init init_tk
(loc
: Location)
900 redef fun parser_index
: Int
905 init init_tk
(loc
: Location)
912 redef fun parser_index
: Int
917 init init_tk
(loc
: Location)
924 redef fun parser_index
: Int
929 init init_tk
(loc
: Location)
936 redef fun parser_index
: Int
941 init init_tk
(loc
: Location)
947 redef class TStarship
948 redef fun parser_index
: Int
953 init init_tk
(loc
: Location)
960 redef fun parser_index
: Int
965 init init_tk
(loc
: Location)
972 redef fun parser_index
: Int
977 init init_tk
(loc
: Location)
984 redef fun parser_index
: Int
989 init init_tk
(loc
: Location)
996 redef fun parser_index
: Int
1001 init init_tk
(loc
: Location)
1008 redef fun parser_index
: Int
1013 init init_tk
(loc
: Location)
1020 redef fun parser_index
: Int
1025 init init_tk
(loc
: Location)
1032 redef fun parser_index
: Int
1037 init init_tk
(loc
: Location)
1044 redef fun parser_index
: Int
1049 init init_tk
(loc
: Location)
1055 redef class TStartString
1056 redef fun parser_index
: Int
1061 init init_tk
(loc
: Location)
1067 redef class TMidString
1068 redef fun parser_index
: Int
1073 init init_tk
(loc
: Location)
1079 redef class TEndString
1080 redef fun parser_index
: Int
1085 init init_tk
(loc
: Location)
1091 redef class TBadChar
1092 redef fun parser_index
: Int
1097 init init_tk
(loc
: Location)
1103 redef class TBadString
1104 redef fun parser_index
: Int
1109 init init_tk
(loc
: Location)
1115 redef class TExternCodeSegment
1116 redef fun parser_index
: Int
1121 init init_tk
(loc
: Location)
1129 redef fun parser_index
: Int
1134 init init_tk
(loc
: Location)
1142 readable var _message
: String
1144 init init_error
(message
: String, loc
: Location)
1151 redef class ALexerError
1152 readable var _string
: String
1154 init init_lexer_error
(message
: String, loc
: Location, string
: String)
1156 init_error
(message
, loc
)
1161 redef class AParserError
1162 readable var _token
: Token
1164 init init_parser_error
(message
: String, loc
: Location, token
: Token)
1166 init_error
(message
, loc
)
1171 # The lexer extract NIT tokens from an input stream.
1172 # It is better user with the Parser
1176 var _token
: nullable Token
1178 # Lexer current state
1182 readable var _file
: SourceFile
1184 # Current character in the stream
1185 var _stream_pos
: Int = 0
1187 # Current line number in the input stream
1190 # Current column in the input stream
1193 # Was the last character a cariage-return?
1194 var _cr
: Bool = false
1196 # Constante state values
1197 private fun state_initial
: Int do return 0 end
1199 # Create a new lexer for a stream (and a name)
1200 init(file
: SourceFile)
1205 # Give the next token (but do not consume it)
1208 while _token
== null do
1211 return _token
.as(not null)
1214 # Give and consume the next token
1218 while result
== null do
1225 # Get a token, or null if it is discarded
1226 private fun get_token
: nullable Token
1230 var sp
= _stream_pos
1231 var start_stream_pos
= sp
1232 var start_pos
= _pos
1233 var start_line
= _line
1234 var string
= _file
.string
1235 var string_len
= string
.length
1237 var accept_state
= -1
1238 var accept_token
= -1
1239 var accept_length
= -1
1241 var accept_line
= -1
1244 if sp
>= string_len
then
1247 var c
= string
[sp
].ascii
1256 _file
.line_starts
[line
] = sp
1260 _file
.line_starts
[line
] = sp
1262 else if c
== 13 then
1266 _file
.line_starts
[line
] = sp
1273 var old_state
= dfa_state
1274 if dfa_state
< -1 then
1275 old_state
= -2 - dfa_state
1281 var high
= lexer_goto
(old_state
, 0) - 1
1284 while low
<= high
do
1285 var middle
= (low
+ high
) / 2
1286 var offset
= middle
* 3 + 1 # +1 because length is at 0
1288 if c
< lexer_goto
(old_state
, offset
) then
1290 else if c
> lexer_goto
(old_state
, offset
+1) then
1293 dfa_state
= lexer_goto
(old_state
, offset
+2)
1298 if dfa_state
> -2 then break
1306 if dfa_state
>= 0 then
1307 var tok
= lexer_accept
(dfa_state
)
1309 accept_state
= dfa_state
1311 accept_length
= sp
- start_stream_pos
1316 if accept_state
!= -1 then
1317 var location
= new Location(_file
, start_line
+ 1, accept_line
+ 1, start_pos
+ 1, accept_pos
)
1320 _stream_pos
= start_stream_pos
+ accept_length
1321 if accept_token
== 0 then
1324 if accept_token
== 1 then
1325 return new TEol.init_tk
(location
)
1327 if accept_token
== 2 then
1328 return new TComment.init_tk
(location
)
1330 if accept_token
== 3 then
1331 return new TKwmodule.init_tk
(location
)
1333 if accept_token
== 4 then
1334 return new TKwimport.init_tk
(location
)
1336 if accept_token
== 5 then
1337 return new TKwclass.init_tk
(location
)
1339 if accept_token
== 6 then
1340 return new TKwabstract.init_tk
(location
)
1342 if accept_token
== 7 then
1343 return new TKwinterface.init_tk
(location
)
1345 if accept_token
== 8 then
1346 return new TKwenum.init_tk
(location
)
1348 if accept_token
== 9 then
1349 return new TKwend.init_tk
(location
)
1351 if accept_token
== 10 then
1352 return new TKwmeth.init_tk
(location
)
1354 if accept_token
== 11 then
1355 return new TKwtype.init_tk
(location
)
1357 if accept_token
== 12 then
1358 return new TKwinit.init_tk
(location
)
1360 if accept_token
== 13 then
1361 return new TKwredef.init_tk
(location
)
1363 if accept_token
== 14 then
1364 return new TKwis.init_tk
(location
)
1366 if accept_token
== 15 then
1367 return new TKwdo.init_tk
(location
)
1369 if accept_token
== 16 then
1370 return new TKwreadable.init_tk
(location
)
1372 if accept_token
== 17 then
1373 return new TKwwritable.init_tk
(location
)
1375 if accept_token
== 18 then
1376 return new TKwvar.init_tk
(location
)
1378 if accept_token
== 19 then
1379 return new TKwintern.init_tk
(location
)
1381 if accept_token
== 20 then
1382 return new TKwextern.init_tk
(location
)
1384 if accept_token
== 21 then
1385 return new TKwprotected.init_tk
(location
)
1387 if accept_token
== 22 then
1388 return new TKwprivate.init_tk
(location
)
1390 if accept_token
== 23 then
1391 return new TKwintrude.init_tk
(location
)
1393 if accept_token
== 24 then
1394 return new TKwif.init_tk
(location
)
1396 if accept_token
== 25 then
1397 return new TKwthen.init_tk
(location
)
1399 if accept_token
== 26 then
1400 return new TKwelse.init_tk
(location
)
1402 if accept_token
== 27 then
1403 return new TKwwhile.init_tk
(location
)
1405 if accept_token
== 28 then
1406 return new TKwloop.init_tk
(location
)
1408 if accept_token
== 29 then
1409 return new TKwfor.init_tk
(location
)
1411 if accept_token
== 30 then
1412 return new TKwin.init_tk
(location
)
1414 if accept_token
== 31 then
1415 return new TKwand.init_tk
(location
)
1417 if accept_token
== 32 then
1418 return new TKwor.init_tk
(location
)
1420 if accept_token
== 33 then
1421 return new TKwnot.init_tk
(location
)
1423 if accept_token
== 34 then
1424 return new TKwreturn.init_tk
(location
)
1426 if accept_token
== 35 then
1427 return new TKwcontinue.init_tk
(location
)
1429 if accept_token
== 36 then
1430 return new TKwbreak.init_tk
(location
)
1432 if accept_token
== 37 then
1433 return new TKwabort.init_tk
(location
)
1435 if accept_token
== 38 then
1436 return new TKwassert.init_tk
(location
)
1438 if accept_token
== 39 then
1439 return new TKwnew.init_tk
(location
)
1441 if accept_token
== 40 then
1442 return new TKwisa.init_tk
(location
)
1444 if accept_token
== 41 then
1445 return new TKwonce.init_tk
(location
)
1447 if accept_token
== 42 then
1448 return new TKwsuper.init_tk
(location
)
1450 if accept_token
== 43 then
1451 return new TKwself.init_tk
(location
)
1453 if accept_token
== 44 then
1454 return new TKwtrue.init_tk
(location
)
1456 if accept_token
== 45 then
1457 return new TKwfalse.init_tk
(location
)
1459 if accept_token
== 46 then
1460 return new TKwnull.init_tk
(location
)
1462 if accept_token
== 47 then
1463 return new TKwas.init_tk
(location
)
1465 if accept_token
== 48 then
1466 return new TKwnullable.init_tk
(location
)
1468 if accept_token
== 49 then
1469 return new TKwisset.init_tk
(location
)
1471 if accept_token
== 50 then
1472 return new TKwlabel.init_tk
(location
)
1474 if accept_token
== 51 then
1475 return new TKwdebug.init_tk
(location
)
1477 if accept_token
== 52 then
1478 return new TOpar.init_tk
(location
)
1480 if accept_token
== 53 then
1481 return new TCpar.init_tk
(location
)
1483 if accept_token
== 54 then
1484 return new TObra.init_tk
(location
)
1486 if accept_token
== 55 then
1487 return new TCbra.init_tk
(location
)
1489 if accept_token
== 56 then
1490 return new TComma.init_tk
(location
)
1492 if accept_token
== 57 then
1493 return new TColumn.init_tk
(location
)
1495 if accept_token
== 58 then
1496 return new TQuad.init_tk
(location
)
1498 if accept_token
== 59 then
1499 return new TAssign.init_tk
(location
)
1501 if accept_token
== 60 then
1502 return new TPluseq.init_tk
(location
)
1504 if accept_token
== 61 then
1505 return new TMinuseq.init_tk
(location
)
1507 if accept_token
== 62 then
1508 return new TDotdotdot.init_tk
(location
)
1510 if accept_token
== 63 then
1511 return new TDotdot.init_tk
(location
)
1513 if accept_token
== 64 then
1514 return new TDot.init_tk
(location
)
1516 if accept_token
== 65 then
1517 return new TPlus.init_tk
(location
)
1519 if accept_token
== 66 then
1520 return new TMinus.init_tk
(location
)
1522 if accept_token
== 67 then
1523 return new TStar.init_tk
(location
)
1525 if accept_token
== 68 then
1526 return new TSlash.init_tk
(location
)
1528 if accept_token
== 69 then
1529 return new TPercent.init_tk
(location
)
1531 if accept_token
== 70 then
1532 return new TEq.init_tk
(location
)
1534 if accept_token
== 71 then
1535 return new TNe.init_tk
(location
)
1537 if accept_token
== 72 then
1538 return new TLt.init_tk
(location
)
1540 if accept_token
== 73 then
1541 return new TLe.init_tk
(location
)
1543 if accept_token
== 74 then
1544 return new TLl.init_tk
(location
)
1546 if accept_token
== 75 then
1547 return new TGt.init_tk
(location
)
1549 if accept_token
== 76 then
1550 return new TGe.init_tk
(location
)
1552 if accept_token
== 77 then
1553 return new TGg.init_tk
(location
)
1555 if accept_token
== 78 then
1556 return new TStarship.init_tk
(location
)
1558 if accept_token
== 79 then
1559 return new TBang.init_tk
(location
)
1561 if accept_token
== 80 then
1562 return new TClassid.init_tk
(location
)
1564 if accept_token
== 81 then
1565 return new TId.init_tk
(location
)
1567 if accept_token
== 82 then
1568 return new TAttrid.init_tk
(location
)
1570 if accept_token
== 83 then
1571 return new TNumber.init_tk
(location
)
1573 if accept_token
== 84 then
1574 return new TFloat.init_tk
(location
)
1576 if accept_token
== 85 then
1577 return new TChar.init_tk
(location
)
1579 if accept_token
== 86 then
1580 return new TString.init_tk
(location
)
1582 if accept_token
== 87 then
1583 return new TStartString.init_tk
(location
)
1585 if accept_token
== 88 then
1586 return new TMidString.init_tk
(location
)
1588 if accept_token
== 89 then
1589 return new TEndString.init_tk
(location
)
1591 if accept_token
== 90 then
1592 return new TBadChar.init_tk
(location
)
1594 if accept_token
== 91 then
1595 return new TBadString.init_tk
(location
)
1597 if accept_token
== 92 then
1598 return new TExternCodeSegment.init_tk
(location
)
1602 var location
= new Location(_file
, start_line
+ 1, start_line
+ 1, start_pos
+ 1, start_pos
+ 1)
1603 if sp
> start_stream_pos
then
1604 var text
= string
.substring
(start_stream_pos
, sp-start_stream_pos
)
1605 var token
= new ALexerError.init_lexer_error
("Syntax error: unknown token {text}.", location
, text
)
1608 var token
= new EOF.init_tk
(location
)