From f9654d32bc456d20de03b7eb20888120a59e405d Mon Sep 17 00:00:00 2001 From: Dimitar Trendafilov Date: Mon, 12 Nov 2018 23:42:48 +0200 Subject: The assembler works closes to the instruction set spec --- spasm/src/asm/lexer.cpp | 3853 +++++++++++++++++++++++++++-------------------- 1 file changed, 2189 insertions(+), 1664 deletions(-) (limited to 'spasm/src/asm/lexer.cpp') diff --git a/spasm/src/asm/lexer.cpp b/spasm/src/asm/lexer.cpp index 659beae..86384b3 100644 --- a/spasm/src/asm/lexer.cpp +++ b/spasm/src/asm/lexer.cpp @@ -1,1664 +1,2189 @@ -/* Generated by re2c 1.1.1 on Tue Nov 06 22:08:59 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) < 6) return true; - yych = *cursor; - switch (yych) { - case 0x00: goto yy2; - case '\t': - case ' ': goto yy6; - case '\n': goto yy9; - case '%': goto yy11; - case '*': goto yy13; - case '+': goto yy15; - case '-': goto yy17; - case '/': goto yy19; - case '0': goto yy21; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy23; - case '<': goto yy25; - 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 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'k': - case 'm': - case 'n': - case 'o': - case 'q': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': goto yy27; - case 'c': goto yy30; - case 'd': goto yy31; - case 'j': goto yy32; - case 'l': goto yy33; - case 'p': goto yy34; - case 'r': goto yy35; - case 's': goto yy36; - default: goto yy4; - } -yy2: - ++cursor; -#line 233 "lexer.re" - { - ts.push_token (Token (Token::endinput, lineno)); - - break; - } -#line 130 "lexer.cpp" -yy4: - ++cursor; -#line 239 "lexer.re" - { - return false; - } -#line 137 "lexer.cpp" -yy6: - ++cursor; - if (limit <= cursor) return true; - yych = *cursor; - switch (yych) { - case '\t': - case ' ': goto yy6; - default: goto yy8; - } -yy8: -#line 220 "lexer.re" - { - token_start = cursor; - - continue; - } -#line 154 "lexer.cpp" -yy9: - ++cursor; -#line 226 "lexer.re" - { - ++lineno; - token_start = cursor; - - continue; - } -#line 164 "lexer.cpp" -yy11: - ++cursor; -#line 137 "lexer.re" - { - ts.push_token (Token (Token::modulus, lineno)); - token_start = cursor; - - continue; - } -#line 174 "lexer.cpp" -yy13: - ++cursor; -#line 123 "lexer.re" - { - ts.push_token (Token (Token::multiply, lineno)); - token_start = cursor; - - continue; - } -#line 184 "lexer.cpp" -yy15: - ++cursor; -#line 109 "lexer.re" - { - ts.push_token (Token (Token::plus, lineno)); - token_start = cursor; - - continue; - } -#line 194 "lexer.cpp" -yy17: - yych = *++cursor; - switch (yych) { - case '0': goto yy37; - default: goto yy18; - } -yy18: -#line 116 "lexer.re" - { - ts.push_token (Token (Token::minus, lineno)); - token_start = cursor; - - continue; - } -#line 209 "lexer.cpp" -yy19: - ++cursor; -#line 130 "lexer.re" - { - ts.push_token (Token (Token::divide, lineno)); - token_start = cursor; - - continue; - } -#line 219 "lexer.cpp" -yy21: - yych = *(marker = ++cursor); - switch (yych) { - case 'X': - case 'x': goto yy38; - default: goto yy22; - } -yy22: -#line 58 "lexer.re" - { - ts.push_token (Token (Token::integer, lineno, - token_start, cursor)); - token_start = cursor; - - continue; - } -#line 236 "lexer.cpp" -yy23: - ++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 yy23; - default: goto yy22; - } -yy25: - yych = *++cursor; - switch (yych) { - case '=': goto yy40; - default: goto yy26; - } -yy26: -#line 198 "lexer.re" - { - ts.push_token (Token (Token::less, lineno)); - token_start = cursor; - - continue; - } -#line 268 "lexer.cpp" -yy27: - ++cursor; - if (limit <= cursor) return true; - yych = *cursor; -yy28: - 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 yy27; - default: goto yy29; - } -yy29: -#line 212 "lexer.re" - { - ts.push_token (Token (Token::ident, lineno, token_start, - cursor)); - token_start = cursor; - - continue; - } -#line 349 "lexer.cpp" -yy30: - yych = *++cursor; - switch (yych) { - case 'a': goto yy42; - default: goto yy28; - } -yy31: - yych = *++cursor; - switch (yych) { - case 'u': goto yy43; - default: goto yy28; - } -yy32: - yych = *++cursor; - switch (yych) { - case 'm': goto yy44; - default: goto yy28; - } -yy33: - yych = *++cursor; - switch (yych) { - case 'a': goto yy45; - case 'o': goto yy46; - default: goto yy28; - } -yy34: - yych = *++cursor; - switch (yych) { - case 'o': goto yy47; - case 'r': goto yy48; - case 'u': goto yy49; - default: goto yy28; - } -yy35: - yych = *++cursor; - switch (yych) { - case 'e': goto yy50; - default: goto yy28; - } -yy36: - yych = *++cursor; - switch (yych) { - case 't': goto yy51; - default: goto yy28; - } -yy37: - ++cursor; - goto yy22; -yy38: - 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 yy52; - default: goto yy39; - } -yy39: - cursor = marker; - goto yy22; -yy40: - ++cursor; -#line 192 "lexer.re" - { - ts.push_token (Token (Token::lesseq, lineno)); - token_start = cursor; - - continue; - } -#line 437 "lexer.cpp" -yy42: - yych = *++cursor; - switch (yych) { - case 'l': goto yy55; - default: goto yy28; - } -yy43: - yych = *++cursor; - switch (yych) { - case 'p': goto yy56; - default: goto yy28; - } -yy44: - yych = *++cursor; - switch (yych) { - case 'p': goto yy58; - default: goto yy28; - } -yy45: - yych = *++cursor; - switch (yych) { - case 'b': goto yy60; - default: goto yy28; - } -yy46: - yych = *++cursor; - switch (yych) { - case 'a': goto yy61; - default: goto yy28; - } -yy47: - yych = *++cursor; - switch (yych) { - case 'p': goto yy62; - default: goto yy28; - } -yy48: - yych = *++cursor; - switch (yych) { - case 'i': goto yy64; - default: goto yy28; - } -yy49: - yych = *++cursor; - switch (yych) { - case 's': goto yy65; - default: goto yy28; - } -yy50: - yych = *++cursor; - switch (yych) { - case 'a': goto yy66; - case 't': goto yy67; - default: goto yy28; - } -yy51: - yych = *++cursor; - switch (yych) { - case 'o': goto yy69; - default: goto yy28; - } -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': - 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 yy52; - default: goto yy54; - } -yy54: -#line 66 "lexer.re" - { - ts.push_token (Token (Token::xinteger, lineno, - token_start, cursor)); - token_start = cursor; - - continue; - } -#line 537 "lexer.cpp" -yy55: - yych = *++cursor; - switch (yych) { - case 'l': goto yy70; - default: goto yy28; - } -yy56: - 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 yy27; - default: goto yy57; - } -yy57: -#line 88 "lexer.re" - { - ts.push_token (Token (Token::dup, lineno)); - token_start = cursor; - - continue; - } -#line 620 "lexer.cpp" -yy58: - 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 yy27; - case 'f': goto yy72; - case 't': goto yy74; - default: goto yy59; - } -yy59: -#line 158 "lexer.re" - { - ts.push_token (Token (Token::go, lineno)); - token_start = cursor; - - continue; - } -#line 697 "lexer.cpp" -yy60: - yych = *++cursor; - switch (yych) { - case 'e': goto yy76; - default: goto yy28; - } -yy61: - yych = *++cursor; - switch (yych) { - case 'd': goto yy77; - default: goto yy28; - } -yy62: - 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 yy27; - default: goto yy63; - } -yy63: -#line 81 "lexer.re" - { - ts.push_token (Token (Token::pop, lineno)); - token_start = cursor; - - continue; - } -#line 786 "lexer.cpp" -yy64: - yych = *++cursor; - switch (yych) { - case 'n': goto yy79; - default: goto yy28; - } -yy65: - yych = *++cursor; - switch (yych) { - case 'h': goto yy80; - default: goto yy28; - } -yy66: - yych = *++cursor; - switch (yych) { - case 'd': goto yy82; - default: goto yy28; - } -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 yy27; - default: goto yy68; - } -yy68: -#line 172 "lexer.re" - { - ts.push_token (Token (Token::ret, lineno)); - token_start = cursor; - - continue; - } -#line 881 "lexer.cpp" -yy69: - yych = *++cursor; - switch (yych) { - case 'r': goto yy84; - default: goto yy28; - } -yy70: - 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 yy27; - default: goto yy71; - } -yy71: -#line 165 "lexer.re" - { - ts.push_token (Token (Token::call, lineno)); - token_start = cursor; - - continue; - } -#line 964 "lexer.cpp" -yy72: - 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 yy27; - default: goto yy73; - } -yy73: -#line 151 "lexer.re" - { - ts.push_token (Token (Token::gofalse, lineno)); - token_start = cursor; - - continue; - } -#line 1041 "lexer.cpp" -yy74: - 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 yy27; - default: goto yy75; - } -yy75: -#line 144 "lexer.re" - { - ts.push_token (Token (Token::gotrue, lineno)); - token_start = cursor; - - continue; - } -#line 1118 "lexer.cpp" -yy76: - yych = *++cursor; - switch (yych) { - case 'l': goto yy85; - default: goto yy28; - } -yy77: - 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 yy27; - default: goto yy78; - } -yy78: -#line 179 "lexer.re" - { - ts.push_token (Token (Token::load, lineno)); - token_start = cursor; - - continue; - } -#line 1201 "lexer.cpp" -yy79: - yych = *++cursor; - switch (yych) { - case 't': goto yy87; - default: goto yy28; - } -yy80: - 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 yy27; - default: goto yy81; - } -yy81: -#line 74 "lexer.re" - { - ts.push_token (Token (Token::push, lineno)); - token_start = cursor; - - continue; - } -#line 1284 "lexer.cpp" -yy82: - 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 yy27; - default: goto yy83; - } -yy83: -#line 95 "lexer.re" - { - ts.push_token (Token (Token::read, lineno)); - token_start = cursor; - - continue; - } -#line 1361 "lexer.cpp" -yy84: - yych = *++cursor; - switch (yych) { - case 'e': goto yy89; - default: goto yy28; - } -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 yy27; - default: goto yy86; - } -yy86: -#line 205 "lexer.re" - { - ts.push_token (Token (Token::label, lineno)); - token_start = cursor; - - continue; - } -#line 1444 "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 yy27; - default: goto yy88; - } -yy88: -#line 102 "lexer.re" - { - ts.push_token (Token (Token::print, lineno)); - token_start = cursor; - - continue; - } -#line 1521 "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 '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 yy27; - default: goto yy90; - } -yy90: -#line 186 "lexer.re" - { - ts.push_token (Token (Token::store, lineno)); - token_start = cursor; - - continue; - } -#line 1598 "lexer.cpp" - } -#line 243 "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 ()) { - size_t bytes = file->gcount (); - std::fill (old_limit + bytes, limit, '\0'); - } - } - - void Lexer::buffer_init () - { - file->read (buffer, buffer_size); - if (file->eof ()) { - size_t 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 - +/* Generated by re2c 1.1.1 on Mon Nov 12 23:00:12 2018 */ +#line 1 "spasm/src/asm/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 "spasm/src/asm/lexer.re" + + while (1) + { +#line 41 "spasm/src/asm/lexer.cpp" + { + char yych; + if ((limit - cursor) < 6) + return true; + yych = *cursor; + switch (yych) + { + case 0x00: + goto yy2; + case '\t': + case ' ': + goto yy6; + case '\n': + goto yy9; + case '-': + goto yy11; + case '0': + goto yy12; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + goto yy14; + 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 yy16; + case 'a': + goto yy19; + case 'c': + goto yy20; + case 'd': + goto yy21; + case 'j': + goto yy22; + case 'l': + goto yy23; + case 'm': + goto yy24; + case 'p': + goto yy25; + case 'r': + goto yy26; + case 's': + goto yy27; + default: + goto yy4; + } + yy2: + ++cursor; +#line 220 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::endinput, lineno)); + + break; + } +#line 125 "spasm/src/asm/lexer.cpp" + yy4: + ++cursor; + yy5: +#line 226 "spasm/src/asm/lexer.re" + { + return false; + } +#line 133 "spasm/src/asm/lexer.cpp" + yy6: + ++cursor; + if (limit <= cursor) + return true; + yych = *cursor; + switch (yych) + { + case '\t': + case ' ': + goto yy6; + default: + goto yy8; + } + yy8: +#line 207 "spasm/src/asm/lexer.re" + { + token_start = cursor; + + continue; + } +#line 150 "spasm/src/asm/lexer.cpp" + yy9: + ++cursor; +#line 213 "spasm/src/asm/lexer.re" + { + ++lineno; + token_start = cursor; + + continue; + } +#line 160 "spasm/src/asm/lexer.cpp" + yy11: + yych = *++cursor; + switch (yych) + { + case '0': + goto yy28; + default: + goto yy5; + } + yy12: + yych = *(marker = ++cursor); + switch (yych) + { + case 'X': + case 'x': + goto yy29; + default: + goto yy13; + } + yy13: +#line 58 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::integer, lineno, token_start, cursor)); + token_start = cursor; + + continue; + } +#line 183 "spasm/src/asm/lexer.cpp" + yy14: + ++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 yy14; + default: + goto yy13; + } + yy16: + ++cursor; + if (limit <= cursor) + return true; + yych = *cursor; + yy17: + 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 yy16; + default: + goto yy18; + } + yy18: +#line 199 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::ident, lineno, token_start, cursor)); + token_start = cursor; + + continue; + } +#line 281 "spasm/src/asm/lexer.cpp" + yy19: + yych = *++cursor; + switch (yych) + { + case 'd': + goto yy31; + default: + goto yy17; + } + yy20: + yych = *++cursor; + switch (yych) + { + case 'a': + goto yy32; + default: + goto yy17; + } + yy21: + yych = *++cursor; + switch (yych) + { + case 'i': + goto yy33; + case 'u': + goto yy34; + default: + goto yy17; + } + yy22: + yych = *++cursor; + switch (yych) + { + case 'm': + goto yy35; + default: + goto yy17; + } + yy23: + yych = *++cursor; + switch (yych) + { + case 'a': + goto yy36; + case 'e': + goto yy37; + default: + goto yy17; + } + yy24: + yych = *++cursor; + switch (yych) + { + case 'o': + goto yy38; + case 'u': + goto yy39; + default: + goto yy17; + } + yy25: + yych = *++cursor; + switch (yych) + { + case 'o': + goto yy40; + case 'r': + goto yy41; + case 'u': + goto yy42; + default: + goto yy17; + } + yy26: + yych = *++cursor; + switch (yych) + { + case 'e': + goto yy43; + default: + goto yy17; + } + yy27: + yych = *++cursor; + switch (yych) + { + case 'u': + goto yy44; + default: + goto yy17; + } + yy28: + ++cursor; + goto yy13; + yy29: + 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 yy45; + default: + goto yy30; + } + yy30: + cursor = marker; + goto yy13; + yy31: + yych = *++cursor; + switch (yych) + { + case 'd': + goto yy48; + default: + goto yy17; + } + yy32: + yych = *++cursor; + switch (yych) + { + case 'l': + goto yy50; + default: + goto yy17; + } + yy33: + yych = *++cursor; + switch (yych) + { + case 'v': + goto yy51; + default: + goto yy17; + } + yy34: + yych = *++cursor; + switch (yych) + { + case 'p': + goto yy53; + default: + goto yy17; + } + yy35: + yych = *++cursor; + switch (yych) + { + case 'p': + goto yy55; + default: + goto yy17; + } + yy36: + yych = *++cursor; + switch (yych) + { + case 'b': + goto yy57; + default: + goto yy17; + } + yy37: + yych = *++cursor; + switch (yych) + { + case 'q': + goto yy58; + case 's': + goto yy60; + default: + goto yy17; + } + yy38: + yych = *++cursor; + switch (yych) + { + case 'd': + goto yy61; + default: + goto yy17; + } + yy39: + yych = *++cursor; + switch (yych) + { + case 'l': + goto yy63; + default: + goto yy17; + } + yy40: + yych = *++cursor; + switch (yych) + { + case 'p': + goto yy65; + default: + goto yy17; + } + yy41: + yych = *++cursor; + switch (yych) + { + case 'i': + goto yy67; + default: + goto yy17; + } + yy42: + yych = *++cursor; + switch (yych) + { + case 's': + goto yy68; + default: + goto yy17; + } + yy43: + yych = *++cursor; + switch (yych) + { + case 'a': + goto yy69; + case 't': + goto yy70; + default: + goto yy17; + } + yy44: + yych = *++cursor; + switch (yych) + { + case 'b': + goto yy72; + default: + goto yy17; + } + yy45: + ++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 yy45; + default: + goto yy47; + } + yy47: +#line 66 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::xinteger, lineno, token_start, cursor)); + token_start = cursor; + + continue; + } +#line 498 "spasm/src/asm/lexer.cpp" + 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 '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 yy16; + default: + goto yy49; + } + yy49: +#line 109 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::plus, lineno)); + token_start = cursor; + + continue; + } +#line 575 "spasm/src/asm/lexer.cpp" + yy50: + yych = *++cursor; + switch (yych) + { + case 'l': + goto yy74; + default: + goto yy17; + } + yy51: + 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 yy16; + default: + goto yy52; + } + yy52: +#line 130 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::divide, lineno)); + token_start = cursor; + + continue; + } +#line 658 "spasm/src/asm/lexer.cpp" + yy53: + 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 yy16; + default: + goto yy54; + } + yy54: +#line 88 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::dup, lineno)); + token_start = cursor; + + continue; + } +#line 735 "spasm/src/asm/lexer.cpp" + yy55: + 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 yy16; + case 'f': + goto yy76; + case 't': + goto yy78; + default: + goto yy56; + } + yy56: +#line 158 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::jmp, lineno)); + token_start = cursor; + + continue; + } +#line 812 "spasm/src/asm/lexer.cpp" + yy57: + yych = *++cursor; + switch (yych) + { + case 'e': + goto yy80; + default: + goto yy17; + } + yy58: + 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 yy16; + default: + goto yy59; + } + yy59: +#line 179 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::lesseq, lineno)); + token_start = cursor; + + continue; + } +#line 895 "spasm/src/asm/lexer.cpp" + yy60: + yych = *++cursor; + switch (yych) + { + case 's': + goto yy81; + default: + goto yy17; + } + yy61: + 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 yy16; + default: + goto yy62; + } + yy62: +#line 137 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::modulus, lineno)); + token_start = cursor; + + continue; + } +#line 978 "spasm/src/asm/lexer.cpp" + yy63: + 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 yy16; + default: + goto yy64; + } + yy64: +#line 123 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::multiply, lineno)); + token_start = cursor; + + continue; + } +#line 1055 "spasm/src/asm/lexer.cpp" + yy65: + 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 yy16; + default: + goto yy66; + } + yy66: +#line 81 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::pop, lineno)); + token_start = cursor; + + continue; + } +#line 1132 "spasm/src/asm/lexer.cpp" + yy67: + yych = *++cursor; + switch (yych) + { + case 'n': + goto yy83; + default: + goto yy17; + } + yy68: + yych = *++cursor; + switch (yych) + { + case 'h': + goto yy84; + default: + goto yy17; + } + yy69: + yych = *++cursor; + switch (yych) + { + case 'd': + goto yy86; + default: + goto yy17; + } + yy70: + 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 yy16; + default: + goto yy71; + } + yy71: +#line 172 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::ret, lineno)); + token_start = cursor; + + continue; + } +#line 1227 "spasm/src/asm/lexer.cpp" + yy72: + 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 yy16; + default: + goto yy73; + } + yy73: +#line 116 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::minus, lineno)); + token_start = cursor; + + continue; + } +#line 1304 "spasm/src/asm/lexer.cpp" + yy74: + 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 yy16; + default: + goto yy75; + } + yy75: +#line 165 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::call, lineno)); + token_start = cursor; + + continue; + } +#line 1381 "spasm/src/asm/lexer.cpp" + yy76: + 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 yy16; + default: + goto yy77; + } + yy77: +#line 151 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::jmpf, lineno)); + token_start = cursor; + + continue; + } +#line 1458 "spasm/src/asm/lexer.cpp" + yy78: + 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 yy16; + default: + goto yy79; + } + yy79: +#line 144 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::jmpt, lineno)); + token_start = cursor; + + continue; + } +#line 1535 "spasm/src/asm/lexer.cpp" + yy80: + yych = *++cursor; + switch (yych) + { + case 'l': + goto yy88; + default: + goto yy17; + } + 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 yy16; + default: + goto yy82; + } + yy82: +#line 185 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::less, lineno)); + token_start = cursor; + + continue; + } +#line 1618 "spasm/src/asm/lexer.cpp" + yy83: + yych = *++cursor; + switch (yych) + { + case 't': + goto yy90; + default: + goto yy17; + } + yy84: + 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 yy16; + default: + goto yy85; + } + yy85: +#line 74 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::push, lineno)); + token_start = cursor; + + continue; + } +#line 1701 "spasm/src/asm/lexer.cpp" + yy86: + 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 yy16; + default: + goto yy87; + } + yy87: +#line 95 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::read, lineno)); + token_start = cursor; + + continue; + } +#line 1778 "spasm/src/asm/lexer.cpp" + yy88: + 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 yy16; + default: + goto yy89; + } + yy89: +#line 192 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::label, lineno)); + token_start = cursor; + + continue; + } +#line 1855 "spasm/src/asm/lexer.cpp" + yy90: + 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 yy16; + default: + goto yy91; + } + yy91: +#line 102 "spasm/src/asm/lexer.re" + { + ts.push_token(Token(Token::print, lineno)); + token_start = cursor; + + continue; + } +#line 1932 "spasm/src/asm/lexer.cpp" + } +#line 230 "spasm/src/asm/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()) + { + size_t bytes = file->gcount(); + std::fill(old_limit + bytes, limit, '\0'); + } +} + +void Lexer::buffer_init() +{ + file->read(buffer, buffer_size); + if (file->eof()) + { + size_t 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 -- cgit v1.3.1-23-gd82d