parser: detect bad string and char literals
authorJean Privat <jean@pryen.org>
Fri, 17 Feb 2012 17:19:40 +0000 (12:19 -0500)
committerJean Privat <jean@pryen.org>
Fri, 17 Feb 2012 19:13:03 +0000 (14:13 -0500)
Signed-off-by: Jean Privat <jean@pryen.org>

17 files changed:
src/parser/lexer.nit
src/parser/nit.sablecc3xx
src/parser/parser_abs.nit
src/parser/parser_nodes.nit
src/parser/tables_nit.c
tests/error_parser_oneline_bad_char.nit [new file with mode: 0644]
tests/error_parser_oneline_bad_char_empty.nit [new file with mode: 0644]
tests/error_parser_oneline_bad_char_full.nit [new file with mode: 0644]
tests/error_parser_oneline_bad_char_noeol.nit [new file with mode: 0644]
tests/error_parser_oneline_bad_string.nit [new file with mode: 0644]
tests/error_parser_oneline_bad_string_noeol.nit [new file with mode: 0644]
tests/sav/error_parser_oneline_bad_char.sav [new file with mode: 0644]
tests/sav/error_parser_oneline_bad_char_empty.sav [new file with mode: 0644]
tests/sav/error_parser_oneline_bad_char_full.sav [new file with mode: 0644]
tests/sav/error_parser_oneline_bad_char_noeol.sav [new file with mode: 0644]
tests/sav/error_parser_oneline_bad_string.sav [new file with mode: 0644]
tests/sav/error_parser_oneline_bad_string_noeol.sav [new file with mode: 0644]

index 3f2b3dc..8e6319a 100644 (file)
@@ -1168,11 +1168,37 @@ redef class TEndString
     end
 end
 
+redef class TBadChar
+    redef fun parser_index: Int
+    do
+       return 89
+    end
+
+    init init_tk(text: String, loc: Location)
+    do
+        _text = text
+               _location = loc
+    end
+end
+
+redef class TBadString
+    redef fun parser_index: Int
+    do
+       return 90
+    end
+
+    init init_tk(text: String, loc: Location)
+    do
+        _text = text
+               _location = loc
+    end
+end
+
 
 redef class EOF
     redef fun parser_index: Int
     do
-       return 89
+       return 91
     end
 
     init(loc: Location)
@@ -1627,6 +1653,14 @@ class Lexer
                                                var token_text = string.substring(start_stream_pos, accept_length)
                                                return new TEndString.init_tk(token_text, location)
                                        end
+                                       if accept_token == 90 then
+                                               var token_text = string.substring(start_stream_pos, accept_length)
+                                               return new TBadChar.init_tk(token_text, location)
+                                       end
+                                       if accept_token == 91 then
+                                               var token_text = string.substring(start_stream_pos, accept_length)
+                                               return new TBadString.init_tk(token_text, location)
+                                       end
                                else
                                        _stream_pos = sp
                                        var location = new Location(_file, start_line + 1, start_line + 1, start_pos + 1, start_pos + 1)
index df04efc..af31414 100644 (file)
@@ -142,11 +142,13 @@ attrid = '_' lowercase letter*;
 
 number = digit+;
 float = digit* '.' digit+;
-char = ''' [any - ''']* ''';
+char = (''' [[any - '''] - '\'] ''') | (''' '\' any ''');
 string = '"' str_body '"';
 start_string = '"' str_body '{';
 mid_string = '}' str_body '{';
 end_string = '}' str_body '"';
+bad_char = ''' '\'? any;
+bad_string = ('"'|'}') str_body;
 
 
 /*****************************************************************************/
index 8edfe5e..2c9c685 100644 (file)
@@ -290,6 +290,12 @@ end
 class TEndString
        super Token
 end
+class TBadChar
+       super Token
+end
+class TBadString
+       super Token
+end
 class EOF
        super Token
 private init noinit do end
index 6a3582d..547fb82 100644 (file)
@@ -350,6 +350,20 @@ end
 class TEndString
        super Token
 end
+class TBadString
+       super Token
+       redef fun to_s
+       do
+               do return "malformed string {text}"
+       end
+end
+class TBadChar
+       super Token
+       redef fun to_s
+       do
+               do return "malformed character {text}"
+       end
+end
 class EOF
        super Token
 private init noinit do end
index a551c7f..a329856 100644 (file)
@@ -92,233 +92,235 @@ static const int lexer_goto_row8[] = {
        14, 255, 53
 };
 static const int lexer_goto_row10[] = {
-       5,
+       7,
        0, 9, 56,
        11, 12, 56,
        14, 38, 56,
        39, 39, 57,
-       40, 255, 56
+       40, 91, 56,
+       92, 92, 58,
+       93, 255, 56
 };
 static const int lexer_goto_row14[] = {
        1,
-       61, 61, 58
+       61, 61, 59
 };
 static const int lexer_goto_row16[] = {
        1,
-       61, 61, 59
+       61, 61, 60
 };
 static const int lexer_goto_row17[] = {
        2,
-       46, 46, 60,
-       48, 57, 61
+       46, 46, 61,
+       48, 57, 62
 };
 static const int lexer_goto_row19[] = {
        2,
-       46, 46, 62,
+       46, 46, 63,
        48, 57, 18
 };
 static const int lexer_goto_row20[] = {
        1,
-       58, 58, 63
+       58, 58, 64
 };
 static const int lexer_goto_row21[] = {
        2,
-       60, 60, 64,
-       61, 61, 65
+       60, 60, 65,
+       61, 61, 66
 };
 static const int lexer_goto_row22[] = {
        1,
-       61, 61, 66
+       61, 61, 67
 };
 static const int lexer_goto_row23[] = {
        2,
-       61, 61, 67,
-       62, 62, 68
+       61, 61, 68,
+       62, 62, 69
 };
 static const int lexer_goto_row24[] = {
        4,
-       48, 57, 69,
-       65, 90, 70,
-       95, 95, 71,
-       97, 122, 72
+       48, 57, 70,
+       65, 90, 71,
+       95, 95, 72,
+       97, 122, 73
 };
 static const int lexer_goto_row27[] = {
        1,
-       97, 122, 73
+       97, 122, 74
 };
 static const int lexer_goto_row28[] = {
        10,
-       48, 57, 74,
-       65, 90, 75,
-       95, 95, 76,
-       97, 97, 77,
-       98, 98, 78,
-       99, 109, 77,
-       110, 110, 79,
-       111, 114, 77,
-       115, 115, 80,
-       116, 122, 77
+       48, 57, 75,
+       65, 90, 76,
+       95, 95, 77,
+       97, 97, 78,
+       98, 98, 79,
+       99, 109, 78,
+       110, 110, 80,
+       111, 114, 78,
+       115, 115, 81,
+       116, 122, 78
 };
 static const int lexer_goto_row29[] = {
        4,
        48, 95, -29,
-       97, 113, 77,
-       114, 114, 81,
-       115, 122, 77
+       97, 113, 78,
+       114, 114, 82,
+       115, 122, 78
 };
 static const int lexer_goto_row30[] = {
        6,
        48, 95, -29,
-       97, 107, 77,
-       108, 108, 82,
-       109, 110, 77,
-       111, 111, 83,
-       112, 122, 77
+       97, 107, 78,
+       108, 108, 83,
+       109, 110, 78,
+       111, 111, 84,
+       112, 122, 78
 };
 static const int lexer_goto_row31[] = {
        4,
        48, 95, -29,
-       97, 110, 77,
-       111, 111, 84,
-       112, 122, 77
+       97, 110, 78,
+       111, 111, 85,
+       112, 122, 78
 };
 static const int lexer_goto_row32[] = {
        7,
        48, 107, -31,
-       108, 108, 85,
-       109, 109, 77,
-       110, 110, 86,
-       111, 119, 77,
-       120, 120, 87,
-       121, 122, 77
+       108, 108, 86,
+       109, 109, 78,
+       110, 110, 87,
+       111, 119, 78,
+       120, 120, 88,
+       121, 122, 78
 };
 static const int lexer_goto_row33[] = {
        7,
        48, 95, -29,
-       97, 97, 88,
-       98, 110, 77,
-       111, 111, 89,
-       112, 116, 77,
-       117, 117, 90,
-       118, 122, 77
+       97, 97, 89,
+       98, 110, 78,
+       111, 111, 90,
+       112, 116, 78,
+       117, 117, 91,
+       118, 122, 78
 };
 static const int lexer_goto_row34[] = {
        2,
        48, 95, -29,
-       97, 122, 77
+       97, 122, 78
 };
 static const int lexer_goto_row35[] = {
        9,
        48, 95, -29,
-       97, 101, 77,
-       102, 102, 91,
-       103, 108, 77,
-       109, 109, 92,
-       110, 110, 93,
-       111, 114, 77,
-       115, 115, 94,
-       116, 122, 77
+       97, 101, 78,
+       102, 102, 92,
+       103, 108, 78,
+       109, 109, 93,
+       110, 110, 94,
+       111, 114, 78,
+       115, 115, 95,
+       116, 122, 78
 };
 static const int lexer_goto_row36[] = {
        5,
        48, 95, -29,
-       97, 97, 95,
-       98, 110, 77,
-       111, 111, 96,
-       112, 122, 77
+       97, 97, 96,
+       98, 110, 78,
+       111, 111, 97,
+       112, 122, 78
 };
 static const int lexer_goto_row37[] = {
        3,
        48, 110, -32,
-       111, 111, 97,
-       112, 122, 77
+       111, 111, 98,
+       112, 122, 78
 };
 static const int lexer_goto_row38[] = {
        8,
        48, 95, -29,
-       97, 100, 77,
-       101, 101, 98,
-       102, 110, 77,
-       111, 111, 99,
-       112, 116, 77,
-       117, 117, 100,
-       118, 122, 77
+       97, 100, 78,
+       101, 101, 99,
+       102, 110, 78,
+       111, 111, 100,
+       112, 116, 78,
+       117, 117, 101,
+       118, 122, 78
 };
 static const int lexer_goto_row39[] = {
        6,
        48, 95, -29,
-       97, 109, 77,
-       110, 110, 101,
-       111, 113, 77,
-       114, 114, 102,
-       115, 122, 77
+       97, 109, 78,
+       110, 110, 102,
+       111, 113, 78,
+       114, 114, 103,
+       115, 122, 78
 };
 static const int lexer_goto_row40[] = {
        5,
        48, 95, -29,
-       97, 97, 103,
-       98, 113, 77,
-       114, 114, 104,
-       115, 122, 77
+       97, 97, 104,
+       98, 113, 78,
+       114, 114, 105,
+       115, 122, 78
 };
 static const int lexer_goto_row41[] = {
        3,
        48, 100, -39,
-       101, 101, 105,
-       102, 122, 77
+       101, 101, 106,
+       102, 122, 78
 };
 static const int lexer_goto_row42[] = {
        7,
        48, 100, -39,
-       101, 101, 106,
-       102, 111, 77,
-       112, 112, 107,
-       113, 116, 77,
-       117, 117, 108,
-       118, 122, 77
+       101, 101, 107,
+       102, 111, 78,
+       112, 112, 108,
+       113, 116, 78,
+       117, 117, 109,
+       118, 122, 78
 };
 static const int lexer_goto_row43[] = {
        8,
        48, 95, -29,
-       97, 103, 77,
-       104, 104, 109,
-       105, 113, 77,
-       114, 114, 110,
-       115, 120, 77,
-       121, 121, 111,
-       122, 122, 77
+       97, 103, 78,
+       104, 104, 110,
+       105, 113, 78,
+       114, 114, 111,
+       115, 120, 78,
+       121, 121, 112,
+       122, 122, 78
 };
 static const int lexer_goto_row44[] = {
        3,
        48, 109, -40,
-       110, 110, 112,
-       111, 122, 77
+       110, 110, 113,
+       111, 122, 78
 };
 static const int lexer_goto_row45[] = {
        3,
        48, 95, -29,
-       97, 97, 113,
-       98, 122, 77
+       97, 97, 114,
+       98, 122, 78
 };
 static const int lexer_goto_row46[] = {
        5,
        48, 103, -44,
-       104, 104, 114,
-       105, 113, 77,
-       114, 114, 115,
-       115, 122, 77
+       104, 104, 115,
+       105, 113, 78,
+       114, 114, 116,
+       115, 122, 78
 };
 static const int lexer_goto_row47[] = {
        9,
-       0, 9, 116,
-       11, 12, 116,
-       14, 33, 116,
-       34, 34, 117,
-       35, 91, 116,
-       92, 92, 118,
-       93, 122, 116,
-       123, 123, 119,
-       124, 255, 116
+       0, 9, 117,
+       11, 12, 117,
+       14, 33, 117,
+       34, 34, 118,
+       35, 91, 117,
+       92, 92, 119,
+       93, 122, 117,
+       123, 123, 120,
+       124, 255, 117
 };
 static const int lexer_goto_row50[] = {
        1,
@@ -326,9 +328,9 @@ static const int lexer_goto_row50[] = {
 };
 static const int lexer_goto_row52[] = {
        3,
-       0, 9, 120,
-       11, 12, 120,
-       14, 255, 120
+       0, 9, 121,
+       11, 12, 121,
+       14, 255, 121
 };
 static const int lexer_goto_row54[] = {
        1,
@@ -336,31 +338,33 @@ static const int lexer_goto_row54[] = {
 };
 static const int lexer_goto_row56[] = {
        1,
-       10, 10, 121
+       10, 10, 122
 };
 static const int lexer_goto_row57[] = {
        1,
-       0, 255, -11
+       39, 39, 123
 };
-static const int lexer_goto_row61[] = {
-       1,
-       46, 46, 122
+static const int lexer_goto_row59[] = {
+       3,
+       0, 9, 124,
+       11, 12, 124,
+       14, 255, 124
 };
 static const int lexer_goto_row62[] = {
        1,
-       48, 57, 61
+       46, 46, 125
 };
 static const int lexer_goto_row63[] = {
        1,
-       48, 57, 61
+       48, 57, 62
 };
-static const int lexer_goto_row66[] = {
+static const int lexer_goto_row64[] = {
        1,
-       62, 62, 123
+       48, 57, 62
 };
-static const int lexer_goto_row70[] = {
+static const int lexer_goto_row67[] = {
        1,
-       48, 122, -25
+       62, 62, 126
 };
 static const int lexer_goto_row71[] = {
        1,
@@ -375,15 +379,15 @@ static const int lexer_goto_row73[] = {
        48, 122, -25
 };
 static const int lexer_goto_row74[] = {
-       4,
-       48, 57, 124,
-       65, 90, 125,
-       95, 95, 126,
-       97, 122, 127
+       1,
+       48, 122, -25
 };
 static const int lexer_goto_row75[] = {
-       1,
-       48, 122, -35
+       4,
+       48, 57, 127,
+       65, 90, 128,
+       95, 95, 129,
+       97, 122, 130
 };
 static const int lexer_goto_row76[] = {
        1,
@@ -398,1064 +402,1072 @@ static const int lexer_goto_row78[] = {
        48, 122, -35
 };
 static const int lexer_goto_row79[] = {
+       1,
+       48, 122, -35
+};
+static const int lexer_goto_row80[] = {
        5,
        48, 110, -32,
-       111, 111, 128,
-       112, 114, 77,
-       115, 115, 129,
-       116, 122, 77
+       111, 111, 131,
+       112, 114, 78,
+       115, 115, 132,
+       116, 122, 78
 };
-static const int lexer_goto_row80[] = {
+static const int lexer_goto_row81[] = {
        4,
        48, 95, -29,
-       97, 99, 77,
-       100, 100, 130,
-       101, 122, 77
+       97, 99, 78,
+       100, 100, 133,
+       101, 122, 78
 };
-static const int lexer_goto_row81[] = {
+static const int lexer_goto_row82[] = {
        4,
        48, 95, -29,
-       97, 114, 77,
-       115, 115, 131,
-       116, 122, 77
+       97, 114, 78,
+       115, 115, 134,
+       116, 122, 78
 };
-static const int lexer_goto_row82[] = {
+static const int lexer_goto_row83[] = {
        3,
        48, 100, -39,
-       101, 101, 132,
-       102, 122, 77
+       101, 101, 135,
+       102, 122, 78
 };
-static const int lexer_goto_row83[] = {
+static const int lexer_goto_row84[] = {
        3,
        48, 95, -29,
-       97, 97, 133,
-       98, 122, 77
+       97, 97, 136,
+       98, 122, 78
 };
-static const int lexer_goto_row84[] = {
+static const int lexer_goto_row85[] = {
        3,
        48, 109, -40,
-       110, 110, 134,
-       111, 122, 77
+       110, 110, 137,
+       111, 122, 78
 };
-static const int lexer_goto_row85[] = {
+static const int lexer_goto_row86[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row86[] = {
+static const int lexer_goto_row87[] = {
        3,
-       48, 114, -82,
-       115, 115, 135,
-       116, 122, 77
+       48, 114, -83,
+       115, 115, 138,
+       116, 122, 78
 };
-static const int lexer_goto_row87[] = {
+static const int lexer_goto_row88[] = {
        5,
-       48, 99, -81,
-       100, 100, 136,
-       101, 116, 77,
-       117, 117, 137,
-       118, 122, 77
+       48, 99, -82,
+       100, 100, 139,
+       101, 116, 78,
+       117, 117, 140,
+       118, 122, 78
 };
-static const int lexer_goto_row88[] = {
+static const int lexer_goto_row89[] = {
        4,
        48, 95, -29,
-       97, 115, 77,
-       116, 116, 138,
-       117, 122, 77
+       97, 115, 78,
+       116, 116, 141,
+       117, 122, 78
 };
-static const int lexer_goto_row89[] = {
+static const int lexer_goto_row90[] = {
        3,
        48, 107, -31,
-       108, 108, 139,
-       109, 122, 77
+       108, 108, 142,
+       109, 122, 78
 };
-static const int lexer_goto_row90[] = {
+static const int lexer_goto_row91[] = {
        3,
        48, 113, -30,
-       114, 114, 140,
-       115, 122, 77
+       114, 114, 143,
+       115, 122, 78
 };
-static const int lexer_goto_row91[] = {
+static const int lexer_goto_row92[] = {
        3,
        48, 109, -40,
-       110, 110, 141,
-       111, 122, 77
+       110, 110, 144,
+       111, 122, 78
 };
-static const int lexer_goto_row92[] = {
+static const int lexer_goto_row93[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row93[] = {
+static const int lexer_goto_row94[] = {
        4,
        48, 95, -29,
-       97, 111, 77,
-       112, 112, 142,
-       113, 122, 77
+       97, 111, 78,
+       112, 112, 145,
+       113, 122, 78
 };
-static const int lexer_goto_row94[] = {
+static const int lexer_goto_row95[] = {
        6,
        48, 95, -29,
-       97, 104, 77,
-       105, 105, 143,
-       106, 115, 77,
-       116, 116, 144,
-       117, 122, 77
+       97, 104, 78,
+       105, 105, 146,
+       106, 115, 78,
+       116, 116, 147,
+       117, 122, 78
 };
-static const int lexer_goto_row95[] = {
+static const int lexer_goto_row96[] = {
        5,
        48, 95, -29,
-       97, 97, 145,
-       98, 114, 77,
-       115, 115, 146,
-       116, 122, 77
+       97, 97, 148,
+       98, 114, 78,
+       115, 115, 149,
+       116, 122, 78
 };
-static const int lexer_goto_row96[] = {
+static const int lexer_goto_row97[] = {
        3,
        48, 97, -29,
-       98, 98, 147,
-       99, 122, 77
+       98, 98, 150,
+       99, 122, 78
 };
-static const int lexer_goto_row97[] = {
+static const int lexer_goto_row98[] = {
        3,
        48, 110, -32,
-       111, 111, 148,
-       112, 122, 77
+       111, 111, 151,
+       112, 122, 78
 };
-static const int lexer_goto_row98[] = {
+static const int lexer_goto_row99[] = {
        3,
-       48, 99, -81,
-       100, 100, 149,
-       101, 122, 77
+       48, 99, -82,
+       100, 100, 152,
+       101, 122, 78
 };
-static const int lexer_goto_row99[] = {
+static const int lexer_goto_row100[] = {
        4,
        48, 95, -29,
-       97, 118, 77,
-       119, 119, 150,
-       120, 122, 77
+       97, 118, 78,
+       119, 119, 153,
+       120, 122, 78
 };
-static const int lexer_goto_row100[] = {
+static const int lexer_goto_row101[] = {
        3,
-       48, 115, -89,
-       116, 116, 151,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 154,
+       117, 122, 78
 };
-static const int lexer_goto_row101[] = {
+static const int lexer_goto_row102[] = {
        3,
        48, 107, -31,
-       108, 108, 152,
-       109, 122, 77
+       108, 108, 155,
+       109, 122, 78
 };
-static const int lexer_goto_row102[] = {
+static const int lexer_goto_row103[] = {
        4,
        48, 95, -29,
-       97, 98, 77,
-       99, 99, 153,
-       100, 122, 77
+       97, 98, 78,
+       99, 99, 156,
+       100, 122, 78
 };
-static const int lexer_goto_row103[] = {
+static const int lexer_goto_row104[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row104[] = {
+static const int lexer_goto_row105[] = {
        3,
-       48, 98, -103,
-       99, 99, 154,
-       100, 122, 77
+       48, 98, -104,
+       99, 99, 157,
+       100, 122, 78
 };
-static const int lexer_goto_row105[] = {
+static const int lexer_goto_row106[] = {
        5,
-       48, 104, -95,
-       105, 105, 155,
-       106, 110, 77,
-       111, 111, 156,
-       112, 122, 77
+       48, 104, -96,
+       105, 105, 158,
+       106, 110, 78,
+       111, 111, 159,
+       112, 122, 78
 };
-static const int lexer_goto_row106[] = {
+static const int lexer_goto_row107[] = {
        7,
        48, 95, -29,
-       97, 97, 157,
-       98, 99, 77,
-       100, 100, 158,
-       101, 115, 77,
-       116, 116, 159,
-       117, 122, 77
+       97, 97, 160,
+       98, 99, 78,
+       100, 100, 161,
+       101, 115, 78,
+       116, 116, 162,
+       117, 122, 78
 };
-static const int lexer_goto_row107[] = {
+static const int lexer_goto_row108[] = {
        3,
        48, 107, -31,
-       108, 108, 160,
-       109, 122, 77
+       108, 108, 163,
+       109, 122, 78
 };
-static const int lexer_goto_row108[] = {
+static const int lexer_goto_row109[] = {
        3,
        48, 100, -39,
-       101, 101, 161,
-       102, 122, 77
+       101, 101, 164,
+       102, 122, 78
 };
-static const int lexer_goto_row109[] = {
+static const int lexer_goto_row110[] = {
        3,
-       48, 111, -94,
-       112, 112, 162,
-       113, 122, 77
+       48, 111, -95,
+       112, 112, 165,
+       113, 122, 78
 };
-static const int lexer_goto_row110[] = {
+static const int lexer_goto_row111[] = {
        3,
        48, 100, -39,
-       101, 101, 163,
-       102, 122, 77
+       101, 101, 166,
+       102, 122, 78
 };
-static const int lexer_goto_row111[] = {
+static const int lexer_goto_row112[] = {
        4,
        48, 95, -29,
-       97, 116, 77,
-       117, 117, 164,
-       118, 122, 77
-};
-static const int lexer_goto_row112[] = {
-       3,
-       48, 111, -94,
-       112, 112, 165,
-       113, 122, 77
+       97, 116, 78,
+       117, 117, 167,
+       118, 122, 78
 };
 static const int lexer_goto_row113[] = {
        3,
-       48, 104, -95,
-       105, 105, 166,
-       106, 122, 77
+       48, 111, -95,
+       112, 112, 168,
+       113, 122, 78
 };
 static const int lexer_goto_row114[] = {
        3,
-       48, 113, -30,
-       114, 114, 167,
-       115, 122, 77
+       48, 104, -96,
+       105, 105, 169,
+       106, 122, 78
 };
 static const int lexer_goto_row115[] = {
        3,
-       48, 104, -95,
-       105, 105, 168,
-       106, 122, 77
+       48, 113, -30,
+       114, 114, 170,
+       115, 122, 78
 };
 static const int lexer_goto_row116[] = {
        3,
-       48, 104, -95,
-       105, 105, 169,
-       106, 122, 77
+       48, 104, -96,
+       105, 105, 171,
+       106, 122, 78
 };
 static const int lexer_goto_row117[] = {
+       3,
+       48, 104, -96,
+       105, 105, 172,
+       106, 122, 78
+};
+static const int lexer_goto_row118[] = {
        1,
        0, 255, -48
 };
-static const int lexer_goto_row119[] = {
+static const int lexer_goto_row120[] = {
        3,
-       0, 9, 170,
-       11, 12, 170,
-       14, 255, 170
+       0, 9, 173,
+       11, 12, 173,
+       14, 255, 173
 };
-static const int lexer_goto_row121[] = {
+static const int lexer_goto_row122[] = {
        1,
        0, 255, -8
 };
 static const int lexer_goto_row125[] = {
        1,
-       48, 122, -75
+       39, 39, 174
 };
-static const int lexer_goto_row126[] = {
+static const int lexer_goto_row128[] = {
        1,
-       48, 122, -75
+       48, 122, -76
 };
-static const int lexer_goto_row127[] = {
+static const int lexer_goto_row129[] = {
        1,
-       48, 122, -75
+       48, 122, -76
 };
-static const int lexer_goto_row128[] = {
+static const int lexer_goto_row130[] = {
        1,
-       48, 122, -75
+       48, 122, -76
 };
-static const int lexer_goto_row129[] = {
+static const int lexer_goto_row131[] = {
+       1,
+       48, 122, -76
+};
+static const int lexer_goto_row132[] = {
        3,
        48, 113, -30,
-       114, 114, 171,
-       115, 122, 77
+       114, 114, 175,
+       115, 122, 78
 };
-static const int lexer_goto_row130[] = {
+static const int lexer_goto_row133[] = {
        3,
-       48, 115, -89,
-       116, 116, 172,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 176,
+       117, 122, 78
 };
-static const int lexer_goto_row131[] = {
+static const int lexer_goto_row134[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row132[] = {
+static const int lexer_goto_row135[] = {
        3,
        48, 100, -39,
-       101, 101, 173,
-       102, 122, 77
+       101, 101, 177,
+       102, 122, 78
 };
-static const int lexer_goto_row133[] = {
+static const int lexer_goto_row136[] = {
        3,
        48, 95, -29,
-       97, 97, 174,
-       98, 122, 77
+       97, 97, 178,
+       98, 122, 78
 };
-static const int lexer_goto_row134[] = {
+static const int lexer_goto_row137[] = {
        3,
-       48, 114, -82,
-       115, 115, 175,
-       116, 122, 77
+       48, 114, -83,
+       115, 115, 179,
+       116, 122, 78
 };
-static const int lexer_goto_row135[] = {
+static const int lexer_goto_row138[] = {
        3,
-       48, 115, -89,
-       116, 116, 176,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 180,
+       117, 122, 78
 };
-static const int lexer_goto_row136[] = {
+static const int lexer_goto_row139[] = {
        3,
        48, 100, -39,
-       101, 101, 177,
-       102, 122, 77
+       101, 101, 181,
+       102, 122, 78
 };
-static const int lexer_goto_row137[] = {
+static const int lexer_goto_row140[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row138[] = {
+static const int lexer_goto_row141[] = {
        4,
        48, 95, -29,
-       97, 108, 77,
-       109, 109, 178,
-       110, 122, 77
+       97, 108, 78,
+       109, 109, 182,
+       110, 122, 78
 };
-static const int lexer_goto_row139[] = {
+static const int lexer_goto_row142[] = {
        3,
        48, 100, -39,
-       101, 101, 179,
-       102, 122, 77
+       101, 101, 183,
+       102, 122, 78
 };
-static const int lexer_goto_row140[] = {
+static const int lexer_goto_row143[] = {
        3,
-       48, 114, -82,
-       115, 115, 180,
-       116, 122, 77
+       48, 114, -83,
+       115, 115, 184,
+       116, 122, 78
 };
-static const int lexer_goto_row141[] = {
+static const int lexer_goto_row144[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row142[] = {
+static const int lexer_goto_row145[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row143[] = {
+static const int lexer_goto_row146[] = {
        3,
        48, 110, -32,
-       111, 111, 181,
-       112, 122, 77
+       111, 111, 185,
+       112, 122, 78
 };
-static const int lexer_goto_row144[] = {
+static const int lexer_goto_row147[] = {
        3,
-       48, 115, -89,
-       116, 116, 182,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 186,
+       117, 122, 78
 };
-static const int lexer_goto_row145[] = {
+static const int lexer_goto_row148[] = {
        5,
        48, 100, -39,
-       101, 101, 183,
-       102, 113, 77,
-       114, 114, 184,
-       115, 122, 77
+       101, 101, 187,
+       102, 113, 78,
+       114, 114, 188,
+       115, 122, 78
 };
-static const int lexer_goto_row146[] = {
+static const int lexer_goto_row149[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row147[] = {
+static const int lexer_goto_row150[] = {
        3,
        48, 100, -39,
-       101, 101, 185,
-       102, 122, 77
+       101, 101, 189,
+       102, 122, 78
 };
-static const int lexer_goto_row148[] = {
+static const int lexer_goto_row151[] = {
        3,
        48, 100, -39,
-       101, 101, 186,
-       102, 122, 77
+       101, 101, 190,
+       102, 122, 78
 };
-static const int lexer_goto_row149[] = {
+static const int lexer_goto_row152[] = {
        3,
-       48, 111, -94,
-       112, 112, 187,
-       113, 122, 77
+       48, 111, -95,
+       112, 112, 191,
+       113, 122, 78
 };
-static const int lexer_goto_row150[] = {
+static const int lexer_goto_row153[] = {
        3,
-       48, 116, -112,
-       117, 117, 188,
-       118, 122, 77
+       48, 116, -113,
+       117, 117, 192,
+       118, 122, 78
 };
-static const int lexer_goto_row151[] = {
+static const int lexer_goto_row154[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row152[] = {
+static const int lexer_goto_row155[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row153[] = {
+static const int lexer_goto_row156[] = {
        3,
        48, 107, -31,
-       108, 108, 189,
-       109, 122, 77
+       108, 108, 193,
+       109, 122, 78
 };
-static const int lexer_goto_row154[] = {
+static const int lexer_goto_row157[] = {
        3,
        48, 100, -39,
-       101, 101, 190,
-       102, 122, 77
+       101, 101, 194,
+       102, 122, 78
 };
-static const int lexer_goto_row155[] = {
+static const int lexer_goto_row158[] = {
        4,
        48, 95, -29,
-       97, 106, 77,
-       107, 107, 191,
-       108, 122, 77
+       97, 106, 78,
+       107, 107, 195,
+       108, 122, 78
 };
-static const int lexer_goto_row156[] = {
+static const int lexer_goto_row159[] = {
        4,
        48, 95, -29,
-       97, 117, 77,
-       118, 118, 192,
-       119, 122, 77
+       97, 117, 78,
+       118, 118, 196,
+       119, 122, 78
 };
-static const int lexer_goto_row157[] = {
+static const int lexer_goto_row160[] = {
        3,
-       48, 115, -89,
-       116, 116, 193,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 197,
+       117, 122, 78
 };
-static const int lexer_goto_row158[] = {
+static const int lexer_goto_row161[] = {
        3,
-       48, 99, -81,
-       100, 100, 194,
-       101, 122, 77
+       48, 99, -82,
+       100, 100, 198,
+       101, 122, 78
 };
-static const int lexer_goto_row159[] = {
+static const int lexer_goto_row162[] = {
        3,
        48, 100, -39,
-       101, 101, 195,
-       102, 122, 77
+       101, 101, 199,
+       102, 122, 78
 };
-static const int lexer_goto_row160[] = {
+static const int lexer_goto_row163[] = {
        3,
-       48, 116, -112,
-       117, 117, 196,
-       118, 122, 77
+       48, 116, -113,
+       117, 117, 200,
+       118, 122, 78
 };
-static const int lexer_goto_row161[] = {
+static const int lexer_goto_row164[] = {
        3,
        48, 101, -36,
-       102, 102, 197,
-       103, 122, 77
+       102, 102, 201,
+       103, 122, 78
 };
-static const int lexer_goto_row162[] = {
+static const int lexer_goto_row165[] = {
        3,
-       48, 98, -103,
-       99, 99, 198,
-       100, 122, 77
+       48, 98, -104,
+       99, 99, 202,
+       100, 122, 78
 };
-static const int lexer_goto_row163[] = {
+static const int lexer_goto_row166[] = {
        3,
        48, 100, -39,
-       101, 101, 199,
-       102, 122, 77
+       101, 101, 203,
+       102, 122, 78
 };
-static const int lexer_goto_row164[] = {
+static const int lexer_goto_row167[] = {
        3,
        48, 109, -40,
-       110, 110, 200,
-       111, 122, 77
+       110, 110, 204,
+       111, 122, 78
 };
-static const int lexer_goto_row165[] = {
+static const int lexer_goto_row168[] = {
        3,
        48, 100, -39,
-       101, 101, 201,
-       102, 122, 77
+       101, 101, 205,
+       102, 122, 78
 };
-static const int lexer_goto_row166[] = {
+static const int lexer_goto_row169[] = {
        3,
        48, 100, -39,
-       101, 101, 202,
-       102, 122, 77
+       101, 101, 206,
+       102, 122, 78
 };
-static const int lexer_goto_row167[] = {
+static const int lexer_goto_row170[] = {
        3,
-       48, 117, -157,
-       118, 118, 203,
-       119, 122, 77
+       48, 117, -160,
+       118, 118, 207,
+       119, 122, 78
 };
-static const int lexer_goto_row168[] = {
+static const int lexer_goto_row171[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row169[] = {
+static const int lexer_goto_row172[] = {
        3,
        48, 107, -31,
-       108, 108, 204,
-       109, 122, 77
+       108, 108, 208,
+       109, 122, 78
 };
-static const int lexer_goto_row170[] = {
+static const int lexer_goto_row173[] = {
        3,
-       48, 115, -89,
-       116, 116, 205,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 209,
+       117, 122, 78
 };
-static const int lexer_goto_row171[] = {
+static const int lexer_goto_row174[] = {
        1,
        0, 255, -48
 };
-static const int lexer_goto_row172[] = {
+static const int lexer_goto_row176[] = {
        3,
-       48, 115, -89,
-       116, 116, 206,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 210,
+       117, 122, 78
 };
-static const int lexer_goto_row173[] = {
+static const int lexer_goto_row177[] = {
        3,
        48, 113, -30,
-       114, 114, 207,
-       115, 122, 77
+       114, 114, 211,
+       115, 122, 78
 };
-static const int lexer_goto_row174[] = {
+static const int lexer_goto_row178[] = {
        3,
        48, 113, -30,
-       114, 114, 208,
-       115, 122, 77
+       114, 114, 212,
+       115, 122, 78
 };
-static const int lexer_goto_row175[] = {
+static const int lexer_goto_row179[] = {
        3,
-       48, 106, -156,
-       107, 107, 209,
-       108, 122, 77
+       48, 106, -159,
+       107, 107, 213,
+       108, 122, 78
 };
-static const int lexer_goto_row176[] = {
+static const int lexer_goto_row180[] = {
        3,
-       48, 114, -82,
-       115, 115, 210,
-       116, 122, 77
+       48, 114, -83,
+       115, 115, 214,
+       116, 122, 78
 };
-static const int lexer_goto_row177[] = {
+static const int lexer_goto_row181[] = {
        3,
-       48, 104, -95,
-       105, 105, 211,
-       106, 122, 77
+       48, 104, -96,
+       105, 105, 215,
+       106, 122, 78
 };
-static const int lexer_goto_row178[] = {
+static const int lexer_goto_row182[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row179[] = {
+static const int lexer_goto_row183[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row180[] = {
+static const int lexer_goto_row184[] = {
        3,
        48, 113, -30,
-       114, 114, 212,
-       115, 122, 77
+       114, 114, 216,
+       115, 122, 78
 };
-static const int lexer_goto_row181[] = {
+static const int lexer_goto_row185[] = {
        3,
        48, 100, -39,
-       101, 101, 213,
-       102, 122, 77
+       101, 101, 217,
+       102, 122, 78
 };
-static const int lexer_goto_row182[] = {
+static const int lexer_goto_row186[] = {
        3,
        48, 113, -30,
-       114, 114, 214,
-       115, 122, 77
+       114, 114, 218,
+       115, 122, 78
 };
-static const int lexer_goto_row183[] = {
+static const int lexer_goto_row187[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row184[] = {
+static const int lexer_goto_row188[] = {
        3,
        48, 113, -30,
-       114, 114, 215,
-       115, 122, 77
+       114, 114, 219,
+       115, 122, 78
 };
-static const int lexer_goto_row185[] = {
+static const int lexer_goto_row189[] = {
        3,
-       48, 116, -112,
-       117, 117, 216,
-       118, 122, 77
+       48, 116, -113,
+       117, 117, 220,
+       118, 122, 78
 };
-static const int lexer_goto_row186[] = {
+static const int lexer_goto_row190[] = {
        3,
-       48, 115, -89,
-       116, 116, 217,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 221,
+       117, 122, 78
 };
-static const int lexer_goto_row187[] = {
+static const int lexer_goto_row191[] = {
        3,
        48, 107, -31,
-       108, 108, 218,
-       109, 122, 77
+       108, 108, 222,
+       109, 122, 78
 };
-static const int lexer_goto_row188[] = {
+static const int lexer_goto_row192[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row189[] = {
+static const int lexer_goto_row193[] = {
        3,
        48, 107, -31,
-       108, 108, 219,
-       109, 122, 77
+       108, 108, 223,
+       109, 122, 78
 };
-static const int lexer_goto_row190[] = {
+static const int lexer_goto_row194[] = {
        3,
        48, 95, -29,
-       97, 97, 220,
-       98, 122, 77
+       97, 97, 224,
+       98, 122, 78
 };
-static const int lexer_goto_row191[] = {
+static const int lexer_goto_row195[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row192[] = {
+static const int lexer_goto_row196[] = {
        3,
        48, 95, -29,
-       97, 97, 221,
-       98, 122, 77
+       97, 97, 225,
+       98, 122, 78
 };
-static const int lexer_goto_row193[] = {
+static const int lexer_goto_row197[] = {
        3,
        48, 95, -29,
-       97, 97, 222,
-       98, 122, 77
+       97, 97, 226,
+       98, 122, 78
 };
-static const int lexer_goto_row194[] = {
+static const int lexer_goto_row198[] = {
        3,
        48, 100, -39,
-       101, 101, 223,
-       102, 122, 77
+       101, 101, 227,
+       102, 122, 78
 };
-static const int lexer_goto_row195[] = {
+static const int lexer_goto_row199[] = {
        3,
        48, 95, -29,
-       97, 97, 224,
-       98, 122, 77
+       97, 97, 228,
+       98, 122, 78
 };
-static const int lexer_goto_row196[] = {
+static const int lexer_goto_row200[] = {
        3,
        48, 101, -36,
-       102, 102, 225,
-       103, 122, 77
+       102, 102, 229,
+       103, 122, 78
 };
-static const int lexer_goto_row197[] = {
+static const int lexer_goto_row201[] = {
        3,
        48, 113, -30,
-       114, 114, 226,
-       115, 122, 77
+       114, 114, 230,
+       115, 122, 78
 };
-static const int lexer_goto_row198[] = {
+static const int lexer_goto_row202[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row199[] = {
+static const int lexer_goto_row203[] = {
        3,
-       48, 104, -95,
-       105, 105, 227,
-       106, 122, 77
+       48, 104, -96,
+       105, 105, 231,
+       106, 122, 78
 };
-static const int lexer_goto_row200[] = {
+static const int lexer_goto_row204[] = {
        3,
        48, 113, -30,
-       114, 114, 228,
-       115, 122, 77
+       114, 114, 232,
+       115, 122, 78
 };
-static const int lexer_goto_row201[] = {
+static const int lexer_goto_row205[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row202[] = {
+static const int lexer_goto_row206[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row203[] = {
+static const int lexer_goto_row207[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row204[] = {
+static const int lexer_goto_row208[] = {
        3,
        48, 100, -39,
-       101, 101, 229,
-       102, 122, 77
+       101, 101, 233,
+       102, 122, 78
 };
-static const int lexer_goto_row205[] = {
+static const int lexer_goto_row209[] = {
        3,
        48, 100, -39,
-       101, 101, 230,
-       102, 122, 77
+       101, 101, 234,
+       102, 122, 78
 };
-static const int lexer_goto_row206[] = {
+static const int lexer_goto_row210[] = {
        3,
        48, 95, -29,
-       97, 97, 231,
-       98, 122, 77
+       97, 97, 235,
+       98, 122, 78
 };
-static const int lexer_goto_row207[] = {
+static const int lexer_goto_row211[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row208[] = {
+static const int lexer_goto_row212[] = {
        3,
        48, 95, -29,
-       97, 97, 232,
-       98, 122, 77
+       97, 97, 236,
+       98, 122, 78
 };
-static const int lexer_goto_row209[] = {
+static const int lexer_goto_row213[] = {
        3,
-       48, 115, -89,
-       116, 116, 233,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 237,
+       117, 122, 78
 };
-static const int lexer_goto_row210[] = {
+static const int lexer_goto_row214[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row211[] = {
+static const int lexer_goto_row215[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row212[] = {
+static const int lexer_goto_row216[] = {
        3,
        48, 109, -40,
-       110, 110, 234,
-       111, 122, 77
+       110, 110, 238,
+       111, 122, 78
 };
-static const int lexer_goto_row213[] = {
+static const int lexer_goto_row217[] = {
        3,
        48, 109, -40,
-       110, 110, 235,
-       111, 122, 77
+       110, 110, 239,
+       111, 122, 78
 };
-static const int lexer_goto_row214[] = {
+static const int lexer_goto_row218[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row215[] = {
+static const int lexer_goto_row219[] = {
        3,
-       48, 115, -89,
-       116, 116, 236,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 240,
+       117, 122, 78
 };
-static const int lexer_goto_row216[] = {
+static const int lexer_goto_row220[] = {
        5,
        48, 101, -36,
-       102, 102, 237,
-       103, 109, 77,
-       110, 110, 238,
-       111, 122, 77
+       102, 102, 241,
+       103, 109, 78,
+       110, 110, 242,
+       111, 122, 78
 };
-static const int lexer_goto_row217[] = {
+static const int lexer_goto_row221[] = {
        3,
-       48, 99, -81,
-       100, 100, 239,
-       101, 122, 77
+       48, 99, -82,
+       100, 100, 243,
+       101, 122, 78
 };
-static const int lexer_goto_row218[] = {
+static const int lexer_goto_row222[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row219[] = {
+static const int lexer_goto_row223[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row220[] = {
+static const int lexer_goto_row224[] = {
        3,
        48, 100, -39,
-       101, 101, 240,
-       102, 122, 77
+       101, 101, 244,
+       102, 122, 78
 };
-static const int lexer_goto_row221[] = {
+static const int lexer_goto_row225[] = {
        3,
        48, 97, -29,
-       98, 98, 241,
-       99, 122, 77
+       98, 98, 245,
+       99, 122, 78
 };
-static const int lexer_goto_row222[] = {
+static const int lexer_goto_row226[] = {
        4,
        48, 95, -29,
-       97, 102, 77,
-       103, 103, 242,
-       104, 122, 77
+       97, 102, 78,
+       103, 103, 246,
+       104, 122, 78
 };
-static const int lexer_goto_row223[] = {
+static const int lexer_goto_row227[] = {
        3,
-       48, 115, -89,
-       116, 116, 243,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 247,
+       117, 122, 78
 };
-static const int lexer_goto_row224[] = {
+static const int lexer_goto_row228[] = {
        3,
-       48, 98, -103,
-       99, 99, 244,
-       100, 122, 77
+       48, 98, -104,
+       99, 99, 248,
+       100, 122, 78
 };
-static const int lexer_goto_row225[] = {
+static const int lexer_goto_row229[] = {
        3,
        48, 97, -29,
-       98, 98, 245,
-       99, 122, 77
+       98, 98, 249,
+       99, 122, 78
 };
-static const int lexer_goto_row226[] = {
+static const int lexer_goto_row230[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row227[] = {
+static const int lexer_goto_row231[] = {
        3,
        48, 109, -40,
-       110, 110, 246,
-       111, 122, 77
+       110, 110, 250,
+       111, 122, 78
 };
-static const int lexer_goto_row228[] = {
+static const int lexer_goto_row232[] = {
        3,
        48, 95, -29,
-       97, 97, 247,
-       98, 122, 77
+       97, 97, 251,
+       98, 122, 78
 };
-static const int lexer_goto_row229[] = {
+static const int lexer_goto_row233[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row230[] = {
+static const int lexer_goto_row234[] = {
        3,
        48, 113, -30,
-       114, 114, 248,
-       115, 122, 77
+       114, 114, 252,
+       115, 122, 78
 };
-static const int lexer_goto_row231[] = {
+static const int lexer_goto_row235[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row232[] = {
+static const int lexer_goto_row236[] = {
        3,
        48, 97, -29,
-       98, 98, 249,
-       99, 122, 77
+       98, 98, 253,
+       99, 122, 78
 };
-static const int lexer_goto_row233[] = {
+static const int lexer_goto_row237[] = {
        3,
-       48, 98, -103,
-       99, 99, 250,
-       100, 122, 77
+       48, 98, -104,
+       99, 99, 254,
+       100, 122, 78
 };
-static const int lexer_goto_row234[] = {
+static const int lexer_goto_row238[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row235[] = {
+static const int lexer_goto_row239[] = {
        3,
-       48, 116, -112,
-       117, 117, 251,
-       118, 122, 77
+       48, 116, -113,
+       117, 117, 255,
+       118, 122, 78
 };
-static const int lexer_goto_row236[] = {
+static const int lexer_goto_row240[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row237[] = {
+static const int lexer_goto_row241[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row238[] = {
+static const int lexer_goto_row242[] = {
        3,
        48, 95, -29,
-       97, 97, 252,
-       98, 122, 77
+       97, 97, 256,
+       98, 122, 78
 };
-static const int lexer_goto_row239[] = {
+static const int lexer_goto_row243[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row240[] = {
+static const int lexer_goto_row244[] = {
        3,
        48, 100, -39,
-       101, 101, 253,
-       102, 122, 77
+       101, 101, 257,
+       102, 122, 78
 };
-static const int lexer_goto_row241[] = {
+static const int lexer_goto_row245[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row242[] = {
+static const int lexer_goto_row246[] = {
        3,
        48, 107, -31,
-       108, 108, 254,
-       109, 122, 77
+       108, 108, 258,
+       109, 122, 78
 };
-static const int lexer_goto_row243[] = {
+static const int lexer_goto_row247[] = {
        3,
        48, 100, -39,
-       101, 101, 255,
-       102, 122, 77
+       101, 101, 259,
+       102, 122, 78
 };
-static const int lexer_goto_row244[] = {
+static const int lexer_goto_row248[] = {
        3,
        48, 100, -39,
-       101, 101, 256,
-       102, 122, 77
+       101, 101, 260,
+       102, 122, 78
 };
-static const int lexer_goto_row245[] = {
+static const int lexer_goto_row249[] = {
        3,
-       48, 115, -89,
-       116, 116, 257,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 261,
+       117, 122, 78
 };
-static const int lexer_goto_row246[] = {
+static const int lexer_goto_row250[] = {
        3,
        48, 107, -31,
-       108, 108, 258,
-       109, 122, 77
+       108, 108, 262,
+       109, 122, 78
 };
-static const int lexer_goto_row247[] = {
+static const int lexer_goto_row251[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row248[] = {
+static const int lexer_goto_row252[] = {
        3,
        48, 107, -31,
-       108, 108, 259,
-       109, 122, 77
+       108, 108, 263,
+       109, 122, 78
 };
-static const int lexer_goto_row249[] = {
+static const int lexer_goto_row253[] = {
        3,
-       48, 114, -82,
-       115, 115, 260,
-       116, 122, 77
+       48, 114, -83,
+       115, 115, 264,
+       116, 122, 78
 };
-static const int lexer_goto_row250[] = {
+static const int lexer_goto_row254[] = {
        3,
        48, 107, -31,
-       108, 108, 261,
-       109, 122, 77
+       108, 108, 265,
+       109, 122, 78
 };
-static const int lexer_goto_row251[] = {
+static const int lexer_goto_row255[] = {
        3,
-       48, 115, -89,
-       116, 116, 262,
-       117, 122, 77
+       48, 115, -90,
+       116, 116, 266,
+       117, 122, 78
 };
-static const int lexer_goto_row252[] = {
+static const int lexer_goto_row256[] = {
        3,
        48, 100, -39,
-       101, 101, 263,
-       102, 122, 77
+       101, 101, 267,
+       102, 122, 78
 };
-static const int lexer_goto_row253[] = {
+static const int lexer_goto_row257[] = {
        3,
-       48, 98, -103,
-       99, 99, 264,
-       100, 122, 77
+       48, 98, -104,
+       99, 99, 268,
+       100, 122, 78
 };
-static const int lexer_goto_row254[] = {
+static const int lexer_goto_row258[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row255[] = {
+static const int lexer_goto_row259[] = {
        3,
        48, 100, -39,
-       101, 101, 265,
-       102, 122, 77
+       101, 101, 269,
+       102, 122, 78
 };
-static const int lexer_goto_row256[] = {
+static const int lexer_goto_row260[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row257[] = {
+static const int lexer_goto_row261[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row258[] = {
+static const int lexer_goto_row262[] = {
        3,
        48, 100, -39,
-       101, 101, 266,
-       102, 122, 77
+       101, 101, 270,
+       102, 122, 78
 };
-static const int lexer_goto_row259[] = {
+static const int lexer_goto_row263[] = {
        3,
        48, 100, -39,
-       101, 101, 267,
-       102, 122, 77
+       101, 101, 271,
+       102, 122, 78
 };
-static const int lexer_goto_row260[] = {
+static const int lexer_goto_row264[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row261[] = {
+static const int lexer_goto_row265[] = {
        3,
        48, 95, -29,
-       97, 97, 268,
-       98, 122, 77
+       97, 97, 272,
+       98, 122, 78
 };
-static const int lexer_goto_row262[] = {
+static const int lexer_goto_row266[] = {
        3,
        48, 100, -39,
-       101, 101, 269,
-       102, 122, 77
+       101, 101, 273,
+       102, 122, 78
 };
-static const int lexer_goto_row263[] = {
+static const int lexer_goto_row267[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row264[] = {
+static const int lexer_goto_row268[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row265[] = {
+static const int lexer_goto_row269[] = {
        3,
        48, 100, -39,
-       101, 101, 270,
-       102, 122, 77
+       101, 101, 274,
+       102, 122, 78
 };
-static const int lexer_goto_row266[] = {
+static const int lexer_goto_row270[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row267[] = {
+static const int lexer_goto_row271[] = {
        3,
-       48, 99, -81,
-       100, 100, 271,
-       101, 122, 77
+       48, 99, -82,
+       100, 100, 275,
+       101, 122, 78
 };
-static const int lexer_goto_row268[] = {
+static const int lexer_goto_row272[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row269[] = {
+static const int lexer_goto_row273[] = {
        3,
        48, 107, -31,
-       108, 108, 272,
-       109, 122, 77
+       108, 108, 276,
+       109, 122, 78
 };
-static const int lexer_goto_row270[] = {
+static const int lexer_goto_row274[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row271[] = {
+static const int lexer_goto_row275[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row272[] = {
+static const int lexer_goto_row276[] = {
        1,
        48, 122, -35
 };
-static const int lexer_goto_row273[] = {
+static const int lexer_goto_row277[] = {
        1,
        48, 122, -35
 };
@@ -1519,18 +1531,18 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row56,
        lexer_goto_row57,
        lexer_goto_row_null,
+       lexer_goto_row59,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row61,
        lexer_goto_row62,
        lexer_goto_row63,
+       lexer_goto_row64,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row66,
+       lexer_goto_row67,
        lexer_goto_row_null,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row70,
        lexer_goto_row71,
        lexer_goto_row72,
        lexer_goto_row73,
@@ -1578,16 +1590,16 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row115,
        lexer_goto_row116,
        lexer_goto_row117,
+       lexer_goto_row118,
        lexer_goto_row_null,
-       lexer_goto_row119,
-       lexer_goto_row_null,
-       lexer_goto_row121,
+       lexer_goto_row120,
        lexer_goto_row_null,
+       lexer_goto_row122,
        lexer_goto_row_null,
        lexer_goto_row_null,
        lexer_goto_row125,
-       lexer_goto_row126,
-       lexer_goto_row127,
+       lexer_goto_row_null,
+       lexer_goto_row_null,
        lexer_goto_row128,
        lexer_goto_row129,
        lexer_goto_row130,
@@ -1635,7 +1647,7 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row172,
        lexer_goto_row173,
        lexer_goto_row174,
-       lexer_goto_row175,
+       lexer_goto_row_null,
        lexer_goto_row176,
        lexer_goto_row177,
        lexer_goto_row178,
@@ -1733,11 +1745,15 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row270,
        lexer_goto_row271,
        lexer_goto_row272,
-       lexer_goto_row273
+       lexer_goto_row273,
+       lexer_goto_row274,
+       lexer_goto_row275,
+       lexer_goto_row276,
+       lexer_goto_row277
 };
 
 const int lexer_accept_table[] = {
-       -1,0,1,1,0,79,-1,-1,69,-1,52,53,67,65,56,66,64,68,83,57,72,59,75,80,54,55,-1,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,-1,1,71,-1,86,-1,87,-1,2,2,-1,85,60,61,63,84,-1,58,74,73,70,76,77,80,80,80,80,82,81,81,81,81,81,81,48,81,81,81,16,81,81,81,81,81,81,25,81,31,15,81,81,81,81,81,81,81,33,81,81,81,81,81,81,81,81,81,81,81,81,81,-1,89,-1,88,-1,2,62,78,82,82,82,82,81,81,32,81,81,81,81,81,10,81,81,81,30,11,81,81,81,41,81,81,81,81,40,34,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,19,81,81,-1,81,81,81,81,81,81,27,8,81,81,81,13,81,81,81,81,29,81,47,42,81,81,81,81,81,81,44,81,81,26,45,12,81,81,81,38,81,81,37,5,81,81,46,81,81,81,50,51,81,81,81,81,81,81,14,81,81,43,81,28,81,81,39,81,21,4,81,20,81,3,81,81,81,81,81,35,81,81,81,81,81,81,24,81,3,23,81,81,9,81,81,6,36,81,49,81,17,81,18,7,22,8
+       -1,0,1,1,0,79,91,2,69,-1,52,53,67,65,56,66,64,68,83,57,72,59,75,80,54,55,-1,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,91,1,71,91,86,-1,87,2,2,2,90,90,90,60,61,63,84,-1,58,74,73,70,76,77,80,80,80,80,82,81,81,81,81,81,81,48,81,81,81,16,81,81,81,81,81,81,25,81,31,15,81,81,81,81,81,81,81,33,81,81,81,81,81,81,81,81,81,81,81,81,81,91,89,-1,88,91,2,85,90,62,78,82,82,82,82,81,81,32,81,81,81,81,81,10,81,81,81,30,11,81,81,81,41,81,81,81,81,40,34,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,19,81,81,91,85,81,81,81,81,81,81,27,8,81,81,81,13,81,81,81,81,29,81,47,42,81,81,81,81,81,81,44,81,81,26,45,12,81,81,81,38,81,81,37,5,81,81,46,81,81,81,50,51,81,81,81,81,81,81,14,81,81,43,81,28,81,81,39,81,21,4,81,20,81,3,81,81,81,81,81,35,81,81,81,81,81,81,24,81,3,23,81,81,9,81,81,6,36,81,49,81,17,81,18,7,22,8
 };
 
 static int parser_action_row1[] = {
@@ -1745,7 +1761,7 @@ static int parser_action_row1[] = {
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 0
+       91, 1, 0
 };
 static int parser_action_row2[] = {
        1,
@@ -1758,14 +1774,14 @@ static int parser_action_row3[] = {
 static int parser_action_row4[] = {
        2,
        -1, 3, 3,
-       89, 2, -1
+       91, 2, -1
 };
 static int parser_action_row5[] = {
        4,
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 1
+       91, 1, 1
 };
 static int parser_action_row6[] = {
        1,
@@ -1786,7 +1802,7 @@ static int parser_action_row9[] = {
 static int parser_action_row10[] = {
        2,
        -1, 1, 431,
-       89, 1, 36
+       91, 1, 36
 };
 static int parser_action_row11[] = {
        34,
@@ -1845,21 +1861,21 @@ static int parser_action_row15[] = {
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 2
+       91, 1, 2
 };
 static int parser_action_row16[] = {
        4,
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 4
+       91, 1, 4
 };
 static int parser_action_row17[] = {
        4,
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 8
+       91, 1, 8
 };
 static int parser_action_row18[] = {
        3,
@@ -1917,21 +1933,21 @@ static int parser_action_row22[] = {
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 3
+       91, 1, 3
 };
 static int parser_action_row23[] = {
        4,
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 5
+       91, 1, 5
 };
 static int parser_action_row24[] = {
        4,
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 9
+       91, 1, 9
 };
 static int parser_action_row25[] = {
        3,
@@ -2309,7 +2325,7 @@ static int parser_action_row51[] = {
        84, 0, 121,
        85, 0, 122,
        86, 0, 56,
-       89, 1, 410
+       91, 1, 410
 };
 static int parser_action_row52[] = {
        4,
@@ -2471,14 +2487,14 @@ static int parser_action_row85[] = {
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 6
+       91, 1, 6
 };
 static int parser_action_row86[] = {
        4,
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 10
+       91, 1, 10
 };
 static int parser_action_row87[] = {
        1,
@@ -2529,7 +2545,7 @@ static int parser_action_row90[] = {
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 12
+       91, 1, 12
 };
 static int parser_action_row91[] = {
        1,
@@ -2597,14 +2613,14 @@ static int parser_action_row98[] = {
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 7
+       91, 1, 7
 };
 static int parser_action_row99[] = {
        4,
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 11
+       91, 1, 11
 };
 static int parser_action_row100[] = {
        1,
@@ -2615,7 +2631,7 @@ static int parser_action_row101[] = {
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 13
+       91, 1, 13
 };
 static int parser_action_row102[] = {
        1,
@@ -3574,7 +3590,7 @@ static int parser_action_row226[] = {
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 14
+       91, 1, 14
 };
 static int parser_action_row227[] = {
        1,
@@ -3615,7 +3631,7 @@ static int parser_action_row233[] = {
        -1, 1, 430,
        0, 0, 1,
        1, 0, 2,
-       89, 1, 15
+       91, 1, 15
 };
 static int parser_action_row234[] = {
        1,
@@ -6134,7 +6150,7 @@ static int parser_action_row492[] = {
        84, 0, 121,
        85, 0, 122,
        86, 0, 56,
-       89, 1, 410
+       91, 1, 410
 };
 static int parser_action_row493[] = {
        4,
diff --git a/tests/error_parser_oneline_bad_char.nit b/tests/error_parser_oneline_bad_char.nit
new file mode 100644 (file)
index 0000000..0bf5b64
--- /dev/null
@@ -0,0 +1 @@
+'h
diff --git a/tests/error_parser_oneline_bad_char_empty.nit b/tests/error_parser_oneline_bad_char_empty.nit
new file mode 100644 (file)
index 0000000..a614936
--- /dev/null
@@ -0,0 +1 @@
+''
diff --git a/tests/error_parser_oneline_bad_char_full.nit b/tests/error_parser_oneline_bad_char_full.nit
new file mode 100644 (file)
index 0000000..30f1577
--- /dev/null
@@ -0,0 +1 @@
+'hello'
diff --git a/tests/error_parser_oneline_bad_char_noeol.nit b/tests/error_parser_oneline_bad_char_noeol.nit
new file mode 100644 (file)
index 0000000..cb8806c
--- /dev/null
@@ -0,0 +1 @@
+'h
\ No newline at end of file
diff --git a/tests/error_parser_oneline_bad_string.nit b/tests/error_parser_oneline_bad_string.nit
new file mode 100644 (file)
index 0000000..d771a26
--- /dev/null
@@ -0,0 +1 @@
+"hello
diff --git a/tests/error_parser_oneline_bad_string_noeol.nit b/tests/error_parser_oneline_bad_string_noeol.nit
new file mode 100644 (file)
index 0000000..5c574d2
--- /dev/null
@@ -0,0 +1 @@
+"hello
\ No newline at end of file
diff --git a/tests/sav/error_parser_oneline_bad_char.sav b/tests/sav/error_parser_oneline_bad_char.sav
new file mode 100644 (file)
index 0000000..a6c268b
--- /dev/null
@@ -0,0 +1 @@
+./error_parser_oneline_bad_char.nit:1,1--2: Syntax error: unexpected malformed character 'h.
diff --git a/tests/sav/error_parser_oneline_bad_char_empty.sav b/tests/sav/error_parser_oneline_bad_char_empty.sav
new file mode 100644 (file)
index 0000000..93eaaef
--- /dev/null
@@ -0,0 +1 @@
+./error_parser_oneline_bad_char_empty.nit:1,1--2: Syntax error: unexpected malformed character ''.
diff --git a/tests/sav/error_parser_oneline_bad_char_full.sav b/tests/sav/error_parser_oneline_bad_char_full.sav
new file mode 100644 (file)
index 0000000..1a91c5e
--- /dev/null
@@ -0,0 +1 @@
+./error_parser_oneline_bad_char_full.nit:1,1--2: Syntax error: unexpected malformed character 'h.
diff --git a/tests/sav/error_parser_oneline_bad_char_noeol.sav b/tests/sav/error_parser_oneline_bad_char_noeol.sav
new file mode 100644 (file)
index 0000000..2682ace
--- /dev/null
@@ -0,0 +1 @@
+./error_parser_oneline_bad_char_noeol.nit:1,1--2: Syntax error: unexpected malformed character 'h.
diff --git a/tests/sav/error_parser_oneline_bad_string.sav b/tests/sav/error_parser_oneline_bad_string.sav
new file mode 100644 (file)
index 0000000..4f5a858
--- /dev/null
@@ -0,0 +1 @@
+./error_parser_oneline_bad_string.nit:1,1--6: Syntax error: unexpected malformed string "hello.
diff --git a/tests/sav/error_parser_oneline_bad_string_noeol.sav b/tests/sav/error_parser_oneline_bad_string_noeol.sav
new file mode 100644 (file)
index 0000000..ec9400e
--- /dev/null
@@ -0,0 +1 @@
+./error_parser_oneline_bad_string_noeol.nit:1,1--6: Syntax error: unexpected malformed string "hello.