diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..6dbb5b6441 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +src/lexer.c linguist-generated diff --git a/docs/syntax.md b/docs/syntax.md index 855f182efa..012aa243ea 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -48,6 +48,18 @@ _proc_ ::= `^` _parameters?_ _self-type-binding?_ _block?_ `->` _type_ | `^` `(` `?` `)` `->` _type_ # Proc type with untyped parameter ``` +`\w` above, and everywhere else in this document, is `[a-zA-Z0-9_]` together +with every character outside ASCII -- the same set Ruby takes into an +identifier. So `ServicioÚltimaVez` is a class name and `nombre_único` is an +alias name. + +The leading character is the exception. RBS reads it to tell a class name from +an interface name from an alias name, so where it makes that distinction it has +to be ASCII: `class 日本語` is a class in Ruby but not a name RBS can write. +Nowhere else is restricted -- a method name, a variable name, an instance +variable name and a class variable name may all open with any character Ruby +accepts. + ### Class instance type Class instance type denotes _an instance of a class_. diff --git a/include/rbs/lexer.h b/include/rbs/lexer.h index 6b5c533e8a..59e3e0c81b 100644 --- a/include/rbs/lexer.h +++ b/include/rbs/lexer.h @@ -72,18 +72,19 @@ enum RBSTokenType { kRETURN, /* return */ kMODULESELF, /* module-self */ - tLIDENT, /* Identifiers starting with lower case */ - tUIDENT, /* Identifiers starting with upper case */ - tULIDENT, /* Identifiers starting with `_` followed by upper case */ - tULLIDENT, /* Identifiers starting with `_` followed by lower case */ - tGIDENT, /* Identifiers starting with `$` */ - tAIDENT, /* Identifiers starting with `@` */ - tA2IDENT, /* Identifiers starting with `@@` */ - tBANGIDENT, /* Identifiers ending with `!` */ - tEQIDENT, /* Identifiers ending with `=` */ - tQIDENT, /* Quoted identifier */ - pAREF_OPR, /* [] */ - tOPERATOR, /* Operator identifier */ + tLIDENT, /* Identifiers starting with lower case */ + tUIDENT, /* Identifiers starting with upper case */ + tULIDENT, /* Identifiers starting with `_` followed by upper case */ + tULLIDENT, /* Identifiers starting with `_` followed by lower case */ + tNONASCIIIDENT, /* Identifiers starting with a character outside ASCII */ + tGIDENT, /* Identifiers starting with `$` */ + tAIDENT, /* Identifiers starting with `@` */ + tA2IDENT, /* Identifiers starting with `@@` */ + tBANGIDENT, /* Identifiers ending with `!` */ + tEQIDENT, /* Identifiers ending with `=` */ + tQIDENT, /* Quoted identifier */ + pAREF_OPR, /* [] */ + tOPERATOR, /* Operator identifier */ tCOMMENT, /* Comment */ tLINECOMMENT, /* Comment of all line */ diff --git a/src/lexer.c b/src/lexer.c index ebbaa650d8..144cc071d8 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -12,184 +12,147 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { unsigned int yych; unsigned int yyaccept = 0; yych = rbs_peek(lexer); - switch (yych) { - case 0x00000000: - goto yy1; - case '\t': - case ' ': - goto yy4; - case '\n': - case '\r': - goto yy6; - case '!': - goto yy7; - case '"': - goto yy9; - case '#': - goto yy10; - case '$': - goto yy12; - case '%': - goto yy13; - case '&': - goto yy14; - case '\'': - goto yy15; - case '(': - goto yy16; - case ')': - goto yy17; - case '*': - goto yy18; - case '+': - goto yy19; - case ',': - goto yy20; - case '-': - goto yy21; - case '.': - goto yy22; - case '/': - case '~': - goto yy24; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - goto yy25; - case ':': - goto yy27; - case '<': - goto yy29; - case '=': - goto yy31; - case '>': - goto yy33; - case '?': - goto yy35; - case '@': - goto yy36; - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - goto yy37; - case '[': - goto yy39; - case ']': - goto yy40; - case '^': - goto yy41; - case '_': - goto yy42; - case '`': - goto yy44; - case 'a': - goto yy46; - case 'b': - goto yy48; - case 'c': - goto yy49; - case 'd': - goto yy50; - case 'e': - goto yy51; - case 'f': - goto yy52; - case 'g': - case 'h': - case 'j': - case 'k': - case 'l': - case 'q': - case 'w': - case 'x': - case 'y': - case 'z': - goto yy53; - case 'i': - goto yy55; - case 'm': - goto yy56; - case 'n': - goto yy57; - case 'o': - goto yy58; - case 'p': - goto yy59; - case 'r': - goto yy60; - case 's': - goto yy61; - case 't': - goto yy62; - case 'u': - goto yy63; - case 'v': - goto yy64; - case '{': - goto yy65; - case '|': - goto yy66; - case '}': - goto yy67; - default: - goto yy2; + if (yych <= '[') { + if (yych <= '(') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x00000000) goto yy1; + if (yych <= 0x00000008) goto yy2; + if (yych <= '\t') goto yy4; + goto yy6; + } else { + if (yych == '\r') goto yy6; + if (yych <= 0x0000001F) goto yy2; + goto yy4; + } + } else { + if (yych <= '$') { + if (yych <= '!') goto yy7; + if (yych <= '"') goto yy9; + if (yych <= '#') goto yy10; + goto yy12; + } else { + if (yych <= '%') goto yy13; + if (yych <= '&') goto yy14; + if (yych <= '\'') goto yy15; + goto yy16; + } + } + } else { + if (yych <= '9') { + if (yych <= ',') { + if (yych <= ')') goto yy17; + if (yych <= '*') goto yy18; + if (yych <= '+') goto yy19; + goto yy20; + } else { + if (yych <= '-') goto yy21; + if (yych <= '.') goto yy22; + if (yych <= '/') goto yy24; + goto yy25; + } + } else { + if (yych <= '=') { + if (yych <= ':') goto yy27; + if (yych <= ';') goto yy2; + if (yych <= '<') goto yy29; + goto yy31; + } else { + if (yych <= '?') { + if (yych <= '>') goto yy33; + goto yy35; + } else { + if (yych <= '@') goto yy36; + if (yych <= 'Z') goto yy37; + goto yy39; + } + } + } + } + } else { + if (yych <= 'n') { + if (yych <= 'c') { + if (yych <= '_') { + if (yych <= '\\') goto yy2; + if (yych <= ']') goto yy40; + if (yych <= '^') goto yy41; + goto yy42; + } else { + if (yych <= '`') goto yy44; + if (yych <= 'a') goto yy46; + if (yych <= 'b') goto yy48; + goto yy49; + } + } else { + if (yych <= 'h') { + if (yych <= 'd') goto yy50; + if (yych <= 'e') goto yy51; + if (yych <= 'f') goto yy52; + goto yy53; + } else { + if (yych <= 'i') goto yy55; + if (yych <= 'l') goto yy53; + if (yych <= 'm') goto yy56; + goto yy57; + } + } + } else { + if (yych <= 'v') { + if (yych <= 'r') { + if (yych <= 'o') goto yy58; + if (yych <= 'p') goto yy59; + if (yych <= 'q') goto yy53; + goto yy60; + } else { + if (yych <= 's') goto yy61; + if (yych <= 't') goto yy62; + if (yych <= 'u') goto yy63; + goto yy64; + } + } else { + if (yych <= '}') { + if (yych <= 'z') goto yy53; + if (yych <= '{') goto yy65; + if (yych <= '|') goto yy66; + goto yy67; + } else { + if (yych <= 0x0000007F) { + if (yych <= '~') goto yy24; + goto yy2; + } else { + if (yych == 0x0000FFFD) goto yy2; + goto yy68; + } + } + } + } } yy1: rbs_skip(lexer); -#line 152 "src/lexer.re" +#line 175 "src/lexer.re" { return rbs_next_eof_token(lexer); } -#line 121 "src/lexer.c" +#line 136 "src/lexer.c" yy2: rbs_skip(lexer); yy3: -#line 153 "src/lexer.re" +#line 176 "src/lexer.re" { return rbs_next_token(lexer, ErrorToken); } -#line 127 "src/lexer.c" +#line 142 "src/lexer.c" yy4: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == '\t') goto yy4; if (yych == ' ') goto yy4; yy5: -#line 151 "src/lexer.re" +#line 174 "src/lexer.re" { return rbs_next_token(lexer, tTRIVIA); } -#line 136 "src/lexer.c" +#line 151 "src/lexer.c" yy6: rbs_skip(lexer); goto yy5; @@ -199,18 +162,18 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { if (yych == '=') goto yy24; if (yych == '~') goto yy24; yy8: -#line 49 "src/lexer.re" +#line 61 "src/lexer.re" { return rbs_next_token(lexer, tOPERATOR); } -#line 148 "src/lexer.c" +#line 163 "src/lexer.c" yy9: yyaccept = 0; rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); if (yych <= 0x00000000) goto yy3; - goto yy69; + goto yy71; yy10: rbs_skip(lexer); yych = rbs_peek(lexer); @@ -221,14 +184,14 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { if (yych != 0x0000FFFD) goto yy10; } yy11: -#line 61 "src/lexer.re" +#line 73 "src/lexer.re" { return rbs_next_token( lexer, lexer->first_token_of_line ? tLINECOMMENT : tCOMMENT ); } -#line 173 "src/lexer.c" +#line 188 "src/lexer.c" yy12: rbs_skip(lexer); yych = rbs_peek(lexer); @@ -236,42 +199,42 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { if (yych <= 0x0000001F) { if (yych <= '\n') { if (yych <= 0x00000000) goto yy3; - if (yych <= 0x00000008) goto yy73; + if (yych <= 0x00000008) goto yy75; goto yy3; } else { if (yych == '\r') goto yy3; - goto yy73; + goto yy75; } } else { if (yych <= '#') { if (yych <= ' ') goto yy3; - if (yych <= '"') goto yy75; - goto yy73; + if (yych <= '"') goto yy77; + goto yy75; } else { if (yych == '%') goto yy3; - if (yych <= '\'') goto yy75; + if (yych <= '\'') goto yy77; goto yy3; } } } else { if (yych <= 'Z') { if (yych <= '/') { - if (yych == '-') goto yy73; - goto yy75; + if (yych == '-') goto yy75; + goto yy77; } else { - if (yych <= '9') goto yy73; - if (yych <= '>') goto yy75; - goto yy73; + if (yych <= '9') goto yy75; + if (yych <= '>') goto yy77; + goto yy75; } } else { if (yych <= '^') { - if (yych == '\\') goto yy75; + if (yych == '\\') goto yy77; goto yy3; } else { - if (yych <= 'z') goto yy73; + if (yych <= 'z') goto yy75; if (yych <= '}') goto yy3; - if (yych <= '~') goto yy75; - goto yy73; + if (yych <= '~') goto yy77; + goto yy75; } } } @@ -280,45 +243,45 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); - if (yych == 'a') goto yy76; + if (yych == 'a') goto yy78; goto yy8; yy14: rbs_skip(lexer); -#line 33 "src/lexer.re" +#line 45 "src/lexer.re" { return rbs_next_token(lexer, pAMP); } -#line 231 "src/lexer.c" +#line 246 "src/lexer.c" yy15: yyaccept = 0; rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); if (yych <= 0x00000000) goto yy3; - goto yy78; + goto yy80; yy16: rbs_skip(lexer); -#line 24 "src/lexer.re" +#line 36 "src/lexer.re" { return rbs_next_token(lexer, pLPAREN); } -#line 243 "src/lexer.c" +#line 258 "src/lexer.c" yy17: rbs_skip(lexer); -#line 25 "src/lexer.re" +#line 37 "src/lexer.re" { return rbs_next_token(lexer, pRPAREN); } -#line 248 "src/lexer.c" +#line 263 "src/lexer.c" yy18: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == '*') goto yy82; -#line 35 "src/lexer.re" + if (yych == '*') goto yy84; +#line 47 "src/lexer.re" { return rbs_next_token(lexer, pSTAR); } -#line 255 "src/lexer.c" +#line 270 "src/lexer.c" yy19: rbs_skip(lexer); yych = rbs_peek(lexer); @@ -328,17 +291,17 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { goto yy8; yy20: rbs_skip(lexer); -#line 30 "src/lexer.re" +#line 42 "src/lexer.re" { return rbs_next_token(lexer, pCOMMA); } -#line 267 "src/lexer.c" +#line 282 "src/lexer.c" yy21: rbs_skip(lexer); yych = rbs_peek(lexer); switch (yych) { case '-': - goto yy83; + goto yy85; case '0': case '1': case '2': @@ -351,7 +314,7 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { case '9': goto yy25; case '>': - goto yy84; + goto yy86; case '@': goto yy24; default: @@ -362,13 +325,13 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); - if (yych == '.') goto yy85; + if (yych == '.') goto yy87; yy23: -#line 37 "src/lexer.re" +#line 49 "src/lexer.re" { return rbs_next_token(lexer, pDOT); } -#line 296 "src/lexer.c" +#line 311 "src/lexer.c" yy24: rbs_skip(lexer); goto yy8; @@ -379,109 +342,79 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { if (yych <= '9') goto yy25; if (yych == '_') goto yy25; yy26: -#line 53 "src/lexer.re" +#line 65 "src/lexer.re" { return rbs_next_token(lexer, tINTEGER); } -#line 309 "src/lexer.c" +#line 324 "src/lexer.c" yy27: yyaccept = 3; rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); - switch (yych) { - case '!': - goto yy86; - case '"': - goto yy88; - case '$': - goto yy89; - case '%': - case '&': - case '/': - case '^': - case '`': - case '|': - case '~': - goto yy90; - case '\'': - goto yy91; - case '*': - goto yy92; - case '+': - case '-': - goto yy93; - case ':': - goto yy94; - case '<': - goto yy95; - case '=': - goto yy96; - case '>': - goto yy97; - case '@': - goto yy98; - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': - goto yy99; - case '[': - goto yy101; - default: - goto yy28; + if (yych <= '<') { + if (yych <= '*') { + if (yych <= '#') { + if (yych <= ' ') goto yy28; + if (yych <= '!') goto yy88; + if (yych <= '"') goto yy90; + } else { + if (yych <= '&') { + if (yych <= '$') goto yy91; + goto yy92; + } else { + if (yych <= '\'') goto yy93; + if (yych >= '*') goto yy94; + } + } + } else { + if (yych <= '.') { + if (yych == ',') goto yy28; + if (yych <= '-') goto yy95; + } else { + if (yych <= '9') { + if (yych <= '/') goto yy92; + } else { + if (yych <= ':') goto yy96; + if (yych >= '<') goto yy97; + } + } + } + } else { + if (yych <= '_') { + if (yych <= '@') { + if (yych <= '=') goto yy98; + if (yych <= '>') goto yy99; + if (yych >= '@') goto yy100; + } else { + if (yych <= '[') { + if (yych <= 'Z') goto yy101; + goto yy103; + } else { + if (yych <= ']') goto yy28; + if (yych <= '^') goto yy92; + goto yy101; + } + } + } else { + if (yych <= '}') { + if (yych <= 'z') { + if (yych <= '`') goto yy92; + goto yy101; + } else { + if (yych == '|') goto yy92; + } + } else { + if (yych <= 0x0000007F) { + if (yych <= '~') goto yy92; + } else { + if (yych != 0x0000FFFD) goto yy101; + } + } + } } yy28: -#line 44 "src/lexer.re" +#line 56 "src/lexer.re" { return rbs_next_token(lexer, pCOLON); } @@ -491,9 +424,9 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { yych = rbs_peek(lexer); if (yych <= ';') goto yy30; if (yych <= '<') goto yy24; - if (yych <= '=') goto yy102; + if (yych <= '=') goto yy104; yy30: -#line 46 "src/lexer.re" +#line 58 "src/lexer.re" { return rbs_next_token(lexer, pLT); } @@ -503,13 +436,13 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { yych = rbs_peek(lexer); if (yych <= '>') { if (yych <= '<') goto yy32; - if (yych <= '=') goto yy103; - goto yy104; + if (yych <= '=') goto yy105; + goto yy106; } else { if (yych == '~') goto yy24; } yy32: -#line 43 "src/lexer.re" +#line 55 "src/lexer.re" { return rbs_next_token(lexer, pEQ); } @@ -520,14 +453,14 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { if (yych <= '<') goto yy34; if (yych <= '>') goto yy24; yy34: -#line 47 "src/lexer.re" +#line 59 "src/lexer.re" { return rbs_next_token(lexer, pGT); } #line 427 "src/lexer.c" yy35: rbs_skip(lexer); -#line 34 "src/lexer.re" +#line 46 "src/lexer.re" { return rbs_next_token(lexer, pQUESTION); } @@ -537,99 +470,100 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); - if (yych <= '_') { - if (yych <= '@') { + if (yych <= '`') { + if (yych <= 'Z') { if (yych <= '?') goto yy3; - goto yy105; + if (yych <= '@') goto yy107; + goto yy108; } else { - if (yych <= 'Z') goto yy106; - if (yych <= '^') goto yy3; - goto yy106; + if (yych == '_') goto yy108; + goto yy3; } } else { - if (yych <= 'q') { - if (yych <= '`') goto yy3; - goto yy106; + if (yych <= 'z') { + if (yych == 'r') goto yy111; + goto yy108; } else { - if (yych <= 'r') goto yy109; - if (yych <= 'z') goto yy106; - goto yy3; + if (yych <= 0x0000007F) goto yy3; + if (yych == 0x0000FFFD) goto yy3; + goto yy108; } } yy37: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy37; } else { - if (yych <= '9') goto yy37; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy37; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy38; - if (yych <= 'Z') goto yy37; + if (yych <= 'z') { + if (yych == '_') goto yy37; + if (yych >= 'a') goto yy37; } else { - if (yych == '`') goto yy38; - if (yych <= 'z') goto yy37; + if (yych <= 0x0000007F) goto yy38; + if (yych != 0x0000FFFD) goto yy37; } } yy38: -#line 137 "src/lexer.re" +#line 146 "src/lexer.re" { return rbs_next_token(lexer, tUIDENT); } -#line 479 "src/lexer.c" +#line 480 "src/lexer.c" yy39: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == ']') goto yy112; -#line 26 "src/lexer.re" + if (yych == ']') goto yy114; +#line 38 "src/lexer.re" { return rbs_next_token(lexer, pLBRACKET); } -#line 486 "src/lexer.c" +#line 487 "src/lexer.c" yy40: rbs_skip(lexer); -#line 27 "src/lexer.re" +#line 39 "src/lexer.re" { return rbs_next_token(lexer, pRBRACKET); } -#line 491 "src/lexer.c" +#line 492 "src/lexer.c" yy41: rbs_skip(lexer); -#line 32 "src/lexer.re" +#line 44 "src/lexer.re" { return rbs_next_token(lexer, pHAT); } -#line 496 "src/lexer.c" +#line 497 "src/lexer.c" yy42: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy115; } else { - if (yych <= '9') goto yy113; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy118; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy43; - if (yych <= 'Z') goto yy116; + if (yych <= 'z') { + if (yych == '_') goto yy120; + if (yych >= 'a') goto yy115; } else { - if (yych <= '_') goto yy118; - if (yych <= '`') goto yy43; - if (yych <= 'z') goto yy113; + if (yych <= 0x0000007F) goto yy43; + if (yych != 0x0000FFFD) goto yy68; } } yy43: -#line 140 "src/lexer.re" +#line 149 "src/lexer.re" { return rbs_next_token(lexer, tULLIDENT); } -#line 520 "src/lexer.c" +#line 521 "src/lexer.c" yy44: yyaccept = 4; rbs_skip(lexer); @@ -637,181 +571,208 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { yych = rbs_peek(lexer); if (yych <= ' ') { if (yych <= 0x00000000) goto yy45; - if (yych <= 0x0000001F) goto yy119; + if (yych <= 0x0000001F) goto yy121; } else { - if (yych != ':') goto yy119; + if (yych != ':') goto yy121; } yy45: -#line 39 "src/lexer.re" +#line 51 "src/lexer.re" { return rbs_next_token(lexer, tOPERATOR); } -#line 535 "src/lexer.c" +#line 536 "src/lexer.c" yy46: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= 'r') { - if (yych == 'l') goto yy120; + if (yych == 'l') goto yy122; goto yy54; } else { - if (yych <= 's') goto yy121; - if (yych <= 't') goto yy123; + if (yych <= 's') goto yy123; + if (yych <= 't') goto yy125; goto yy54; } yy47: -#line 136 "src/lexer.re" +#line 145 "src/lexer.re" { return rbs_next_token(lexer, tLIDENT); } -#line 550 "src/lexer.c" +#line 551 "src/lexer.c" yy48: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'o') goto yy124; + if (yych == 'o') goto yy126; goto yy54; yy49: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'l') goto yy125; + if (yych == 'l') goto yy127; goto yy54; yy50: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy126; + if (yych == 'e') goto yy128; goto yy54; yy51: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'n') goto yy127; - if (yych == 'x') goto yy128; + if (yych == 'n') goto yy129; + if (yych == 'x') goto yy130; goto yy54; yy52: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy129; + if (yych == 'a') goto yy131; goto yy54; yy53: rbs_skip(lexer); yych = rbs_peek(lexer); yy54: - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; - goto yy47; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych <= '/') goto yy47; + goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych <= '<') goto yy47; - goto yy111; + if (yych == '=') goto yy113; + if (yych <= '@') goto yy47; + goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy47; - if (yych <= 'Z') goto yy53; - goto yy47; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych <= '`') goto yy47; + goto yy53; } else { - if (yych == '`') goto yy47; - if (yych <= 'z') goto yy53; - goto yy47; + if (yych <= 0x0000007F) goto yy47; + if (yych == 0x0000FFFD) goto yy47; + goto yy53; } } yy55: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'n') goto yy130; + if (yych == 'n') goto yy132; goto yy54; yy56: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'o') goto yy132; + if (yych == 'o') goto yy134; goto yy54; yy57: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'i') goto yy133; + if (yych == 'i') goto yy135; goto yy54; yy58: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'u') goto yy134; + if (yych == 'u') goto yy136; goto yy54; yy59: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'r') goto yy135; - if (yych == 'u') goto yy136; + if (yych == 'r') goto yy137; + if (yych == 'u') goto yy138; goto yy54; yy60: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy137; + if (yych == 'e') goto yy139; goto yy54; yy61: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= 'h') { - if (yych == 'e') goto yy138; + if (yych == 'e') goto yy140; goto yy54; } else { - if (yych <= 'i') goto yy139; - if (yych == 'k') goto yy140; + if (yych <= 'i') goto yy141; + if (yych == 'k') goto yy142; goto yy54; } yy62: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= 'q') { - if (yych == 'o') goto yy141; + if (yych == 'o') goto yy143; goto yy54; } else { - if (yych <= 'r') goto yy142; - if (yych == 'y') goto yy143; + if (yych <= 'r') goto yy144; + if (yych == 'y') goto yy145; goto yy54; } yy63: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'n') goto yy144; - if (yych == 's') goto yy145; + if (yych == 'n') goto yy146; + if (yych == 's') goto yy147; goto yy54; yy64: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'o') goto yy146; + if (yych == 'o') goto yy148; goto yy54; yy65: rbs_skip(lexer); -#line 28 "src/lexer.re" +#line 40 "src/lexer.re" { return rbs_next_token(lexer, pLBRACE); } -#line 669 "src/lexer.c" +#line 671 "src/lexer.c" yy66: rbs_skip(lexer); -#line 31 "src/lexer.re" +#line 43 "src/lexer.re" { return rbs_next_token(lexer, pBAR); } -#line 674 "src/lexer.c" +#line 676 "src/lexer.c" yy67: rbs_skip(lexer); -#line 29 "src/lexer.re" +#line 41 "src/lexer.re" { return rbs_next_token(lexer, pRBRACE); } -#line 679 "src/lexer.c" +#line 681 "src/lexer.c" yy68: rbs_skip(lexer); yych = rbs_peek(lexer); + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy68; + } else { + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy68; + } + } else { + if (yych <= 'z') { + if (yych == '_') goto yy68; + if (yych >= 'a') goto yy68; + } else { + if (yych <= 0x0000007F) goto yy69; + if (yych != 0x0000FFFD) goto yy68; + } + } yy69: +#line 160 "src/lexer.re" + { + return rbs_next_token(lexer, tNONASCIIIDENT); + } +#line 705 "src/lexer.c" + yy70: + rbs_skip(lexer); + yych = rbs_peek(lexer); + yy71: if (yych <= '"') { - if (yych <= 0x00000000) goto yy70; - if (yych <= '!') goto yy68; - goto yy71; + if (yych <= 0x00000000) goto yy72; + if (yych <= '!') goto yy70; + goto yy73; } else { - if (yych == '\\') goto yy72; - goto yy68; + if (yych == '\\') goto yy74; + goto yy70; } - yy70: + yy72: *lexer = backup; if (yyaccept <= 4) { if (yyaccept <= 2) { @@ -829,2393 +790,2425 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { } } else { if (yyaccept <= 6) { - if (yyaccept == 5) goto yy80; + if (yyaccept == 5) goto yy82; else - goto yy162; + goto yy164; } else { - if (yyaccept == 7) goto yy262; + if (yyaccept == 7) goto yy258; else - goto yy290; + goto yy286; } } - yy71: + yy73: rbs_skip(lexer); -#line 114 "src/lexer.re" +#line 126 "src/lexer.re" { return rbs_next_token(lexer, tDQSTRING); } -#line 719 "src/lexer.c" - yy72: +#line 745 "src/lexer.c" + yy74: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'u') goto yy147; - if (yych == 'x') goto yy148; - goto yy68; - yy73: + if (yych == 'u') goto yy149; + if (yych == 'x') goto yy150; + goto yy70; + yy75: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= ',') { if (yych <= '\f') { - if (yych <= 0x00000000) goto yy74; - if (yych <= 0x00000008) goto yy73; - if (yych >= '\v') goto yy73; + if (yych <= 0x00000000) goto yy76; + if (yych <= 0x00000008) goto yy75; + if (yych >= '\v') goto yy75; } else { if (yych <= 0x0000001F) { - if (yych >= 0x0000000E) goto yy73; + if (yych >= 0x0000000E) goto yy75; } else { - if (yych == '#') goto yy73; + if (yych == '#') goto yy75; } } } else { if (yych <= '>') { - if (yych <= '-') goto yy73; - if (yych <= '/') goto yy74; - if (yych <= '9') goto yy73; + if (yych <= '-') goto yy75; + if (yych <= '/') goto yy76; + if (yych <= '9') goto yy75; } else { if (yych <= '^') { - if (yych <= 'Z') goto yy73; + if (yych <= 'Z') goto yy75; } else { - if (yych <= 'z') goto yy73; - if (yych >= 0x0000007F) goto yy73; + if (yych <= 'z') goto yy75; + if (yych >= 0x0000007F) goto yy75; } } } - yy74: -#line 147 "src/lexer.re" + yy76: +#line 170 "src/lexer.re" { return rbs_next_token(lexer, tGIDENT); } -#line 758 "src/lexer.c" - yy75: +#line 784 "src/lexer.c" + yy77: rbs_skip(lexer); - goto yy74; - yy76: + goto yy76; + yy78: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= 'Z') { if (yych <= '(') { - if (yych <= '\'') goto yy70; - goto yy149; + if (yych <= '\'') goto yy72; + goto yy151; } else { - if (yych == '<') goto yy150; - goto yy70; + if (yych == '<') goto yy152; + goto yy72; } } else { if (yych <= 'z') { - if (yych <= '[') goto yy151; - goto yy70; + if (yych <= '[') goto yy153; + goto yy72; } else { - if (yych <= '{') goto yy152; - if (yych <= '|') goto yy153; - goto yy70; + if (yych <= '{') goto yy154; + if (yych <= '|') goto yy155; + goto yy72; } } - yy77: + yy79: rbs_skip(lexer); yych = rbs_peek(lexer); - yy78: + yy80: if (yych <= '\'') { - if (yych <= 0x00000000) goto yy70; - if (yych <= '&') goto yy77; + if (yych <= 0x00000000) goto yy72; + if (yych <= '&') goto yy79; } else { - if (yych == '\\') goto yy81; - goto yy77; + if (yych == '\\') goto yy83; + goto yy79; } - yy79: + yy81: rbs_skip(lexer); - yy80: -#line 115 "src/lexer.re" + yy82: +#line 127 "src/lexer.re" { return rbs_next_token(lexer, tSQSTRING); } -#line 799 "src/lexer.c" - yy81: +#line 825 "src/lexer.c" + yy83: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '\'') { - if (yych <= 0x00000000) goto yy70; - if (yych <= '&') goto yy77; - goto yy154; + if (yych <= 0x00000000) goto yy72; + if (yych <= '&') goto yy79; + goto yy156; } else { - if (yych == '\\') goto yy81; - goto yy77; + if (yych == '\\') goto yy83; + goto yy79; } - yy82: + yy84: rbs_skip(lexer); -#line 36 "src/lexer.re" +#line 48 "src/lexer.re" { return rbs_next_token(lexer, pSTAR2); } -#line 815 "src/lexer.c" - yy83: +#line 841 "src/lexer.c" + yy85: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych >= 0x00000001) goto yy83; -#line 50 "src/lexer.re" + if (yych >= 0x00000001) goto yy85; +#line 62 "src/lexer.re" { return rbs_next_token(lexer, tINLINECOMMENT); } -#line 822 "src/lexer.c" - yy84: +#line 848 "src/lexer.c" + yy86: rbs_skip(lexer); -#line 41 "src/lexer.re" +#line 53 "src/lexer.re" { return rbs_next_token(lexer, pARROW); } -#line 827 "src/lexer.c" - yy85: +#line 853 "src/lexer.c" + yy87: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == '.') goto yy155; - goto yy70; - yy86: + if (yych == '.') goto yy157; + goto yy72; + yy88: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == '=') goto yy90; - if (yych == '~') goto yy90; - yy87: -#line 134 "src/lexer.re" + if (yych == '=') goto yy92; + if (yych == '~') goto yy92; + yy89: +#line 143 "src/lexer.re" { return rbs_next_token(lexer, tSYMBOL); } -#line 841 "src/lexer.c" - yy88: +#line 867 "src/lexer.c" + yy90: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '"') { - if (yych <= 0x00000000) goto yy70; - if (yych <= '!') goto yy88; - goto yy156; + if (yych <= 0x00000000) goto yy72; + if (yych <= '!') goto yy90; + goto yy158; } else { - if (yych == '\\') goto yy157; - goto yy88; + if (yych == '\\') goto yy159; + goto yy90; } - yy89: + yy91: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= ')') { if (yych <= 0x0000001F) { if (yych <= '\n') { - if (yych <= 0x00000000) goto yy70; - if (yych <= 0x00000008) goto yy158; - goto yy70; + if (yych <= 0x00000000) goto yy72; + if (yych <= 0x00000008) goto yy160; + goto yy72; } else { - if (yych == '\r') goto yy70; - goto yy158; + if (yych == '\r') goto yy72; + goto yy160; } } else { if (yych <= '#') { - if (yych <= ' ') goto yy70; - if (yych <= '"') goto yy160; - goto yy158; + if (yych <= ' ') goto yy72; + if (yych <= '"') goto yy162; + goto yy160; } else { - if (yych == '%') goto yy70; - if (yych <= '\'') goto yy160; - goto yy70; + if (yych == '%') goto yy72; + if (yych <= '\'') goto yy162; + goto yy72; } } } else { if (yych <= 'Z') { if (yych <= '/') { - if (yych == '-') goto yy158; - goto yy160; + if (yych == '-') goto yy160; + goto yy162; } else { - if (yych <= '9') goto yy158; - if (yych <= '>') goto yy160; - goto yy158; + if (yych <= '9') goto yy160; + if (yych <= '>') goto yy162; + goto yy160; } } else { if (yych <= '^') { - if (yych == '\\') goto yy160; - goto yy70; + if (yych == '\\') goto yy162; + goto yy72; } else { - if (yych <= 'z') goto yy158; - if (yych <= '}') goto yy70; - if (yych <= '~') goto yy160; - goto yy158; + if (yych <= 'z') goto yy160; + if (yych <= '}') goto yy72; + if (yych <= '~') goto yy162; + goto yy160; } } } - yy90: + yy92: rbs_skip(lexer); - goto yy87; - yy91: + goto yy89; + yy93: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '\'') { - if (yych <= 0x00000000) goto yy70; - if (yych <= '&') goto yy91; - goto yy161; + if (yych <= 0x00000000) goto yy72; + if (yych <= '&') goto yy93; + goto yy163; } else { - if (yych == '\\') goto yy163; - goto yy91; + if (yych == '\\') goto yy165; + goto yy93; } - yy92: + yy94: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == '*') goto yy90; - goto yy87; - yy93: + if (yych == '*') goto yy92; + goto yy89; + yy95: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == '@') goto yy90; - goto yy87; - yy94: + if (yych == '@') goto yy92; + goto yy89; + yy96: rbs_skip(lexer); -#line 45 "src/lexer.re" +#line 57 "src/lexer.re" { return rbs_next_token(lexer, pCOLON2); } -#line 927 "src/lexer.c" - yy95: +#line 953 "src/lexer.c" + yy97: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= ';') goto yy87; - if (yych <= '<') goto yy90; - if (yych <= '=') goto yy164; - goto yy87; - yy96: + if (yych <= ';') goto yy89; + if (yych <= '<') goto yy92; + if (yych <= '=') goto yy166; + goto yy89; + yy98: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == '=') goto yy165; - if (yych == '~') goto yy90; - goto yy70; - yy97: + if (yych == '=') goto yy167; + if (yych == '~') goto yy92; + goto yy72; + yy99: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '<') goto yy87; - if (yych <= '>') goto yy90; - goto yy87; - yy98: + if (yych <= '<') goto yy89; + if (yych <= '>') goto yy92; + goto yy89; + yy100: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '^') { - if (yych <= '?') goto yy70; - if (yych <= '@') goto yy166; - if (yych <= 'Z') goto yy167; - goto yy70; + if (yych <= '_') { + if (yych <= '@') { + if (yych <= '?') goto yy72; + goto yy168; + } else { + if (yych <= 'Z') goto yy101; + if (yych <= '^') goto yy72; + } } else { - if (yych == '`') goto yy70; - if (yych <= 'z') goto yy167; - goto yy70; + if (yych <= 0x0000007F) { + if (yych <= '`') goto yy72; + if (yych >= '{') goto yy72; + } else { + if (yych == 0x0000FFFD) goto yy72; + } } - yy99: + yy101: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '>') { - if (yych <= '/') { + if (yych <= '@') { + if (yych <= '9') { if (yych == '!') goto yy169; + if (yych >= '0') goto yy101; } else { - if (yych <= '9') goto yy99; - if (yych == '=') goto yy169; + if (yych <= '=') { + if (yych >= '=') goto yy169; + } else { + if (yych == '?') goto yy169; + } } } else { - if (yych <= '^') { - if (yych <= '?') goto yy169; - if (yych <= '@') goto yy100; - if (yych <= 'Z') goto yy99; + if (yych <= '`') { + if (yych <= 'Z') goto yy101; + if (yych == '_') goto yy101; } else { - if (yych == '`') goto yy100; - if (yych <= 'z') goto yy99; + if (yych <= 0x0000007F) { + if (yych <= 'z') goto yy101; + } else { + if (yych != 0x0000FFFD) goto yy101; + } } } - yy100: -#line 130 "src/lexer.re" + yy102: +#line 141 "src/lexer.re" { return rbs_next_token(lexer, tSYMBOL); } -#line 983 "src/lexer.c" - yy101: +#line 1021 "src/lexer.c" + yy103: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == ']') goto yy165; - goto yy70; - yy102: + if (yych == ']') goto yy167; + goto yy72; + yy104: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == '>') goto yy24; goto yy8; - yy103: + yy105: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == '=') goto yy24; goto yy8; - yy104: + yy106: rbs_skip(lexer); -#line 42 "src/lexer.re" +#line 54 "src/lexer.re" { return rbs_next_token(lexer, pFATARROW); } -#line 1003 "src/lexer.c" - yy105: +#line 1041 "src/lexer.c" + yy107: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '^') { - if (yych <= '@') goto yy70; - if (yych <= 'Z') goto yy170; - goto yy70; + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy72; + goto yy170; + } else { + if (yych == '_') goto yy170; + goto yy72; + } } else { - if (yych == '`') goto yy70; - if (yych <= 'z') goto yy170; - goto yy70; + if (yych <= 0x0000007F) { + if (yych <= 'z') goto yy170; + goto yy72; + } else { + if (yych == 0x0000FFFD) goto yy72; + goto yy170; + } } - yy106: + yy108: rbs_skip(lexer); yych = rbs_peek(lexer); - yy107: - if (yych <= 'Z') { - if (yych <= '/') goto yy108; - if (yych <= '9') goto yy106; - if (yych >= 'A') goto yy106; + yy109: + if (yych <= '_') { + if (yych <= '@') { + if (yych <= '/') goto yy110; + if (yych <= '9') goto yy108; + } else { + if (yych <= 'Z') goto yy108; + if (yych >= '_') goto yy108; + } } else { - if (yych <= '_') { - if (yych >= '_') goto yy106; + if (yych <= 0x0000007F) { + if (yych <= '`') goto yy110; + if (yych <= 'z') goto yy108; } else { - if (yych <= '`') goto yy108; - if (yych <= 'z') goto yy106; + if (yych != 0x0000FFFD) goto yy108; } } - yy108: -#line 144 "src/lexer.re" + yy110: +#line 167 "src/lexer.re" { return rbs_next_token(lexer, tAIDENT); } -#line 1035 "src/lexer.c" - yy109: +#line 1085 "src/lexer.c" + yy111: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'b') goto yy172; - goto yy107; - yy110: + goto yy109; + yy112: rbs_skip(lexer); -#line 141 "src/lexer.re" +#line 164 "src/lexer.re" { return rbs_next_token(lexer, tBANGIDENT); } -#line 1045 "src/lexer.c" - yy111: +#line 1095 "src/lexer.c" + yy113: rbs_skip(lexer); -#line 142 "src/lexer.re" +#line 165 "src/lexer.re" { return rbs_next_token(lexer, tEQIDENT); } -#line 1050 "src/lexer.c" - yy112: +#line 1100 "src/lexer.c" + yy114: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == '=') goto yy24; -#line 48 "src/lexer.re" +#line 60 "src/lexer.re" { return rbs_next_token(lexer, pAREF_OPR); } -#line 1057 "src/lexer.c" - yy113: +#line 1107 "src/lexer.c" + yy115: rbs_skip(lexer); yych = rbs_peek(lexer); - yy114: - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + yy116: + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy115; } else { - if (yych <= '9') goto yy113; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy115; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy115; - if (yych <= 'Z') goto yy113; + if (yych <= 'z') { + if (yych == '_') goto yy115; + if (yych >= 'a') goto yy115; } else { - if (yych == '`') goto yy115; - if (yych <= 'z') goto yy113; + if (yych <= 0x0000007F) goto yy117; + if (yych != 0x0000FFFD) goto yy115; } } - yy115: -#line 138 "src/lexer.re" + yy117: +#line 147 "src/lexer.re" { return rbs_next_token(lexer, tULLIDENT); } -#line 1081 "src/lexer.c" - yy116: +#line 1132 "src/lexer.c" + yy118: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy118; } else { - if (yych <= '9') goto yy116; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy118; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy117; - if (yych <= 'Z') goto yy116; + if (yych <= 'z') { + if (yych == '_') goto yy118; + if (yych >= 'a') goto yy118; } else { - if (yych == '`') goto yy117; - if (yych <= 'z') goto yy116; + if (yych <= 0x0000007F) goto yy119; + if (yych != 0x0000FFFD) goto yy118; } } - yy117: -#line 139 "src/lexer.re" + yy119: +#line 148 "src/lexer.re" { return rbs_next_token(lexer, tULIDENT); } -#line 1104 "src/lexer.c" - yy118: +#line 1156 "src/lexer.c" + yy120: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 't') goto yy173; - goto yy114; - yy119: + goto yy116; + yy121: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= 0x00000000) goto yy70; + if (yych <= 0x00000000) goto yy72; if (yych == '`') goto yy174; - goto yy119; - yy120: + goto yy121; + yy122: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'i') goto yy175; goto yy54; - yy121: + yy123: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy122; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy122; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy124; + if (yych != 0x0000FFFD) goto yy53; } } - yy122: -#line 101 "src/lexer.re" + yy124: +#line 113 "src/lexer.re" { return rbs_next_token(lexer, kAS); } -#line 1143 "src/lexer.c" - yy123: +#line 1196 "src/lexer.c" + yy125: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 't') goto yy176; goto yy54; - yy124: + yy126: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'o') goto yy177; if (yych == 't') goto yy178; goto yy54; - yy125: + yy127: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'a') goto yy180; goto yy54; - yy126: + yy128: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'f') goto yy181; goto yy54; - yy127: + yy129: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'd') goto yy183; goto yy54; - yy128: + yy130: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 't') goto yy185; goto yy54; - yy129: + yy131: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'l') goto yy186; goto yy54; - yy130: + yy132: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '^') { - if (yych <= '9') { - if (yych == '!') goto yy110; - if (yych >= '0') goto yy53; + if (yych <= '_') { + if (yych <= '<') { + if (yych <= '!') { + if (yych >= '!') goto yy112; + } else { + if (yych <= '/') goto yy133; + if (yych <= '9') goto yy53; + } } else { - if (yych <= '=') { - if (yych >= '=') goto yy111; + if (yych <= '@') { + if (yych <= '=') goto yy113; } else { - if (yych <= '@') goto yy131; if (yych <= 'Z') goto yy53; + if (yych >= '_') goto yy53; } } } else { - if (yych <= 'c') { - if (yych == '`') goto yy131; - if (yych <= 'b') goto yy53; - goto yy187; - } else { - if (yych <= 's') { + if (yych <= 's') { + if (yych <= 'b') { + if (yych >= 'a') goto yy53; + } else { + if (yych <= 'c') goto yy187; if (yych <= 'r') goto yy53; goto yy188; - } else { + } + } else { + if (yych <= 0x0000007F) { if (yych <= 't') goto yy189; if (yych <= 'z') goto yy53; + } else { + if (yych != 0x0000FFFD) goto yy53; } } } - yy131: -#line 80 "src/lexer.re" + yy133: +#line 92 "src/lexer.re" { return rbs_next_token(lexer, kIN); } -#line 1213 "src/lexer.c" - yy132: +#line 1273 "src/lexer.c" + yy134: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'd') goto yy190; goto yy54; - yy133: + yy135: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'l') goto yy191; goto yy54; - yy134: + yy136: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 't') goto yy193; goto yy54; - yy135: + yy137: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'e') goto yy195; if (yych == 'i') goto yy196; goto yy54; - yy136: + yy138: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'b') goto yy197; goto yy54; - yy137: + yy139: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 't') goto yy198; goto yy54; - yy138: + yy140: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'l') goto yy199; goto yy54; - yy139: + yy141: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'n') goto yy200; goto yy54; - yy140: + yy142: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'i') goto yy201; goto yy54; - yy141: + yy143: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'p') goto yy202; goto yy54; - yy142: + yy144: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'u') goto yy204; goto yy54; - yy143: + yy145: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'p') goto yy205; goto yy54; - yy144: + yy146: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'c') goto yy206; if (yych == 't') goto yy207; goto yy54; - yy145: + yy147: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'e') goto yy208; goto yy54; - yy146: + yy148: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'i') goto yy210; goto yy54; - yy147: + yy149: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '@') { - if (yych <= '/') goto yy70; + if (yych <= '/') goto yy72; if (yych <= '9') goto yy211; - goto yy70; + goto yy72; } else { if (yych <= 'F') goto yy211; - if (yych <= '`') goto yy70; + if (yych <= '`') goto yy72; if (yych <= 'f') goto yy211; - goto yy70; + goto yy72; } - yy148: + yy150: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '/') goto yy70; - if (yych <= '9') goto yy68; - if (yych <= '`') goto yy70; - if (yych <= 'f') goto yy68; - goto yy70; - yy149: + if (yych <= '/') goto yy72; + if (yych <= '9') goto yy70; + if (yych <= '`') goto yy72; + if (yych <= 'f') goto yy70; + goto yy72; + yy151: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= 0x00000000) goto yy70; + if (yych <= 0x00000000) goto yy72; if (yych == ')') goto yy212; - goto yy149; - yy150: + goto yy151; + yy152: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= 0x00000000) goto yy70; + if (yych <= 0x00000000) goto yy72; if (yych == '>') goto yy213; - goto yy150; - yy151: + goto yy152; + yy153: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= 0x00000000) goto yy70; + if (yych <= 0x00000000) goto yy72; if (yych == ']') goto yy214; - goto yy151; - yy152: + goto yy153; + yy154: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= 0x00000000) goto yy70; + if (yych <= 0x00000000) goto yy72; if (yych == '}') goto yy215; - goto yy152; - yy153: + goto yy154; + yy155: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= 0x00000000) goto yy70; + if (yych <= 0x00000000) goto yy72; if (yych == '|') goto yy216; - goto yy153; - yy154: + goto yy155; + yy156: yyaccept = 5; rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); if (yych <= '\'') { - if (yych <= 0x00000000) goto yy80; - if (yych <= '&') goto yy77; - goto yy79; + if (yych <= 0x00000000) goto yy82; + if (yych <= '&') goto yy79; + goto yy81; } else { - if (yych == '\\') goto yy81; - goto yy77; + if (yych == '\\') goto yy83; + goto yy79; } - yy155: + yy157: rbs_skip(lexer); -#line 38 "src/lexer.re" +#line 50 "src/lexer.re" { return rbs_next_token(lexer, pDOT3); } -#line 1359 "src/lexer.c" - yy156: +#line 1419 "src/lexer.c" + yy158: rbs_skip(lexer); -#line 116 "src/lexer.re" +#line 128 "src/lexer.re" { return rbs_next_token(lexer, tDQSYMBOL); } -#line 1364 "src/lexer.c" - yy157: +#line 1424 "src/lexer.c" + yy159: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych == 'u') goto yy217; if (yych == 'x') goto yy218; - goto yy88; - yy158: + goto yy90; + yy160: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= ',') { if (yych <= '\f') { - if (yych <= 0x00000000) goto yy159; - if (yych <= 0x00000008) goto yy158; - if (yych >= '\v') goto yy158; + if (yych <= 0x00000000) goto yy161; + if (yych <= 0x00000008) goto yy160; + if (yych >= '\v') goto yy160; } else { if (yych <= 0x0000001F) { - if (yych >= 0x0000000E) goto yy158; + if (yych >= 0x0000000E) goto yy160; } else { - if (yych == '#') goto yy158; + if (yych == '#') goto yy160; } } } else { if (yych <= '>') { - if (yych <= '-') goto yy158; - if (yych <= '/') goto yy159; - if (yych <= '9') goto yy158; + if (yych <= '-') goto yy160; + if (yych <= '/') goto yy161; + if (yych <= '9') goto yy160; } else { if (yych <= '^') { - if (yych <= 'Z') goto yy158; + if (yych <= 'Z') goto yy160; } else { - if (yych <= 'z') goto yy158; - if (yych >= 0x0000007F) goto yy158; + if (yych <= 'z') goto yy160; + if (yych >= 0x0000007F) goto yy160; } } } - yy159: -#line 133 "src/lexer.re" + yy161: +#line 142 "src/lexer.re" { return rbs_next_token(lexer, tSYMBOL); } -#line 1403 "src/lexer.c" - yy160: +#line 1463 "src/lexer.c" + yy162: rbs_skip(lexer); - goto yy159; - yy161: + goto yy161; + yy163: rbs_skip(lexer); - yy162: -#line 117 "src/lexer.re" + yy164: +#line 129 "src/lexer.re" { return rbs_next_token(lexer, tSQSYMBOL); } -#line 1412 "src/lexer.c" - yy163: +#line 1472 "src/lexer.c" + yy165: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '\'') { - if (yych <= 0x00000000) goto yy70; - if (yych <= '&') goto yy91; + if (yych <= 0x00000000) goto yy72; + if (yych <= '&') goto yy93; goto yy219; } else { - if (yych == '\\') goto yy163; - goto yy91; + if (yych == '\\') goto yy165; + goto yy93; } - yy164: - rbs_skip(lexer); - yych = rbs_peek(lexer); - if (yych == '>') goto yy90; - goto yy87; - yy165: - rbs_skip(lexer); - yych = rbs_peek(lexer); - if (yych == '=') goto yy90; - goto yy87; yy166: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '^') { - if (yych <= '@') goto yy70; - if (yych <= 'Z') goto yy220; - goto yy70; - } else { - if (yych == '`') goto yy70; - if (yych <= 'z') goto yy220; - goto yy70; - } + if (yych == '>') goto yy92; + goto yy89; yy167: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '>') { - if (yych <= '/') { - if (yych == '!') goto yy222; + if (yych == '=') goto yy92; + goto yy89; + yy168: + rbs_skip(lexer); + yych = rbs_peek(lexer); + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy72; + goto yy101; } else { - if (yych <= '9') goto yy167; - if (yych == '=') goto yy222; + if (yych == '_') goto yy101; + goto yy72; } } else { - if (yych <= '^') { - if (yych <= '?') goto yy222; - if (yych <= '@') goto yy168; - if (yych <= 'Z') goto yy167; + if (yych <= 0x0000007F) { + if (yych <= 'z') goto yy101; + goto yy72; } else { - if (yych == '`') goto yy168; - if (yych <= 'z') goto yy167; + if (yych == 0x0000FFFD) goto yy72; + goto yy101; } } - yy168: -#line 131 "src/lexer.re" - { - return rbs_next_token(lexer, tSYMBOL); - } -#line 1469 "src/lexer.c" yy169: rbs_skip(lexer); - goto yy100; + goto yy102; yy170: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= 'Z') { - if (yych <= '/') goto yy171; - if (yych <= '9') goto yy170; - if (yych >= 'A') goto yy170; - } else { - if (yych <= '_') { - if (yych >= '_') goto yy170; + if (yych <= '_') { + if (yych <= '@') { + if (yych <= '/') goto yy171; + if (yych <= '9') goto yy170; } else { + if (yych <= 'Z') goto yy170; + if (yych >= '_') goto yy170; + } + } else { + if (yych <= 0x0000007F) { if (yych <= '`') goto yy171; if (yych <= 'z') goto yy170; + } else { + if (yych != 0x0000FFFD) goto yy170; } } yy171: -#line 145 "src/lexer.re" +#line 168 "src/lexer.re" { return rbs_next_token(lexer, tA2IDENT); } -#line 1491 "src/lexer.c" +#line 1539 "src/lexer.c" yy172: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 's') goto yy223; - goto yy107; + if (yych == 's') goto yy220; + goto yy109; yy173: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'o') goto yy225; - goto yy114; + if (yych == 'o') goto yy222; + goto yy116; yy174: rbs_skip(lexer); -#line 40 "src/lexer.re" +#line 52 "src/lexer.re" { return rbs_next_token(lexer, tQIDENT); } -#line 1506 "src/lexer.c" +#line 1554 "src/lexer.c" yy175: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy226; + if (yych == 'a') goto yy223; goto yy54; yy176: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'r') goto yy227; + if (yych == 'r') goto yy224; goto yy54; yy177: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'l') goto yy228; + if (yych == 'l') goto yy225; goto yy54; yy178: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy179; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy179; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy179; + if (yych != 0x0000FFFD) goto yy53; } } yy179: -#line 73 "src/lexer.re" +#line 85 "src/lexer.re" { return rbs_next_token(lexer, kBOT); } -#line 1544 "src/lexer.c" +#line 1593 "src/lexer.c" yy180: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 's') goto yy230; + if (yych == 's') goto yy227; goto yy54; yy181: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy182; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy182; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy182; + if (yych != 0x0000FFFD) goto yy53; } } yy182: -#line 76 "src/lexer.re" +#line 88 "src/lexer.re" { return rbs_next_token(lexer, kDEF); } -#line 1572 "src/lexer.c" +#line 1622 "src/lexer.c" yy183: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy184; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy184; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy184; + if (yych != 0x0000FFFD) goto yy53; } } yy184: -#line 77 "src/lexer.re" +#line 89 "src/lexer.re" { return rbs_next_token(lexer, kEND); } -#line 1595 "src/lexer.c" +#line 1646 "src/lexer.c" yy185: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy231; + if (yych == 'e') goto yy228; goto yy54; yy186: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 's') goto yy232; + if (yych == 's') goto yy229; goto yy54; yy187: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'l') goto yy233; + if (yych == 'l') goto yy230; goto yy54; yy188: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 't') goto yy234; + if (yych == 't') goto yy231; goto yy54; yy189: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy235; + if (yych == 'e') goto yy232; goto yy54; yy190: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'u') goto yy236; + if (yych == 'u') goto yy233; goto yy54; yy191: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy192; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy192; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy192; + if (yych != 0x0000FFFD) goto yy53; } } yy192: -#line 87 "src/lexer.re" +#line 99 "src/lexer.re" { return rbs_next_token(lexer, kNIL); } -#line 1648 "src/lexer.c" +#line 1700 "src/lexer.c" yy193: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy194; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy194; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy194; + if (yych != 0x0000FFFD) goto yy53; } } yy194: -#line 88 "src/lexer.re" +#line 100 "src/lexer.re" { return rbs_next_token(lexer, kOUT); } -#line 1671 "src/lexer.c" +#line 1724 "src/lexer.c" yy195: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'p') goto yy237; + if (yych == 'p') goto yy234; goto yy54; yy196: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'v') goto yy238; + if (yych == 'v') goto yy235; goto yy54; yy197: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'l') goto yy239; + if (yych == 'l') goto yy236; goto yy54; yy198: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'u') goto yy240; + if (yych == 'u') goto yy237; goto yy54; yy199: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'f') goto yy241; + if (yych == 'f') goto yy238; goto yy54; yy200: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'g') goto yy243; + if (yych == 'g') goto yy240; goto yy54; yy201: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'p') goto yy244; + if (yych == 'p') goto yy241; goto yy54; yy202: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy203; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy203; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy203; + if (yych != 0x0000FFFD) goto yy53; } } yy203: -#line 94 "src/lexer.re" +#line 106 "src/lexer.re" { return rbs_next_token(lexer, kTOP); } -#line 1729 "src/lexer.c" +#line 1783 "src/lexer.c" yy204: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy246; + if (yych == 'e') goto yy243; goto yy54; yy205: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy248; + if (yych == 'e') goto yy245; goto yy54; yy206: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'h') goto yy250; + if (yych == 'h') goto yy247; goto yy54; yy207: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'y') goto yy251; + if (yych == 'y') goto yy248; goto yy54; yy208: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy209; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy209; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy209; + if (yych != 0x0000FFFD) goto yy53; } } yy209: -#line 100 "src/lexer.re" +#line 112 "src/lexer.re" { return rbs_next_token(lexer, kUSE); } -#line 1772 "src/lexer.c" +#line 1827 "src/lexer.c" yy210: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'd') goto yy252; + if (yych == 'd') goto yy249; goto yy54; yy211: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '@') { - if (yych <= '/') goto yy70; - if (yych <= '9') goto yy254; - goto yy70; + if (yych <= '/') goto yy72; + if (yych <= '9') goto yy251; + goto yy72; } else { - if (yych <= 'F') goto yy254; - if (yych <= '`') goto yy70; - if (yych <= 'f') goto yy254; - goto yy70; + if (yych <= 'F') goto yy251; + if (yych <= '`') goto yy72; + if (yych <= 'f') goto yy251; + goto yy72; } yy212: rbs_skip(lexer); -#line 56 "src/lexer.re" +#line 68 "src/lexer.re" { return rbs_next_token(lexer, tANNOTATION); } -#line 1795 "src/lexer.c" +#line 1850 "src/lexer.c" yy213: rbs_skip(lexer); -#line 59 "src/lexer.re" +#line 71 "src/lexer.re" { return rbs_next_token(lexer, tANNOTATION); } -#line 1800 "src/lexer.c" +#line 1855 "src/lexer.c" yy214: rbs_skip(lexer); -#line 57 "src/lexer.re" +#line 69 "src/lexer.re" { return rbs_next_token(lexer, tANNOTATION); } -#line 1805 "src/lexer.c" +#line 1860 "src/lexer.c" yy215: rbs_skip(lexer); -#line 55 "src/lexer.re" +#line 67 "src/lexer.re" { return rbs_next_token(lexer, tANNOTATION); } -#line 1810 "src/lexer.c" +#line 1865 "src/lexer.c" yy216: rbs_skip(lexer); -#line 58 "src/lexer.re" +#line 70 "src/lexer.re" { return rbs_next_token(lexer, tANNOTATION); } -#line 1815 "src/lexer.c" +#line 1870 "src/lexer.c" yy217: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '@') { - if (yych <= '/') goto yy70; - if (yych <= '9') goto yy255; - goto yy70; + if (yych <= '/') goto yy72; + if (yych <= '9') goto yy252; + goto yy72; } else { - if (yych <= 'F') goto yy255; - if (yych <= '`') goto yy70; - if (yych <= 'f') goto yy255; - goto yy70; + if (yych <= 'F') goto yy252; + if (yych <= '`') goto yy72; + if (yych <= 'f') goto yy252; + goto yy72; } yy218: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '/') goto yy70; - if (yych <= '9') goto yy88; - if (yych <= '`') goto yy70; - if (yych <= 'f') goto yy88; - goto yy70; + if (yych <= '/') goto yy72; + if (yych <= '9') goto yy90; + if (yych <= '`') goto yy72; + if (yych <= 'f') goto yy90; + goto yy72; yy219: yyaccept = 6; rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); if (yych <= '\'') { - if (yych <= 0x00000000) goto yy162; - if (yych <= '&') goto yy91; - goto yy161; + if (yych <= 0x00000000) goto yy164; + if (yych <= '&') goto yy93; + goto yy163; } else { - if (yych == '\\') goto yy163; - goto yy91; + if (yych == '\\') goto yy165; + goto yy93; } yy220: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '>') { - if (yych <= '/') { - if (yych == '!') goto yy256; + if (yych <= '_') { + if (yych <= '@') { + if (yych <= '/') goto yy221; + if (yych <= '9') goto yy108; } else { - if (yych <= '9') goto yy220; - if (yych == '=') goto yy256; + if (yych <= 'Z') goto yy108; + if (yych >= '_') goto yy108; } } else { - if (yych <= '^') { - if (yych <= '?') goto yy256; - if (yych <= '@') goto yy221; - if (yych <= 'Z') goto yy220; + if (yych <= 0x0000007F) { + if (yych <= '`') goto yy221; + if (yych <= 'z') goto yy108; } else { - if (yych == '`') goto yy221; - if (yych <= 'z') goto yy220; + if (yych != 0x0000FFFD) goto yy108; } } yy221: -#line 132 "src/lexer.re" - { - return rbs_next_token(lexer, tSYMBOL); - } -#line 1873 "src/lexer.c" - yy222: - rbs_skip(lexer); - goto yy168; - yy223: - rbs_skip(lexer); - yych = rbs_peek(lexer); - if (yych <= 'Z') { - if (yych <= '/') goto yy224; - if (yych <= '9') goto yy106; - if (yych >= 'A') goto yy106; - } else { - if (yych <= '_') { - if (yych >= '_') goto yy106; - } else { - if (yych <= '`') goto yy224; - if (yych <= 'z') goto yy106; - } - } - yy224: -#line 103 "src/lexer.re" +#line 115 "src/lexer.re" { return rbs_next_token(lexer, kATRBS); } -#line 1895 "src/lexer.c" - yy225: +#line 1927 "src/lexer.c" + yy222: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'd') goto yy257; - goto yy114; - yy226: + if (yych == 'd') goto yy253; + goto yy116; + yy223: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 's') goto yy258; + if (yych == 's') goto yy254; goto yy54; - yy227: + yy224: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == '_') goto yy260; + if (yych == '_') goto yy256; goto yy54; - yy228: + yy225: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy229; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy229; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy226; + if (yych != 0x0000FFFD) goto yy53; } } - yy229: -#line 72 "src/lexer.re" + yy226: +#line 84 "src/lexer.re" { return rbs_next_token(lexer, kBOOL); } -#line 1933 "src/lexer.c" - yy230: +#line 1966 "src/lexer.c" + yy227: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 's') goto yy261; + if (yych == 's') goto yy257; goto yy54; - yy231: + yy228: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'n') goto yy263; + if (yych == 'n') goto yy259; goto yy54; - yy232: + yy229: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy264; + if (yych == 'e') goto yy260; goto yy54; - yy233: + yy230: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'u') goto yy266; + if (yych == 'u') goto yy262; goto yy54; - yy234: + yy231: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy267; + if (yych == 'a') goto yy263; goto yy54; - yy235: + yy232: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'r') goto yy268; + if (yych == 'r') goto yy264; goto yy54; - yy236: + yy233: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'l') goto yy269; + if (yych == 'l') goto yy265; goto yy54; - yy237: + yy234: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy270; + if (yych == 'e') goto yy266; goto yy54; - yy238: + yy235: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy271; + if (yych == 'a') goto yy267; goto yy54; - yy239: + yy236: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'i') goto yy272; + if (yych == 'i') goto yy268; goto yy54; - yy240: + yy237: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'r') goto yy273; + if (yych == 'r') goto yy269; goto yy54; - yy241: + yy238: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy242; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy242; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy239; + if (yych != 0x0000FFFD) goto yy53; } } - yy242: -#line 92 "src/lexer.re" + yy239: +#line 104 "src/lexer.re" { return rbs_next_token(lexer, kSELF); } -#line 2011 "src/lexer.c" - yy243: +#line 2045 "src/lexer.c" + yy240: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'l') goto yy274; + if (yych == 'l') goto yy270; goto yy54; - yy244: + yy241: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy245; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy245; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy242; + if (yych != 0x0000FFFD) goto yy53; } } - yy245: -#line 104 "src/lexer.re" + yy242: +#line 116 "src/lexer.re" { return rbs_next_token(lexer, kSKIP); } -#line 2039 "src/lexer.c" - yy246: +#line 2074 "src/lexer.c" + yy243: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy247; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy247; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy244; + if (yych != 0x0000FFFD) goto yy53; } } - yy247: -#line 95 "src/lexer.re" + yy244: +#line 107 "src/lexer.re" { return rbs_next_token(lexer, kTRUE); } -#line 2062 "src/lexer.c" - yy248: +#line 2098 "src/lexer.c" + yy245: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy249; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy249; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy246; + if (yych != 0x0000FFFD) goto yy53; } } - yy249: -#line 96 "src/lexer.re" + yy246: +#line 108 "src/lexer.re" { return rbs_next_token(lexer, kTYPE); } -#line 2085 "src/lexer.c" - yy250: +#line 2122 "src/lexer.c" + yy247: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy275; + if (yych == 'e') goto yy271; goto yy54; - yy251: + yy248: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'p') goto yy276; + if (yych == 'p') goto yy272; goto yy54; - yy252: + yy249: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy253; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy253; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy250; + if (yych != 0x0000FFFD) goto yy53; } } - yy253: -#line 99 "src/lexer.re" + yy250: +#line 111 "src/lexer.re" { return rbs_next_token(lexer, kVOID); } -#line 2118 "src/lexer.c" - yy254: +#line 2156 "src/lexer.c" + yy251: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '@') { - if (yych <= '/') goto yy70; - if (yych <= '9') goto yy277; - goto yy70; + if (yych <= '/') goto yy72; + if (yych <= '9') goto yy273; + goto yy72; } else { - if (yych <= 'F') goto yy277; - if (yych <= '`') goto yy70; - if (yych <= 'f') goto yy277; - goto yy70; + if (yych <= 'F') goto yy273; + if (yych <= '`') goto yy72; + if (yych <= 'f') goto yy273; + goto yy72; } - yy255: + yy252: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '@') { - if (yych <= '/') goto yy70; - if (yych <= '9') goto yy278; - goto yy70; + if (yych <= '/') goto yy72; + if (yych <= '9') goto yy274; + goto yy72; } else { - if (yych <= 'F') goto yy278; - if (yych <= '`') goto yy70; - if (yych <= 'f') goto yy278; - goto yy70; + if (yych <= 'F') goto yy274; + if (yych <= '`') goto yy72; + if (yych <= 'f') goto yy274; + goto yy72; } - yy256: - rbs_skip(lexer); - goto yy221; - yy257: + yy253: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'o') goto yy279; - goto yy114; - yy258: + if (yych == 'o') goto yy275; + goto yy116; + yy254: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy259; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy259; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy255; + if (yych != 0x0000FFFD) goto yy53; } } - yy259: -#line 68 "src/lexer.re" + yy255: +#line 80 "src/lexer.re" { return rbs_next_token(lexer, kALIAS); } -#line 2175 "src/lexer.c" - yy260: +#line 2211 "src/lexer.c" + yy256: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= 'q') { - if (yych == 'a') goto yy280; + if (yych == 'a') goto yy276; goto yy54; } else { - if (yych <= 'r') goto yy281; - if (yych == 'w') goto yy282; + if (yych <= 'r') goto yy277; + if (yych == 'w') goto yy278; goto yy54; } - yy261: + yy257: yyaccept = 7; rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); - if (yych <= '<') { - if (yych <= ',') { - if (yych == '!') goto yy110; + if (yych <= '@') { + if (yych <= '-') { + if (yych == '!') goto yy112; + if (yych >= '-') goto yy279; } else { - if (yych <= '-') goto yy283; - if (yych <= '/') goto yy262; - if (yych <= '9') goto yy53; + if (yych <= '9') { + if (yych >= '0') goto yy53; + } else { + if (yych == '=') goto yy113; + } } } else { - if (yych <= '^') { - if (yych <= '=') goto yy111; - if (yych <= '@') goto yy262; + if (yych <= '`') { if (yych <= 'Z') goto yy53; + if (yych == '_') goto yy53; } else { - if (yych == '`') goto yy262; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) { + if (yych <= 'z') goto yy53; + } else { + if (yych != 0x0000FFFD) goto yy53; + } } } - yy262: -#line 74 "src/lexer.re" + yy258: +#line 86 "src/lexer.re" { return rbs_next_token(lexer, kCLASS); } -#line 2213 "src/lexer.c" - yy263: +#line 2254 "src/lexer.c" + yy259: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'd') goto yy284; + if (yych == 'd') goto yy280; goto yy54; - yy264: + yy260: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy265; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy265; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy261; + if (yych != 0x0000FFFD) goto yy53; } } - yy265: -#line 79 "src/lexer.re" + yy261: +#line 91 "src/lexer.re" { return rbs_next_token(lexer, kFALSE); } -#line 2241 "src/lexer.c" - yy266: +#line 2283 "src/lexer.c" + yy262: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'd') goto yy286; + if (yych == 'd') goto yy282; goto yy54; - yy267: + yy263: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'n') goto yy287; + if (yych == 'n') goto yy283; goto yy54; - yy268: + yy264: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'f') goto yy288; + if (yych == 'f') goto yy284; goto yy54; - yy269: + yy265: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy289; + if (yych == 'e') goto yy285; goto yy54; - yy270: + yy266: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'n') goto yy291; + if (yych == 'n') goto yy287; goto yy54; - yy271: + yy267: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 't') goto yy292; + if (yych == 't') goto yy288; goto yy54; - yy272: + yy268: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'c') goto yy293; + if (yych == 'c') goto yy289; goto yy54; - yy273: + yy269: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'n') goto yy295; + if (yych == 'n') goto yy291; goto yy54; - yy274: + yy270: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy297; + if (yych == 'e') goto yy293; goto yy54; - yy275: + yy271: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'c') goto yy298; + if (yych == 'c') goto yy294; goto yy54; - yy276: + yy272: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy299; + if (yych == 'e') goto yy295; goto yy54; - yy277: + yy273: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '@') { - if (yych <= '/') goto yy70; - if (yych <= '9') goto yy68; - goto yy70; + if (yych <= '/') goto yy72; + if (yych <= '9') goto yy70; + goto yy72; } else { - if (yych <= 'F') goto yy68; - if (yych <= '`') goto yy70; - if (yych <= 'f') goto yy68; - goto yy70; + if (yych <= 'F') goto yy70; + if (yych <= '`') goto yy72; + if (yych <= 'f') goto yy70; + goto yy72; } - yy278: + yy274: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '@') { - if (yych <= '/') goto yy70; - if (yych <= '9') goto yy300; - goto yy70; + if (yych <= '/') goto yy72; + if (yych <= '9') goto yy296; + goto yy72; } else { - if (yych <= 'F') goto yy300; - if (yych <= '`') goto yy70; - if (yych <= 'f') goto yy300; - goto yy70; + if (yych <= 'F') goto yy296; + if (yych <= '`') goto yy72; + if (yych <= 'f') goto yy296; + goto yy72; } - yy279: + yy275: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == '_') goto yy301; - goto yy114; - yy280: + if (yych == '_') goto yy297; + goto yy116; + yy276: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'c') goto yy302; + if (yych == 'c') goto yy298; goto yy54; - yy281: + yy277: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy303; + if (yych == 'e') goto yy299; goto yy54; - yy282: + yy278: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'r') goto yy304; + if (yych == 'r') goto yy300; goto yy54; - yy283: + yy279: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy305; - goto yy70; - yy284: + if (yych == 'a') goto yy301; + goto yy72; + yy280: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy285; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy285; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy281; + if (yych != 0x0000FFFD) goto yy53; } } - yy285: -#line 78 "src/lexer.re" + yy281: +#line 90 "src/lexer.re" { return rbs_next_token(lexer, kEXTEND); } -#line 2370 "src/lexer.c" - yy286: +#line 2413 "src/lexer.c" + yy282: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy306; + if (yych == 'e') goto yy302; goto yy54; - yy287: + yy283: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'c') goto yy308; + if (yych == 'c') goto yy304; goto yy54; - yy288: + yy284: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy309; + if (yych == 'a') goto yy305; goto yy54; - yy289: + yy285: yyaccept = 8; rbs_skip(lexer); backup = *lexer; yych = rbs_peek(lexer); - if (yych <= '<') { - if (yych <= ',') { - if (yych == '!') goto yy110; + if (yych <= '@') { + if (yych <= '-') { + if (yych == '!') goto yy112; + if (yych >= '-') goto yy306; } else { - if (yych <= '-') goto yy310; - if (yych <= '/') goto yy290; - if (yych <= '9') goto yy53; + if (yych <= '9') { + if (yych >= '0') goto yy53; + } else { + if (yych == '=') goto yy113; + } } } else { - if (yych <= '^') { - if (yych <= '=') goto yy111; - if (yych <= '@') goto yy290; + if (yych <= '`') { if (yych <= 'Z') goto yy53; + if (yych == '_') goto yy53; } else { - if (yych == '`') goto yy290; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) { + if (yych <= 'z') goto yy53; + } else { + if (yych != 0x0000FFFD) goto yy53; + } } } - yy290: -#line 84 "src/lexer.re" + yy286: +#line 96 "src/lexer.re" { return rbs_next_token(lexer, kMODULE); } -#line 2412 "src/lexer.c" - yy291: +#line 2460 "src/lexer.c" + yy287: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'd') goto yy311; + if (yych == 'd') goto yy307; goto yy54; - yy292: + yy288: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy313; + if (yych == 'e') goto yy309; goto yy54; - yy293: + yy289: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy294; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy294; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy290; + if (yych != 0x0000FFFD) goto yy53; } } - yy294: -#line 91 "src/lexer.re" + yy290: +#line 103 "src/lexer.re" { return rbs_next_token(lexer, kPUBLIC); } -#line 2445 "src/lexer.c" - yy295: +#line 2494 "src/lexer.c" + yy291: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy296; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy296; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy292; + if (yych != 0x0000FFFD) goto yy53; } } - yy296: -#line 105 "src/lexer.re" + yy292: +#line 117 "src/lexer.re" { return rbs_next_token(lexer, kRETURN); } -#line 2468 "src/lexer.c" - yy297: +#line 2518 "src/lexer.c" + yy293: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 't') goto yy315; + if (yych == 't') goto yy311; goto yy54; - yy298: + yy294: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'k') goto yy316; + if (yych == 'k') goto yy312; goto yy54; - yy299: + yy295: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'd') goto yy317; + if (yych == 'd') goto yy313; goto yy54; - yy300: + yy296: rbs_skip(lexer); yych = rbs_peek(lexer); if (yych <= '@') { - if (yych <= '/') goto yy70; - if (yych <= '9') goto yy88; - goto yy70; + if (yych <= '/') goto yy72; + if (yych <= '9') goto yy90; + goto yy72; } else { - if (yych <= 'F') goto yy88; - if (yych <= '`') goto yy70; - if (yych <= 'f') goto yy88; - goto yy70; + if (yych <= 'F') goto yy90; + if (yych <= '`') goto yy72; + if (yych <= 'f') goto yy90; + goto yy72; } - yy301: + yy297: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == '_') goto yy319; - goto yy114; - yy302: + if (yych == '_') goto yy315; + goto yy116; + yy298: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'c') goto yy321; + if (yych == 'c') goto yy317; goto yy54; - yy303: + yy299: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy322; + if (yych == 'a') goto yy318; goto yy54; - yy304: + yy300: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'i') goto yy323; + if (yych == 'i') goto yy319; goto yy54; - yy305: + yy301: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'l') goto yy324; - goto yy70; - yy306: + if (yych == 'l') goto yy320; + goto yy72; + yy302: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy307; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy307; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy303; + if (yych != 0x0000FFFD) goto yy53; } } - yy307: -#line 81 "src/lexer.re" + yy303: +#line 93 "src/lexer.re" { return rbs_next_token(lexer, kINCLUDE); } -#line 2544 "src/lexer.c" - yy308: +#line 2595 "src/lexer.c" + yy304: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy325; + if (yych == 'e') goto yy321; goto yy54; - yy309: + yy305: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'c') goto yy327; + if (yych == 'c') goto yy323; goto yy54; - yy310: + yy306: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy328; - if (yych == 's') goto yy329; - goto yy70; - yy311: + if (yych == 'a') goto yy324; + if (yych == 's') goto yy325; + goto yy72; + yy307: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy312; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy312; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy308; + if (yych != 0x0000FFFD) goto yy53; } } - yy312: -#line 89 "src/lexer.re" + yy308: +#line 101 "src/lexer.re" { return rbs_next_token(lexer, kPREPEND); } -#line 2583 "src/lexer.c" - yy313: +#line 2635 "src/lexer.c" + yy309: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy314; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy314; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy310; + if (yych != 0x0000FFFD) goto yy53; } } - yy314: -#line 90 "src/lexer.re" + yy310: +#line 102 "src/lexer.re" { return rbs_next_token(lexer, kPRIVATE); } -#line 2606 "src/lexer.c" - yy315: +#line 2659 "src/lexer.c" + yy311: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'o') goto yy330; + if (yych == 'o') goto yy326; goto yy54; - yy316: + yy312: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy331; + if (yych == 'e') goto yy327; goto yy54; - yy317: + yy313: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy318; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy318; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy314; + if (yych != 0x0000FFFD) goto yy53; } } - yy318: -#line 98 "src/lexer.re" + yy314: +#line 110 "src/lexer.re" { return rbs_next_token(lexer, kUNTYPED); } -#line 2639 "src/lexer.c" - yy319: +#line 2693 "src/lexer.c" + yy315: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy115; } else { - if (yych <= '9') goto yy113; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy115; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy320; - if (yych <= 'Z') goto yy113; + if (yych <= 'z') { + if (yych == '_') goto yy115; + if (yych >= 'a') goto yy115; } else { - if (yych == '`') goto yy320; - if (yych <= 'z') goto yy113; + if (yych <= 0x0000007F) goto yy316; + if (yych != 0x0000FFFD) goto yy115; } } - yy320: -#line 102 "src/lexer.re" + yy316: +#line 114 "src/lexer.re" { return rbs_next_token(lexer, k__TODO__); } -#line 2662 "src/lexer.c" - yy321: +#line 2717 "src/lexer.c" + yy317: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy332; + if (yych == 'e') goto yy328; goto yy54; - yy322: + yy318: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'd') goto yy333; + if (yych == 'd') goto yy329; goto yy54; - yy323: + yy319: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 't') goto yy334; + if (yych == 't') goto yy330; goto yy54; - yy324: + yy320: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'i') goto yy335; - goto yy70; - yy325: + if (yych == 'i') goto yy331; + goto yy72; + yy321: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy326; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy326; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy322; + if (yych != 0x0000FFFD) goto yy53; } } - yy326: -#line 82 "src/lexer.re" + yy322: +#line 94 "src/lexer.re" { return rbs_next_token(lexer, kINSTANCE); } -#line 2705 "src/lexer.c" - yy327: +#line 2761 "src/lexer.c" + yy323: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy336; + if (yych == 'e') goto yy332; goto yy54; - yy328: + yy324: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'l') goto yy338; - goto yy70; - yy329: + if (yych == 'l') goto yy334; + goto yy72; + yy325: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy339; - goto yy70; - yy330: + if (yych == 'e') goto yy335; + goto yy72; + yy326: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'n') goto yy340; + if (yych == 'n') goto yy336; goto yy54; - yy331: + yy327: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'd') goto yy342; + if (yych == 'd') goto yy338; goto yy54; - yy332: + yy328: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 's') goto yy344; + if (yych == 's') goto yy340; goto yy54; - yy333: + yy329: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy345; + if (yych == 'e') goto yy341; goto yy54; - yy334: + yy330: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'e') goto yy346; + if (yych == 'e') goto yy342; goto yy54; - yy335: + yy331: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy347; - goto yy70; - yy336: + if (yych == 'a') goto yy343; + goto yy72; + yy332: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy337; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy337; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy333; + if (yych != 0x0000FFFD) goto yy53; } } - yy337: -#line 83 "src/lexer.re" + yy333: +#line 95 "src/lexer.re" { return rbs_next_token(lexer, kINTERFACE); } -#line 2773 "src/lexer.c" - yy338: +#line 2830 "src/lexer.c" + yy334: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'i') goto yy348; - goto yy70; - yy339: + if (yych == 'i') goto yy344; + goto yy72; + yy335: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'l') goto yy349; - goto yy70; - yy340: + if (yych == 'l') goto yy345; + goto yy72; + yy336: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy341; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy341; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy337; + if (yych != 0x0000FFFD) goto yy53; } } - yy341: -#line 93 "src/lexer.re" + yy337: +#line 105 "src/lexer.re" { return rbs_next_token(lexer, kSINGLETON); } -#line 2806 "src/lexer.c" - yy342: +#line 2864 "src/lexer.c" + yy338: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy343; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy343; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy339; + if (yych != 0x0000FFFD) goto yy53; } } - yy343: -#line 97 "src/lexer.re" + yy339: +#line 109 "src/lexer.re" { return rbs_next_token(lexer, kUNCHECKED); } -#line 2829 "src/lexer.c" - yy344: +#line 2888 "src/lexer.c" + yy340: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 's') goto yy350; + if (yych == 's') goto yy346; goto yy54; - yy345: + yy341: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'r') goto yy351; + if (yych == 'r') goto yy347; goto yy54; - yy346: + yy342: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'r') goto yy353; + if (yych == 'r') goto yy349; goto yy54; - yy347: + yy343: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 's') goto yy355; - goto yy70; - yy348: + if (yych == 's') goto yy351; + goto yy72; + yy344: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'a') goto yy356; - goto yy70; - yy349: + if (yych == 'a') goto yy352; + goto yy72; + yy345: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'f') goto yy357; - goto yy70; - yy350: + if (yych == 'f') goto yy353; + goto yy72; + yy346: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'o') goto yy358; + if (yych == 'o') goto yy354; goto yy54; - yy351: + yy347: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy352; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy352; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy348; + if (yych != 0x0000FFFD) goto yy53; } } - yy352: -#line 70 "src/lexer.re" + yy348: +#line 82 "src/lexer.re" { return rbs_next_token(lexer, kATTRREADER); } -#line 2887 "src/lexer.c" - yy353: +#line 2947 "src/lexer.c" + yy349: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy354; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy354; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy350; + if (yych != 0x0000FFFD) goto yy53; } } - yy354: -#line 71 "src/lexer.re" + yy350: +#line 83 "src/lexer.re" { return rbs_next_token(lexer, kATTRWRITER); } -#line 2910 "src/lexer.c" - yy355: +#line 2971 "src/lexer.c" + yy351: rbs_skip(lexer); -#line 75 "src/lexer.re" +#line 87 "src/lexer.re" { return rbs_next_token(lexer, kCLASSALIAS); } -#line 2915 "src/lexer.c" - yy356: +#line 2976 "src/lexer.c" + yy352: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 's') goto yy359; - goto yy70; - yy357: + if (yych == 's') goto yy355; + goto yy72; + yy353: rbs_skip(lexer); -#line 86 "src/lexer.re" +#line 98 "src/lexer.re" { return rbs_next_token(lexer, kMODULESELF); } -#line 2925 "src/lexer.c" - yy358: +#line 2986 "src/lexer.c" + yy354: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych == 'r') goto yy360; + if (yych == 'r') goto yy356; goto yy54; - yy359: + yy355: rbs_skip(lexer); -#line 85 "src/lexer.re" +#line 97 "src/lexer.re" { return rbs_next_token(lexer, kMODULEALIAS); } -#line 2935 "src/lexer.c" - yy360: +#line 2996 "src/lexer.c" + yy356: rbs_skip(lexer); yych = rbs_peek(lexer); - if (yych <= '=') { - if (yych <= '/') { - if (yych == '!') goto yy110; + if (yych <= 'Z') { + if (yych <= '9') { + if (yych == '!') goto yy112; + if (yych >= '0') goto yy53; } else { - if (yych <= '9') goto yy53; - if (yych >= '=') goto yy111; + if (yych == '=') goto yy113; + if (yych >= 'A') goto yy53; } } else { - if (yych <= '^') { - if (yych <= '@') goto yy361; - if (yych <= 'Z') goto yy53; + if (yych <= 'z') { + if (yych == '_') goto yy53; + if (yych >= 'a') goto yy53; } else { - if (yych == '`') goto yy361; - if (yych <= 'z') goto yy53; + if (yych <= 0x0000007F) goto yy357; + if (yych != 0x0000FFFD) goto yy53; } } - yy361: -#line 69 "src/lexer.re" + yy357: +#line 81 "src/lexer.re" { return rbs_next_token(lexer, kATTRACCESSOR); } -#line 2958 "src/lexer.c" +#line 3020 "src/lexer.c" } -#line 154 "src/lexer.re" +#line 177 "src/lexer.re" } diff --git a/src/lexer.re b/src/lexer.re index cab3b62799..18980eacd1 100644 --- a/src/lexer.re +++ b/src/lexer.re @@ -16,7 +16,19 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { re2c:define:YYRESTORE = "*lexer = backup;"; re2c:yyfill:enable = 0; - word = [a-zA-Z0-9_]; + // Ruby's rule for what an identifier is made of is `ISALNUM(c) || + // (c) == '_' || !ISASCII(c)`, so define the class by what it leaves + // out: every ASCII character that is not a word character, and the + // sentinel `rbs_next_char` reports for a byte that is invalid under + // the active encoding. Everything else can appear in an identifier, + // which is how a non-ASCII character gets in. + ident_char = . \ ([\x00-\x7F] \ [a-zA-Z0-9_]) \ [\uFFFD]; + + // An ASCII digit cannot lead an identifier, but a non-ASCII one can -- + // Ruby accepts a name made of full-width digits. Since `rbs_next_char` + // never reports a non-ASCII character as `[0-9]`, subtracting the ASCII + // digits from `ident_char` is the whole of that rule. + ident_start = ident_char \ [0-9]; operator = "/" | "~" | "[]=" | "!" | "!=" | "!~" | "-" | "-@" | "+" | "+@" | "==" | "===" | "=~" | "<<" | "<=" | "<=>" | ">" | ">=" | ">>" | "%"; @@ -116,7 +128,6 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { ":" dqstring { return rbs_next_token(lexer, tDQSYMBOL); } ":" sqstring { return rbs_next_token(lexer, tSQSYMBOL); } - identifier = [a-zA-Z_] word* [!?=]?; symbol_opr = ":|" | ":&" | ":/" | ":%" | ":~" | ":`" | ":^" | ":==" | ":=~" | ":===" | ":!" | ":!=" | ":!~" | ":<" | ":<=" | ":<<" | ":<=>" | ":>" | ":>=" | ":>>" @@ -127,22 +138,34 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) { | [~*$?!@\\/;,.=:<>"&'`+] | [^ \t\r\n:;=.,!"$%&()-+~|\\'[\]{}*/<>^\x00]+; - ":" identifier { return rbs_next_token(lexer, tSYMBOL); } - ":@" identifier { return rbs_next_token(lexer, tSYMBOL); } - ":@@" identifier { return rbs_next_token(lexer, tSYMBOL); } - ":$" global_ident { return rbs_next_token(lexer, tSYMBOL); } - symbol_opr { return rbs_next_token(lexer, tSYMBOL); } - - [a-z] word* { return rbs_next_token(lexer, tLIDENT); } - [A-Z] word* { return rbs_next_token(lexer, tUIDENT); } - "_" [a-z0-9_] word* { return rbs_next_token(lexer, tULLIDENT); } - "_" [A-Z] word* { return rbs_next_token(lexer, tULIDENT); } - "_" { return rbs_next_token(lexer, tULLIDENT); } - [a-zA-Z_] word* "!" { return rbs_next_token(lexer, tBANGIDENT); } - [a-zA-Z_] word* "=" { return rbs_next_token(lexer, tEQIDENT); } - - "@" [a-zA-Z_] word* { return rbs_next_token(lexer, tAIDENT); } - "@@" [a-zA-Z_] word* { return rbs_next_token(lexer, tA2IDENT); } + ":" "@"{0,2} ident_start ident_char* [!?=]? { return rbs_next_token(lexer, tSYMBOL); } + ":$" global_ident { return rbs_next_token(lexer, tSYMBOL); } + symbol_opr { return rbs_next_token(lexer, tSYMBOL); } + + [a-z] ident_char* { return rbs_next_token(lexer, tLIDENT); } + [A-Z] ident_char* { return rbs_next_token(lexer, tUIDENT); } + "_" [a-z0-9_] ident_char* { return rbs_next_token(lexer, tULLIDENT); } + "_" [A-Z] ident_char* { return rbs_next_token(lexer, tULIDENT); } + "_" { return rbs_next_token(lexer, tULLIDENT); } + + // Every ASCII spelling is covered by one of the rules above, which match + // exactly as far, and re2c settles a tie of equal length in favour of the + // rule written first. So this one is left with the names that open with a + // character outside ASCII. + // + // RBS reads the case of that character to tell a class name from an alias + // name, and outside ASCII there is no reading of it that both the lexer + // and `TypeName#kind` can agree on. Those names get a token of their own + // and the parser takes it only where the question does not come up. + ident_start ident_char* { return rbs_next_token(lexer, tNONASCIIIDENT); } + + // None of these four needs to know the case of the first character, so + // widening the leading position to `ident_start` is all they need. + ident_start ident_char* "!" { return rbs_next_token(lexer, tBANGIDENT); } + ident_start ident_char* "=" { return rbs_next_token(lexer, tEQIDENT); } + + "@" ident_start ident_char* { return rbs_next_token(lexer, tAIDENT); } + "@@" ident_start ident_char* { return rbs_next_token(lexer, tA2IDENT); } "$" global_ident { return rbs_next_token(lexer, tGIDENT); } diff --git a/src/lexstate.c b/src/lexstate.c index fb9f718b35..79f2757170 100644 --- a/src/lexstate.c +++ b/src/lexstate.c @@ -74,6 +74,7 @@ static const char *RBS_TOKENTYPE_NAMES[] = { "tUIDENT", /* Identifiers starting with upper case */ "tULIDENT", /* Identifiers starting with `_` */ "tULLIDENT", + "tNONASCIIIDENT", "tGIDENT", /* Identifiers starting with `$` */ "tAIDENT", /* Identifiers starting with `@` */ "tA2IDENT", /* Identifiers starting with `@@` */ diff --git a/src/parser.c b/src/parser.c index 7be16b9f06..1690a22205 100644 --- a/src/parser.c +++ b/src/parser.c @@ -337,6 +337,7 @@ static bool is_keyword_token(enum RBSTokenType type) { case tUIDENT: case tULIDENT: case tULLIDENT: + case tNONASCIIIDENT: case tQIDENT: case tBANGIDENT: KEYWORD_CASES @@ -346,6 +347,15 @@ static bool is_keyword_token(enum RBSTokenType type) { } } +/** + * Ruby lets a local variable name open with a character outside ASCII, and a + * parameter name is a local variable name. Nothing here reads the case of that + * character, so both spellings are a name. + * */ +static bool is_param_name_token(enum RBSTokenType type) { + return type == tLIDENT || type == tNONASCIIIDENT; +} + /* function_param ::= {} | {} type @@ -664,6 +674,7 @@ static bool parse_params(rbs_parser_t *parser, method_params *params, bool forwa case tQIDENT: case tULIDENT: case tULLIDENT: + case tNONASCIIIDENT: case tBANGIDENT: KEYWORD_CASES if (is_keyword(parser)) { @@ -1841,6 +1852,7 @@ static bool parse_method_name(rbs_parser_t *parser, rbs_range_t *range, rbs_ast_ case tLIDENT: case tULIDENT: case tULLIDENT: + case tNONASCIIIDENT: KEYWORD_CASES if (parser->next_token.type == pQUESTION && parser->current_token.range.end.byte_pos == parser->next_token.range.start.byte_pos) { range->start = parser->current_token.range.start; @@ -3951,6 +3963,7 @@ static bool parse_inline_leading_annotation(rbs_parser_t *parser, rbs_ast_ruby_a return true; } case tLIDENT: + case tNONASCIIIDENT: PARAM_NAME_CASES { return parse_inline_param_type_annotation(parser, annotation, rbs_range); } @@ -3959,7 +3972,7 @@ static bool parse_inline_leading_annotation(rbs_parser_t *parser, rbs_ast_ruby_a rbs_location_range star_loc = rbs_location_range_current_token(parser); rbs_location_range name_loc = RBS_LOCATION_NULL_RANGE; - if (parser->next_token.type == tLIDENT) { + if (is_param_name_token(parser->next_token.type)) { rbs_parser_advance(parser); name_loc = rbs_location_range_current_token(parser); } @@ -3999,7 +4012,7 @@ static bool parse_inline_leading_annotation(rbs_parser_t *parser, rbs_ast_ruby_a rbs_location_range star2_loc = rbs_location_range_current_token(parser); rbs_location_range name_loc = RBS_LOCATION_NULL_RANGE; - if (parser->next_token.type == tLIDENT) { + if (is_param_name_token(parser->next_token.type)) { rbs_parser_advance(parser); name_loc = rbs_location_range_current_token(parser); } @@ -4039,7 +4052,7 @@ static bool parse_inline_leading_annotation(rbs_parser_t *parser, rbs_ast_ruby_a rbs_location_range ampersand_loc = rbs_location_range_current_token(parser); rbs_location_range name_loc = RBS_LOCATION_NULL_RANGE; - if (parser->next_token.type == tLIDENT) { + if (is_param_name_token(parser->next_token.type)) { rbs_parser_advance(parser); name_loc = rbs_location_range_current_token(parser); } diff --git a/src/util/rbs_encoding.c b/src/util/rbs_encoding.c index 1756519934..b960b633c9 100644 --- a/src/util/rbs_encoding.c +++ b/src/util/rbs_encoding.c @@ -5,7 +5,7 @@ typedef uint32_t rbs_unicode_codepoint_t; -#define UNICODE_ALPHA_CODEPOINTS_LENGTH 1450 +#define UNICODE_ALPHA_CODEPOINTS_LENGTH 1508 static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODEPOINTS_LENGTH] = { 0x100, 0x2C1, @@ -19,7 +19,7 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x2EE, 0x345, 0x345, - 0x370, + 0x363, 0x374, 0x376, 0x377, @@ -100,7 +100,9 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x870, 0x887, 0x889, - 0x88E, + 0x88F, + 0x897, + 0x897, 0x8A0, 0x8C9, 0x8D4, @@ -279,7 +281,7 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0xC56, 0xC58, 0xC5A, - 0xC5D, + 0xC5C, 0xC5D, 0xC60, 0xC63, @@ -303,7 +305,7 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0xCCC, 0xCD5, 0xCD6, - 0xCDD, + 0xCDC, 0xCDE, 0xCE0, 0xCE3, @@ -528,7 +530,7 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x1C5A, 0x1C7D, 0x1C80, - 0x1C88, + 0x1C8A, 0x1C90, 0x1CBA, 0x1CBD, @@ -543,7 +545,7 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x1CFA, 0x1D00, 0x1DBF, - 0x1DE7, + 0x1DD3, 0x1DF4, 0x1E00, 0x1F15, @@ -704,14 +706,8 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0xA722, 0xA788, 0xA78B, - 0xA7CA, - 0xA7D0, - 0xA7D1, - 0xA7D3, - 0xA7D3, - 0xA7D5, - 0xA7D9, - 0xA7F2, + 0xA7DC, + 0xA7F1, 0xA805, 0xA807, 0xA827, @@ -891,6 +887,8 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x105B9, 0x105BB, 0x105BC, + 0x105C0, + 0x105F3, 0x10600, 0x10736, 0x10740, @@ -927,6 +925,8 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x10915, 0x10920, 0x10939, + 0x10940, + 0x10959, 0x10980, 0x109B7, 0x109BE, @@ -965,12 +965,22 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x10CF2, 0x10D00, 0x10D27, + 0x10D4A, + 0x10D65, + 0x10D69, + 0x10D69, + 0x10D6F, + 0x10D85, 0x10E80, 0x10EA9, 0x10EAB, 0x10EAC, 0x10EB0, 0x10EB1, + 0x10EC2, + 0x10EC7, + 0x10EFA, + 0x10EFC, 0x10F00, 0x10F1C, 0x10F27, @@ -1057,6 +1067,28 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x11357, 0x1135D, 0x11363, + 0x11380, + 0x11389, + 0x1138B, + 0x1138B, + 0x1138E, + 0x1138E, + 0x11390, + 0x113B5, + 0x113B7, + 0x113C0, + 0x113C2, + 0x113C2, + 0x113C5, + 0x113C5, + 0x113C7, + 0x113CA, + 0x113CC, + 0x113CD, + 0x113D1, + 0x113D1, + 0x113D3, + 0x113D3, 0x11400, 0x11441, 0x11443, @@ -1133,6 +1165,10 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x11A9D, 0x11AB0, 0x11AF8, + 0x11B60, + 0x11B67, + 0x11BC0, + 0x11BE0, 0x11C00, 0x11C08, 0x11C0A, @@ -1175,6 +1211,8 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x11D96, 0x11D98, 0x11D98, + 0x11DB0, + 0x11DDB, 0x11EE0, 0x11EF6, 0x11F00, @@ -1197,8 +1235,12 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x1342F, 0x13441, 0x13446, + 0x13460, + 0x143FA, 0x14400, 0x14646, + 0x16100, + 0x1612E, 0x16800, 0x16A38, 0x16A40, @@ -1215,8 +1257,14 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x16B77, 0x16B7D, 0x16B8F, + 0x16D40, + 0x16D6C, 0x16E40, 0x16E7F, + 0x16EA0, + 0x16EB8, + 0x16EBB, + 0x16ED3, 0x16F00, 0x16F4A, 0x16F4F, @@ -1228,13 +1276,13 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x16FE3, 0x16FE3, 0x16FF0, - 0x16FF1, + 0x16FF6, 0x17000, - 0x187F7, - 0x18800, 0x18CD5, - 0x18D00, - 0x18D08, + 0x18CFF, + 0x18D1E, + 0x18D80, + 0x18DF2, 0x1AFF0, 0x1AFF3, 0x1AFF5, @@ -1353,6 +1401,16 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x1E2EB, 0x1E4D0, 0x1E4EB, + 0x1E5D0, + 0x1E5ED, + 0x1E5F0, + 0x1E5F0, + 0x1E6C0, + 0x1E6DE, + 0x1E6E0, + 0x1E6F5, + 0x1E6FE, + 0x1E6FF, 0x1E7E0, 0x1E7E6, 0x1E7E8, @@ -1444,22 +1502,22 @@ static const rbs_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODE 0x20000, 0x2A6DF, 0x2A700, - 0x2B739, - 0x2B740, 0x2B81D, 0x2B820, - 0x2CEA1, + 0x2CEAD, 0x2CEB0, 0x2EBE0, + 0x2EBF0, + 0x2EE5D, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, 0x31350, - 0x323AF, + 0x33479, }; -#define UNICODE_ALNUM_CODEPOINTS_LENGTH 1528 +#define UNICODE_ALNUM_CODEPOINTS_LENGTH 1598 static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODEPOINTS_LENGTH] = { 0x100, 0x2C1, @@ -1473,7 +1531,7 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x2EE, 0x345, 0x345, - 0x370, + 0x363, 0x374, 0x376, 0x377, @@ -1552,7 +1610,9 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x870, 0x887, 0x889, - 0x88E, + 0x88F, + 0x897, + 0x897, 0x8A0, 0x8C9, 0x8D4, @@ -1739,7 +1799,7 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0xC56, 0xC58, 0xC5A, - 0xC5D, + 0xC5C, 0xC5D, 0xC60, 0xC63, @@ -1765,7 +1825,7 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0xCCC, 0xCD5, 0xCD6, - 0xCDD, + 0xCDC, 0xCDE, 0xCE0, 0xCE3, @@ -2010,7 +2070,7 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x1C4D, 0x1C7D, 0x1C80, - 0x1C88, + 0x1C8A, 0x1C90, 0x1CBA, 0x1CBD, @@ -2025,7 +2085,7 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x1CFA, 0x1D00, 0x1DBF, - 0x1DE7, + 0x1DD3, 0x1DF4, 0x1E00, 0x1F15, @@ -2184,14 +2244,8 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0xA722, 0xA788, 0xA78B, - 0xA7CA, - 0xA7D0, - 0xA7D1, - 0xA7D3, - 0xA7D3, - 0xA7D5, - 0xA7D9, - 0xA7F2, + 0xA7DC, + 0xA7F1, 0xA805, 0xA807, 0xA827, @@ -2377,6 +2431,8 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x105B9, 0x105BB, 0x105BC, + 0x105C0, + 0x105F3, 0x10600, 0x10736, 0x10740, @@ -2413,6 +2469,8 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x10915, 0x10920, 0x10939, + 0x10940, + 0x10959, 0x10980, 0x109B7, 0x109BE, @@ -2453,12 +2511,22 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x10D27, 0x10D30, 0x10D39, + 0x10D40, + 0x10D65, + 0x10D69, + 0x10D69, + 0x10D6F, + 0x10D85, 0x10E80, 0x10EA9, 0x10EAB, 0x10EAC, 0x10EB0, 0x10EB1, + 0x10EC2, + 0x10EC7, + 0x10EFA, + 0x10EFC, 0x10F00, 0x10F1C, 0x10F27, @@ -2551,6 +2619,28 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x11357, 0x1135D, 0x11363, + 0x11380, + 0x11389, + 0x1138B, + 0x1138B, + 0x1138E, + 0x1138E, + 0x11390, + 0x113B5, + 0x113B7, + 0x113C0, + 0x113C2, + 0x113C2, + 0x113C5, + 0x113C5, + 0x113C7, + 0x113CA, + 0x113CC, + 0x113CD, + 0x113D1, + 0x113D1, + 0x113D3, + 0x113D3, 0x11400, 0x11441, 0x11443, @@ -2589,6 +2679,8 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x116B8, 0x116C0, 0x116C9, + 0x116D0, + 0x116E3, 0x11700, 0x1171A, 0x1171D, @@ -2639,6 +2731,12 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x11A9D, 0x11AB0, 0x11AF8, + 0x11B60, + 0x11B67, + 0x11BC0, + 0x11BE0, + 0x11BF0, + 0x11BF9, 0x11C00, 0x11C08, 0x11C0A, @@ -2687,6 +2785,10 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x11D98, 0x11DA0, 0x11DA9, + 0x11DB0, + 0x11DDB, + 0x11DE0, + 0x11DE9, 0x11EE0, 0x11EF6, 0x11F00, @@ -2711,8 +2813,14 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x1342F, 0x13441, 0x13446, + 0x13460, + 0x143FA, 0x14400, 0x14646, + 0x16100, + 0x1612E, + 0x16130, + 0x16139, 0x16800, 0x16A38, 0x16A40, @@ -2735,8 +2843,16 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x16B77, 0x16B7D, 0x16B8F, + 0x16D40, + 0x16D6C, + 0x16D70, + 0x16D79, 0x16E40, 0x16E7F, + 0x16EA0, + 0x16EB8, + 0x16EBB, + 0x16ED3, 0x16F00, 0x16F4A, 0x16F4F, @@ -2748,13 +2864,13 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x16FE3, 0x16FE3, 0x16FF0, - 0x16FF1, + 0x16FF6, 0x17000, - 0x187F7, - 0x18800, 0x18CD5, - 0x18D00, - 0x18D08, + 0x18CFF, + 0x18D1E, + 0x18D80, + 0x18DF2, 0x1AFF0, 0x1AFF3, 0x1AFF5, @@ -2783,6 +2899,8 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x1BC99, 0x1BC9E, 0x1BC9E, + 0x1CCF0, + 0x1CCF9, 0x1D400, 0x1D454, 0x1D456, @@ -2881,6 +2999,16 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x1E4EB, 0x1E4F0, 0x1E4F9, + 0x1E5D0, + 0x1E5ED, + 0x1E5F0, + 0x1E5FA, + 0x1E6C0, + 0x1E6DE, + 0x1E6E0, + 0x1E6F5, + 0x1E6FE, + 0x1E6FF, 0x1E7E0, 0x1E7E6, 0x1E7E8, @@ -2976,22 +3104,22 @@ static const rbs_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODE 0x20000, 0x2A6DF, 0x2A700, - 0x2B739, - 0x2B740, 0x2B81D, 0x2B820, - 0x2CEA1, + 0x2CEAD, 0x2CEB0, 0x2EBE0, + 0x2EBF0, + 0x2EE5D, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, 0x31350, - 0x323AF, + 0x33479, }; -#define UNICODE_ISUPPER_CODEPOINTS_LENGTH 1302 +#define UNICODE_ISUPPER_CODEPOINTS_LENGTH 1320 static const rbs_unicode_codepoint_t unicode_isupper_codepoints[UNICODE_ISUPPER_CODEPOINTS_LENGTH] = { 0x100, 0x100, @@ -3539,6 +3667,8 @@ static const rbs_unicode_codepoint_t unicode_isupper_codepoints[UNICODE_ISUPPER_ 0x10CD, 0x13A0, 0x13F5, + 0x1C89, + 0x1C89, 0x1C90, 0x1CBA, 0x1CBD, @@ -4197,12 +4327,24 @@ static const rbs_unicode_codepoint_t unicode_isupper_codepoints[UNICODE_ISUPPER_ 0xA7C7, 0xA7C9, 0xA7C9, + 0xA7CB, + 0xA7CC, + 0xA7CE, + 0xA7CE, 0xA7D0, 0xA7D0, + 0xA7D2, + 0xA7D2, + 0xA7D4, + 0xA7D4, 0xA7D6, 0xA7D6, 0xA7D8, 0xA7D8, + 0xA7DA, + 0xA7DA, + 0xA7DC, + 0xA7DC, 0xA7F5, 0xA7F5, 0xFF21, @@ -4221,10 +4363,14 @@ static const rbs_unicode_codepoint_t unicode_isupper_codepoints[UNICODE_ISUPPER_ 0x10595, 0x10C80, 0x10CB2, + 0x10D50, + 0x10D65, 0x118A0, 0x118BF, 0x16E40, 0x16E5F, + 0x16EA0, + 0x16EB8, 0x1D400, 0x1D419, 0x1D434, diff --git a/test/rbs/parser_test.rb b/test/rbs/parser_test.rb index f78a8597d8..f0e61e7e84 100644 --- a/test/rbs/parser_test.rb +++ b/test/rbs/parser_test.rb @@ -1065,6 +1065,119 @@ def test_invalid_utf8_byte_at_top_level_raises end end + def test_non_ascii_identifiers + RBS::Parser.parse_signature(buffer(<<~RBS)).tap do |_, _, decls| + class ServicioÚltimaVez + end + + module MiMódulo + MI_CONSTANTE_Ñ: Integer + def enviar_últimas_interacciones: () -> void + def 日本語: () -> void + def únicos!: () -> void + + def con_parametros: (Integer 引数, キーワード: String) -> void + + @日本語: Integer + @@クラス変数: Integer + + attr_reader nombre_único: String + end + RBS + + assert_equal RBS::TypeName.parse("ServicioÚltimaVez"), decls[0].name + assert_equal RBS::TypeName.parse("MiMódulo"), decls[1].name + + module_members = decls[1].members + assert_equal RBS::TypeName.parse("MI_CONSTANTE_Ñ"), module_members[0].name + assert_equal :enviar_últimas_interacciones, module_members[1].name + assert_equal :日本語, module_members[2].name + assert_equal :"únicos!", module_members[3].name + + function = module_members[4].overloads[0].method_type.type + assert_equal :引数, function.required_positionals[0].name + assert_equal :キーワード, function.required_keywords.keys[0] + + assert_equal :@日本語, module_members[5].name + assert_equal :@@クラス変数, module_members[6].name + assert_equal :nombre_único, module_members[7].name + end + + RBS::Parser.parse_signature(buffer(<<~RBS)).tap do |_, _, decls| + interface _Unicós + def foo: () -> void + end + + type nombre_único = Integer + + $グローバル: Integer + RBS + + assert_equal RBS::TypeName.parse("_Unicós"), decls[0].name + assert_equal RBS::TypeName.parse("nombre_único"), decls[1].name + assert_equal :$グローバル, decls[2].name + end + end + + def test_type_name_must_start_with_ascii + # RBS reads the case of the first character to tell a class name from an + # interface name from an alias name, and outside ASCII there is no reading + # of it that both the lexer and `TypeName#kind` can agree on. So the first + # character of a name in one of those positions has to be ASCII. Ruby asks + # for no such thing -- every one of these opens a constant or a local + # variable there -- and this is where RBS takes less than Ruby gives. + ["日本語", "Ωmega", "DžFoo"].each do |name| + [ + "class #{name}\nend\n", + "module #{name}\nend\n", + "interface _#{name}\nend\n", + "type #{name} = Integer\n", + "#{name}: Integer\n", + "class Foo[#{name}]\nend\n", + "class Foo\n def f: () -> #{name}\nend\n", + ].each do |source| + assert_raises(RBS::ParsingError, source) do + RBS::Parser.parse_signature(buffer(source)) + end + end + end + end + + def test_non_ascii_identifier_in_single_byte_encoding + # In ISO-8859-1 this is one byte: `A` with a grave accent is 0xC0. The rule + # is about the character being outside ASCII, not about it taking more than + # one byte, so a single-byte encoding reaches it the same way. + inside = "class Abc\xC0\nend\n".dup.force_encoding(Encoding::ISO_8859_1) + _, _, decls = RBS::Parser.parse_signature(buffer(inside)) + assert_equal "Abc\xC0".b, decls[0].name.name.to_s.b + + leading = "class \xC0bc\nend\n".dup.force_encoding(Encoding::ISO_8859_1) + assert_raises(RBS::ParsingError) do + RBS::Parser.parse_signature(buffer(leading)) + end + + method_name = "class Foo\n def \xC0bc: () -> void\nend\n".dup.force_encoding(Encoding::ISO_8859_1) + _, _, decls = RBS::Parser.parse_signature(buffer(method_name)) + assert_equal "\xC0bc".b, decls[0].members[0].name.to_s.b + end + + def test_high_byte_in_ascii_8bit_is_an_identifier + # Every byte is a character in ASCII-8BIT, and Ruby takes any non-ASCII one + # into an identifier: `\x80abc = 1` assigns a local variable there. None of + # those bytes is ASCII, so a name may not open with one. + source = "class \x80 end".dup.force_encoding(Encoding::ASCII_8BIT) + assert_equal :tNONASCIIIDENT, RBS::Parser.lex(source).value[2].type + + method_name = "class Foo\n def \x80abc: () -> void\nend\n".dup.force_encoding(Encoding::ASCII_8BIT) + _, _, decls = RBS::Parser.parse_signature(buffer(method_name)) + assert_equal "\x80abc".b, decls[0].members[0].name.to_s.b + + alias_decl = "type \x80abc = Integer\n".dup.force_encoding(Encoding::ASCII_8BIT) + assert_raises(RBS::ParsingError) do + RBS::Parser.parse_signature(buffer(alias_decl)) + end + end + def test_utf8_replacement_character_in_comment_parses # A genuine U+FFFD (REPLACEMENT CHARACTER) is a valid 3-byte UTF-8 sequence # ("\xEF\xBF\xBD") that decodes to the multibyte dummy code point, not the diff --git a/test/rbs/type_name_test.rb b/test/rbs/type_name_test.rb index 36f8703fb6..3ef933c827 100644 --- a/test/rbs/type_name_test.rb +++ b/test/rbs/type_name_test.rb @@ -52,4 +52,17 @@ def test_intern_preserves_kind_detection assert_equal :alias, aliased.kind assert_equal :interface, interface.kind end + + def test_kind_reads_only_the_leading_ascii_character + ns = Namespace.root + + # The parser never hands `kind` a name that opens outside ASCII, because a + # type name has to start with an ASCII character to be one. A name built by + # hand still can, and `kind` reads nothing there -- no Unicode table on this + # side, which is the whole point of that restriction. + assert_equal :class, TypeName[ns, :Foo日本語].kind + assert_equal :alias, TypeName[ns, :foo日本語].kind + assert_equal :interface, TypeName[ns, :_Foo日本語].kind + assert_equal :class, TypeName[ns, :日本語].kind + end end diff --git a/test/rbs/type_parsing_test.rb b/test/rbs/type_parsing_test.rb index d4da7c338d..9a95f146e8 100644 --- a/test/rbs/type_parsing_test.rb +++ b/test/rbs/type_parsing_test.rb @@ -1033,14 +1033,15 @@ def test_parse__byte_range_incorrect assert_equal "position range starts inside a character: #{start}...10", exn.message end - # Byte 5 opens `🐈`, so lexing starts exactly where it was asked to. This - # is the error the three positions above used to be silently rounded up - # to. + # Byte 5 opens `🐈`, so lexing starts exactly where it was asked to. The + # character is an identifier now, but a type name may not open outside + # ASCII, so this is still a syntax error -- reported against a real token + # rather than `ErrorToken`. We want better ergonomics here eventually. exn = assert_raises RBS::ParsingError do Parser.parse_type(input, byte_range: 5...) end - assert_equal "a.rbs:1:2...1:3: Syntax error: unexpected token for simple type, token=`🐈` (ErrorToken)", exn.message + assert_equal "a.rbs:1:2...1:3: Syntax error: unexpected token for simple type, token=`🐈` (tNONASCIIIDENT)", exn.message end def test_parse__byte_range_starting_past_the_end