/* Generated by re2c 1.1.1 on Wed Nov 28 21:13:09 2018 */ #line 1 "lexer.re" #include #include "lexer.hpp" #include "token.hpp" namespace SpasmImpl { namespace ASM { //! Namespace for all lexical analisys classes namespace Lexer { Lexer::Lexer(std::istream& _file, size_t _buffer_size) : file(&_file), buffer_size(_buffer_size), state(unsigned(-1)), lineno(0) { buffer = new char[buffer_size]; cursor = limit = marker = token_start = NULL; } Lexer::~Lexer() { delete[] buffer; } bool Lexer::tokenize(TokenStream& ts) { #line 43 "lexer.re" while (1) { #line 41 "lexer.cpp" { char yych; if ((limit - cursor) < 7) return true; yych = *cursor; switch (yych) { case 0x00: goto yy2; case '\n': goto yy6; case ' ': goto yy8; case '"': goto yy11; case '#': goto yy13; case '\'': goto yy15; case '-': goto yy17; case '0': goto yy18; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy20; case ':': goto yy22; 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 'b': case 'e': case 'f': case 'g': case 'h': case 'i': case 'k': case 'n': case 'o': case 'q': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy24; case 'a': goto yy27; case 'c': goto yy28; case 'd': goto yy29; case 'j': goto yy30; case 'l': goto yy31; case 'm': goto yy32; case 'p': goto yy33; case 'r': goto yy34; case 's': goto yy35; default: goto yy4; } yy2: ++cursor; #line 290 "lexer.re" { ts.push_token(Token(Token::EndInput, lineno)); break; } #line 128 "lexer.cpp" yy4: ++cursor; yy5: #line 296 "lexer.re" { return false; } #line 136 "lexer.cpp" yy6: ++cursor; #line 283 "lexer.re" { ++lineno; token_start = cursor; continue; } #line 146 "lexer.cpp" yy8: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case ' ': goto yy8; default: goto yy10; } yy10: #line 267 "lexer.re" { token_start = cursor; continue; } #line 162 "lexer.cpp" yy11: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case '"': goto yy36; case '\\': goto yy38; default: goto yy11; } yy13: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case '\n': goto yy40; default: goto yy13; } yy15: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case '\'': goto yy36; case '\\': goto yy42; default: goto yy15; } yy17: yych = *++cursor; switch (yych) { case '0': goto yy44; default: goto yy5; } yy18: yych = *(marker = ++cursor); switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': goto yy46; case 'X': case 'x': goto yy48; default: goto yy19; } yy19: #line 62 "lexer.re" { ts.push_token(Token(Token::Integer, lineno, token_start, cursor)); token_start = cursor; continue; } #line 222 "lexer.cpp" yy20: marker = ++cursor; if ((limit - cursor) < 2) return true; yych = *cursor; switch (yych) { case '.': goto yy49; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy20; case ':': goto yy22; default: goto yy19; } yy22: ++cursor; #line 272 "lexer.re" { token_start = cursor; continue; } #line 250 "lexer.cpp" yy24: ++cursor; if (limit <= cursor) return true; yych = *cursor; yy25: switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy26; } yy26: #line 252 "lexer.re" { ts.push_token(Token(Token::Ident, lineno, token_start, cursor)); token_start = cursor; continue; } #line 331 "lexer.cpp" yy27: yych = *++cursor; switch (yych) { case '0': goto yy50; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy52; case 'd': goto yy54; default: goto yy25; } yy28: yych = *++cursor; switch (yych) { case 'a': goto yy55; case 'o': goto yy56; default: goto yy25; } yy29: yych = *++cursor; switch (yych) { case 'i': goto yy57; case 'u': goto yy58; default: goto yy25; } yy30: yych = *++cursor; switch (yych) { case 'm': goto yy59; default: goto yy25; } yy31: yych = *++cursor; switch (yych) { case 'a': goto yy60; case 'e': goto yy61; default: goto yy25; } yy32: yych = *++cursor; switch (yych) { case 'o': goto yy62; case 'u': goto yy63; default: goto yy25; } yy33: yych = *++cursor; switch (yych) { case 'o': goto yy64; case 'r': goto yy65; case 'u': goto yy66; default: goto yy25; } yy34: yych = *++cursor; switch (yych) { case '0': goto yy67; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy69; case 'e': goto yy71; default: goto yy25; } yy35: yych = *++cursor; switch (yych) { case 't': goto yy72; case 'u': goto yy73; default: goto yy25; } yy36: ++cursor; #line 259 "lexer.re" { ts.push_token(Token(Token::StringValue, lineno, token_start + 1, cursor - 1)); token_start = cursor; continue; } #line 423 "lexer.cpp" yy38: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case '\\': goto yy38; default: goto yy11; } yy40: ++cursor; #line 277 "lexer.re" { ++lineno; token_start = cursor; continue; } #line 441 "lexer.cpp" yy42: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case '\\': goto yy42; default: goto yy15; } yy44: ++cursor; goto yy19; yy45: ++cursor; if (limit <= cursor) return true; yych = *cursor; yy46: switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy45; case ':': goto yy22; default: goto yy47; } yy47: cursor = marker; goto yy19; yy48: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy74; default: goto yy47; } yy49: yych = *++cursor; switch (yych) { case '0': goto yy77; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy79; default: goto yy47; } yy50: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy51; } yy51: #line 86 "lexer.re" { Token t(Token::Integer, lineno, token_start + 1, cursor); t.set_int(-t.value_int()); ts.push_token(t); token_start = cursor; continue; } #line 595 "lexer.cpp" yy52: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy52; 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 yy24; default: goto yy51; } yy54: yych = *++cursor; switch (yych) { case 'd': goto yy81; default: goto yy25; } yy55: yych = *++cursor; switch (yych) { case 'l': goto yy83; default: goto yy25; } yy56: yych = *++cursor; switch (yych) { case 'n': goto yy84; default: goto yy25; } yy57: yych = *++cursor; switch (yych) { case 'v': goto yy85; default: goto yy25; } yy58: yych = *++cursor; switch (yych) { case 'p': goto yy87; default: goto yy25; } yy59: yych = *++cursor; switch (yych) { case 'p': goto yy89; default: goto yy25; } yy60: yych = *++cursor; switch (yych) { case 'b': goto yy91; default: goto yy25; } yy61: yych = *++cursor; switch (yych) { case 'q': goto yy92; case 's': goto yy94; default: goto yy25; } yy62: yych = *++cursor; switch (yych) { case 'd': goto yy95; default: goto yy25; } yy63: yych = *++cursor; switch (yych) { case 'l': goto yy97; default: goto yy25; } yy64: yych = *++cursor; switch (yych) { case 'p': goto yy99; default: goto yy25; } yy65: yych = *++cursor; switch (yych) { case 'i': goto yy101; default: goto yy25; } yy66: yych = *++cursor; switch (yych) { case 's': goto yy102; default: goto yy25; } yy67: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy68; } yy68: #line 79 "lexer.re" { ts.push_token( Token(Token::Integer, lineno, token_start + 1, cursor)); token_start = cursor; continue; } #line 822 "lexer.cpp" yy69: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy69; 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 yy24; default: goto yy68; } yy71: yych = *++cursor; switch (yych) { case 'a': goto yy103; case 't': goto yy104; default: goto yy25; } yy72: yych = *++cursor; switch (yych) { case 'r': goto yy106; default: goto yy25; } yy73: yych = *++cursor; switch (yych) { case 'b': goto yy107; default: goto yy25; } yy74: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy74; default: goto yy76; } yy76: #line 95 "lexer.re" { ts.push_token(Token(Token::XInteger, lineno, token_start, cursor)); token_start = cursor; continue; } #line 950 "lexer.cpp" yy77: ++cursor; yy78: #line 70 "lexer.re" { ts.push_token( Token(Token::FloatingPoint, lineno, token_start, cursor)); token_start = cursor; continue; } #line 963 "lexer.cpp" yy79: ++cursor; if (limit <= cursor) return true; yych = *cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy79; default: goto yy78; } yy81: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy82; } yy82: #line 149 "lexer.re" { ts.push_token(Token(Token::Add, lineno)); token_start = cursor; continue; } #line 1057 "lexer.cpp" yy83: yych = *++cursor; switch (yych) { case 'l': goto yy109; default: goto yy25; } yy84: yych = *++cursor; switch (yych) { case 's': goto yy111; default: goto yy25; } yy85: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy86; } yy86: #line 170 "lexer.re" { ts.push_token(Token(Token::Div, lineno)); token_start = cursor; continue; } #line 1146 "lexer.cpp" yy87: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy88; } yy88: #line 128 "lexer.re" { ts.push_token(Token(Token::Dup, lineno)); token_start = cursor; continue; } #line 1223 "lexer.cpp" yy89: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 '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 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy24; case 'f': goto yy112; case 't': goto yy114; default: goto yy90; } yy90: #line 198 "lexer.re" { ts.push_token(Token(Token::Jump, lineno)); token_start = cursor; continue; } #line 1300 "lexer.cpp" yy91: yych = *++cursor; switch (yych) { case 'e': goto yy116; default: goto yy25; } yy92: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy93; } yy93: #line 232 "lexer.re" { ts.push_token(Token(Token::LessEq, lineno)); token_start = cursor; continue; } #line 1383 "lexer.cpp" yy94: yych = *++cursor; switch (yych) { case 's': goto yy117; default: goto yy25; } yy95: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy96; } yy96: #line 177 "lexer.re" { ts.push_token(Token(Token::Mod, lineno)); token_start = cursor; continue; } #line 1466 "lexer.cpp" yy97: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy98; } yy98: #line 163 "lexer.re" { ts.push_token(Token(Token::Mul, lineno)); token_start = cursor; continue; } #line 1543 "lexer.cpp" yy99: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy24; case 'r': goto yy119; default: goto yy100; } yy100: #line 115 "lexer.re" { ts.push_token(Token(Token::Pop, lineno)); token_start = cursor; continue; } #line 1620 "lexer.cpp" yy101: yych = *++cursor; switch (yych) { case 'n': goto yy121; default: goto yy25; } yy102: yych = *++cursor; switch (yych) { case 'h': goto yy122; default: goto yy25; } yy103: yych = *++cursor; switch (yych) { case 'd': goto yy124; default: goto yy25; } yy104: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy105; } yy105: #line 225 "lexer.re" { ts.push_token(Token(Token::Ret, lineno)); token_start = cursor; continue; } #line 1715 "lexer.cpp" yy106: yych = *++cursor; switch (yych) { case 'i': goto yy126; default: goto yy25; } yy107: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy108; } yy108: #line 156 "lexer.re" { ts.push_token(Token(Token::Sub, lineno)); token_start = cursor; continue; } #line 1798 "lexer.cpp" yy109: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy110; } yy110: #line 218 "lexer.re" { ts.push_token(Token(Token::Call, lineno)); token_start = cursor; continue; } #line 1875 "lexer.cpp" yy111: yych = *++cursor; switch (yych) { case 't': goto yy127; default: goto yy25; } yy112: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy113; } yy113: #line 191 "lexer.re" { ts.push_token(Token(Token::JumpF, lineno)); token_start = cursor; continue; } #line 1958 "lexer.cpp" yy114: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy115; } yy115: #line 184 "lexer.re" { ts.push_token(Token(Token::JumpT, lineno)); token_start = cursor; continue; } #line 2035 "lexer.cpp" yy116: yych = *++cursor; switch (yych) { case 'l': goto yy129; default: goto yy25; } yy117: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy118; } yy118: #line 238 "lexer.re" { ts.push_token(Token(Token::Less, lineno)); token_start = cursor; continue; } #line 2118 "lexer.cpp" yy119: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy120; } yy120: #line 121 "lexer.re" { ts.push_token(Token(Token::PopTo, lineno)); token_start = cursor; continue; } #line 2195 "lexer.cpp" yy121: yych = *++cursor; switch (yych) { case 't': goto yy131; default: goto yy25; } yy122: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy24; case 'r': goto yy133; default: goto yy123; } yy123: #line 109 "lexer.re" { ts.push_token(Token(Token::Push, lineno)); token_start = cursor; continue; } #line 2278 "lexer.cpp" yy124: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy125; } yy125: #line 135 "lexer.re" { ts.push_token(Token(Token::Read, lineno)); token_start = cursor; continue; } #line 2355 "lexer.cpp" yy126: yych = *++cursor; switch (yych) { case 'n': goto yy135; default: goto yy25; } yy127: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy128; } yy128: #line 204 "lexer.re" { ts.push_token(Token(Token::Const, lineno)); token_start = cursor; continue; } #line 2438 "lexer.cpp" yy129: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy130; } yy130: #line 245 "lexer.re" { ts.push_token(Token(Token::Label, lineno)); token_start = cursor; continue; } #line 2515 "lexer.cpp" yy131: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy132; } yy132: #line 142 "lexer.re" { ts.push_token(Token(Token::Print, lineno)); token_start = cursor; continue; } #line 2592 "lexer.cpp" yy133: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy134; } yy134: #line 103 "lexer.re" { ts.push_token(Token(Token::PushFrom, lineno)); token_start = cursor; continue; } #line 2669 "lexer.cpp" yy135: yych = *++cursor; switch (yych) { case 'g': goto yy136; default: goto yy25; } yy136: yych = *++cursor; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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 yy24; default: goto yy137; } yy137: #line 211 "lexer.re" { ts.push_token(Token(Token::String, lineno)); token_start = cursor; continue; } #line 2752 "lexer.cpp" } #line 300 "lexer.re" } return true; } /*! ** Fills up the buffer when neccessary. ** Note the buffer is always filled to the maximum, not just the ** number of bytes neccessary for the lexer to continue. ** ** \param nbytes - the number of bytes */ void Lexer::buffer_grow(size_t new_size) { char* new_buffer = new char[new_size]; std::copy(buffer, limit, new_buffer); token_start = new_buffer + (token_start - buffer); cursor = new_buffer + (cursor - buffer); limit = new_buffer + new_size; buffer_size = new_size; delete[] buffer; buffer = new_buffer; } void Lexer::read(size_t nbytes) { if (token_start + nbytes > limit) { // we need larger buffer buffer_grow(token_start - buffer + nbytes); } std::copy(token_start, limit, buffer); cursor -= token_start - buffer; char* old_limit = limit - (token_start - buffer); token_start = buffer; file->read(old_limit, limit - old_limit); if (file->eof()) { auto bytes = file->gcount(); std::fill(old_limit + bytes, limit, '\0'); } } void Lexer::buffer_init() { file->read(buffer, buffer_size); if (file->eof()) { auto bytes = file->gcount(); std::fill(buffer + bytes, buffer + buffer_size, '\0'); } cursor = marker = token_start = buffer; limit = buffer + buffer_size; } } // namespace Lexer } // namespace ASM } // namespace SpasmImpl