diff options
author | somov <somov@yandex-team.ru> | 2022-02-10 16:45:47 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:45:47 +0300 |
commit | a5950576e397b1909261050b8c7da16db58f10b1 (patch) | |
tree | 7ba7677f6a4c3e19e2cefab34d16df2c8963b4d4 /contrib/tools/yasm/modules/gas-token.c | |
parent | 81eddc8c0b55990194e112b02d127b87d54164a9 (diff) | |
download | ydb-a5950576e397b1909261050b8c7da16db58f10b1.tar.gz |
Restoring authorship annotation for <somov@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/tools/yasm/modules/gas-token.c')
-rw-r--r-- | contrib/tools/yasm/modules/gas-token.c | 2814 |
1 files changed, 1407 insertions, 1407 deletions
diff --git a/contrib/tools/yasm/modules/gas-token.c b/contrib/tools/yasm/modules/gas-token.c index 454287b6d8..66410edb64 100644 --- a/contrib/tools/yasm/modules/gas-token.c +++ b/contrib/tools/yasm/modules/gas-token.c @@ -1,1407 +1,1407 @@ -/* Generated by re2c - */ -/* - * GAS-compatible re2c lexer - * - * Copyright (C) 2005-2007 Peter Johnson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of other contributors - * may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#include <util.h> - -#include <libyasm.h> - -#include "modules/parsers/gas/gas-parser.h" - - -#define BSIZE 8192 - -#define YYCURSOR cursor -#define YYLIMIT (s->lim) -#define YYMARKER (s->ptr) -#define YYFILL(n) {cursor = fill(parser_gas, cursor);} - -#define RETURN(i) do {s->cur = cursor; parser_gas->tokch = s->tok[0]; \ - return i;} while (0) - -#define SCANINIT() {s->tok = cursor;} - -#define TOK ((char *)s->tok) -#define TOKLEN (size_t)(cursor-s->tok) - -/* Bridge function to convert byte-oriented parser with line-oriented - * preprocessor. - */ -static size_t -preproc_input(yasm_parser_gas *parser_gas, /*@out@*/ YYCTYPE *buf, - size_t max_size) -{ - size_t tot=0; - while (max_size > 0) { - size_t n; - - if (!parser_gas->line) { - parser_gas->line = yasm_preproc_get_line(parser_gas->preproc); - if (!parser_gas->line) - return tot; /* EOF */ - parser_gas->linepos = parser_gas->line; - parser_gas->lineleft = strlen(parser_gas->line) + 1; - parser_gas->line[parser_gas->lineleft-1] = '\n'; - } - - n = parser_gas->lineleft<max_size ? parser_gas->lineleft : max_size; - strncpy((char *)buf+tot, parser_gas->linepos, n); - - if (n == parser_gas->lineleft) { - yasm_xfree(parser_gas->line); - parser_gas->line = NULL; - } else { - parser_gas->lineleft -= n; - parser_gas->linepos += n; - } - - tot += n; - max_size -= n; - } - return tot; -} -#if 0 -static size_t -fill_input(void *d, unsigned char *buf, size_t max) -{ - return yasm_preproc_input((yasm_preproc *)d, (char *)buf, max); -} -#endif -static YYCTYPE * -fill(yasm_parser_gas *parser_gas, YYCTYPE *cursor) -{ - yasm_scanner *s = &parser_gas->s; - int first = 0; - if(!s->eof){ - size_t cnt = s->tok - s->bot; - if(cnt){ - memmove(s->bot, s->tok, (size_t)(s->lim - s->tok)); - s->tok = s->bot; - s->ptr -= cnt; - cursor -= cnt; - s->lim -= cnt; - } - if (!s->bot) - first = 1; - if((s->top - s->lim) < BSIZE){ - YYCTYPE *buf = yasm_xmalloc((size_t)(s->lim - s->bot) + BSIZE); - memcpy(buf, s->tok, (size_t)(s->lim - s->tok)); - s->tok = buf; - s->ptr = &buf[s->ptr - s->bot]; - cursor = &buf[cursor - s->bot]; - s->lim = &buf[s->lim - s->bot]; - s->top = &s->lim[BSIZE]; - if (s->bot) - yasm_xfree(s->bot); - s->bot = buf; - } - if((cnt = preproc_input(parser_gas, s->lim, BSIZE)) == 0) { - s->eof = &s->lim[cnt]; *s->eof++ = '\n'; - } - s->lim += cnt; - if (first && parser_gas->save_input) { - int i; - YYCTYPE *saveline; - parser_gas->save_last ^= 1; - saveline = parser_gas->save_line[parser_gas->save_last]; - /* save next line into cur_line */ - for (i=0; i<79 && &s->tok[i] < s->lim && s->tok[i] != '\n'; i++) - saveline[i] = s->tok[i]; - saveline[i] = '\0'; - } - } - return cursor; -} - -static YYCTYPE * -save_line(yasm_parser_gas *parser_gas, YYCTYPE *cursor) -{ - yasm_scanner *s = &parser_gas->s; - int i = 0; - YYCTYPE *saveline; - - parser_gas->save_last ^= 1; - saveline = parser_gas->save_line[parser_gas->save_last]; - - /* save next line into cur_line */ - if ((YYLIMIT - YYCURSOR) < 80) - YYFILL(80); - for (i=0; i<79 && &cursor[i] < s->lim && cursor[i] != '\n'; i++) - saveline[i] = cursor[i]; - saveline[i] = '\0'; - return cursor; -} - -/* starting size of string buffer */ -#define STRBUF_ALLOC_SIZE 128 - -/* string buffer used when parsing strings/character constants */ -static YYCTYPE *strbuf = NULL; - -/* length of strbuf (including terminating NULL character) */ -static size_t strbuf_size = 0; - -static void -strbuf_append(size_t count, YYCTYPE *cursor, yasm_scanner *s, int ch) -{ - if (count >= strbuf_size) { - strbuf = yasm_xrealloc(strbuf, strbuf_size + STRBUF_ALLOC_SIZE); - strbuf_size += STRBUF_ALLOC_SIZE; - } - strbuf[count] = ch; -} - - - - -int -gas_parser_lex(YYSTYPE *lvalp, yasm_parser_gas *parser_gas) -{ - yasm_scanner *s = &parser_gas->s; - YYCTYPE *cursor = s->cur; - size_t count; - YYCTYPE savech; - - /* Handle one token of lookahead */ - if (parser_gas->peek_token != NONE) { - int tok = parser_gas->peek_token; - *lvalp = parser_gas->peek_tokval; /* structure copy */ - parser_gas->tokch = parser_gas->peek_tokch; - parser_gas->peek_token = NONE; - return tok; - } - - /* Catch EOF */ - if (s->eof && cursor == s->eof) - return 0; - - /* Jump to proper "exclusive" states */ - switch (parser_gas->state) { - case COMMENT: - goto comment; - case SECTION_DIRECTIVE: - goto section_directive; - case NASM_FILENAME: - goto nasm_filename; - default: - break; - } - -scan: - SCANINIT(); - - { - static unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, - 254, 254, 126, 126, 126, 126, 126, 126, - 94, 94, 0, 0, 0, 0, 0, 0, - 8, 78, 78, 78, 78, 78, 78, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 0, 0, 0, 0, 12, - 0, 78, 78, 78, 78, 78, 78, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - -{ - YYCTYPE yych; - unsigned int yyaccept; - goto yy0; - ++YYCURSOR; -yy0: - if((YYLIMIT - YYCURSOR) < 5) YYFILL(5); - yych = *YYCURSOR; - if(yych <= '/'){ - if(yych <= '#'){ - if(yych <= '\r'){ - if(yych <= '\t'){ - if(yych <= '\b') goto yy30; - goto yy26; - } else { - if(yych <= '\n') goto yy28; - if(yych <= '\f') goto yy30; - goto yy26; - } - } else { - if(yych <= ' '){ - if(yych <= '\037') goto yy30; - goto yy26; - } else { - if(yych <= '!') goto yy17; - if(yych <= '"') goto yy11; - goto yy24; - } - } - } else { - if(yych <= '*'){ - if(yych <= '%'){ - if(yych <= '$') goto yy17; - goto yy22; - } else { - if(yych == '\'') goto yy9; - goto yy17; - } - } else { - if(yych <= ','){ - if(yych <= '+') goto yy5; - goto yy17; - } else { - if(yych <= '-') goto yy5; - if(yych <= '.') goto yy7; - goto yy18; - } - } - } - } else { - if(yych <= 'Z'){ - if(yych <= '<'){ - if(yych <= '9'){ - if(yych >= '1') goto yy4; - goto yy2; - } else { - if(yych <= ':') goto yy17; - if(yych <= ';') goto yy19; - goto yy13; - } - } else { - if(yych <= '>'){ - if(yych <= '=') goto yy17; - goto yy15; - } else { - if(yych <= '?') goto yy30; - if(yych <= '@') goto yy17; - goto yy21; - } - } - } else { - if(yych <= 'z'){ - if(yych <= '^'){ - if(yych <= ']') goto yy30; - goto yy17; - } else { - if(yych == '`') goto yy30; - goto yy21; - } - } else { - if(yych <= '|'){ - if(yych <= '{') goto yy30; - goto yy17; - } else { - if(yych == '~') goto yy17; - goto yy30; - } - } - } - } -yy2: yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if(yych <= 'T'){ - if(yych <= 'A'){ - if(yych <= '/'){ - if(yych == '.') goto yy90; - goto yy3; - } else { - if(yych <= '9') goto yy90; - if(yych <= ':') goto yy81; - goto yy3; - } - } else { - if(yych <= 'E'){ - if(yych <= 'B') goto yy85; - if(yych >= 'D') goto yy88; - goto yy3; - } else { - if(yych <= 'F') goto yy86; - if(yych >= 'T') goto yy88; - goto yy3; - } - } - } else { - if(yych <= 'e'){ - if(yych <= 'a'){ - if(yych == 'X') goto yy92; - goto yy3; - } else { - if(yych <= 'b') goto yy85; - if(yych >= 'd') goto yy88; - goto yy3; - } - } else { - if(yych <= 't'){ - if(yych <= 'f') goto yy86; - if(yych >= 't') goto yy88; - goto yy3; - } else { - if(yych == 'x') goto yy92; - goto yy3; - } - } - } -yy3: -{ - savech = s->tok[TOKLEN]; - s->tok[TOKLEN] = '\0'; - lvalp->intn = yasm_intnum_create_dec(TOK); - s->tok[TOKLEN] = savech; - RETURN(INTNUM); - } -yy4: yych = *++YYCURSOR; - if(yych <= 'E'){ - if(yych <= ':'){ - if(yych <= '9') goto yy84; - goto yy81; - } else { - if(yych == 'B') goto yy77; - goto yy84; - } - } else { - if(yych <= 'b'){ - if(yych <= 'F') goto yy79; - if(yych <= 'a') goto yy84; - goto yy77; - } else { - if(yych == 'f') goto yy79; - goto yy84; - } - } -yy5: yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - if(yych == '.') goto yy61; - if(yych <= '/') goto yy6; - if(yych <= '9') goto yy59; - goto yy6; -yy6: -{ RETURN(s->tok[0]); } -yy7: yych = *++YYCURSOR; - if(yybm[0+yych] & 16) { - goto yy49; - } - goto yy37; -yy8: -{ - lvalp->str.contents = yasm__xstrndup(TOK, TOKLEN); - lvalp->str.len = TOKLEN; - RETURN(ID); - } -yy9: yych = *++YYCURSOR; - goto yy10; -yy10: -{ - goto charconst; - } -yy11: yych = *++YYCURSOR; - goto yy12; -yy12: -{ - goto stringconst; - } -yy13: yych = *++YYCURSOR; - if(yych == '<') goto yy47; - goto yy14; -yy14: -{ RETURN(LEFT_OP); } -yy15: yych = *++YYCURSOR; - if(yych == '>') goto yy45; - goto yy16; -yy16: -{ RETURN(RIGHT_OP); } -yy17: yych = *++YYCURSOR; - goto yy6; -yy18: yych = *++YYCURSOR; - if(yych == '*') goto yy43; - if(yych == '/') goto yy41; - goto yy6; -yy19: yych = *++YYCURSOR; - goto yy20; -yy20: -{ - parser_gas->state = INITIAL; - RETURN(s->tok[0]); - } -yy21: yych = *++YYCURSOR; - goto yy37; -yy22: yych = *++YYCURSOR; - if(yybm[0+yych] & 2) { - goto yy33; - } - goto yy23; -yy23: -{ - yasm_warn_set(YASM_WARN_UNREC_CHAR, - N_("ignoring unrecognized character `%s'"), - yasm__conv_unprint(s->tok[0])); - goto scan; - } -yy24: yych = *++YYCURSOR; - goto yy25; -yy25: -{ - if (parser_gas->is_cpp_preproc) - { - RETURN(CPP_LINE_MARKER); - } else - goto line_comment; - } -yy26: yych = *++YYCURSOR; - goto yy32; -yy27: -{ goto scan; } -yy28: yych = *++YYCURSOR; - goto yy29; -yy29: -{ - if (parser_gas->save_input) - cursor = save_line(parser_gas, cursor); - parser_gas->state = INITIAL; - RETURN(s->tok[0]); - } -yy30: yych = *++YYCURSOR; - goto yy23; -yy31: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy32; -yy32: if(yybm[0+yych] & 1) { - goto yy31; - } - goto yy27; -yy33: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy34; -yy34: if(yybm[0+yych] & 2) { - goto yy33; - } - goto yy35; -yy35: -{ - savech = s->tok[TOKLEN]; - s->tok[TOKLEN] = '\0'; - if (parser_gas->is_nasm_preproc && strcmp(TOK+1, "line") == 0) { - s->tok[TOKLEN] = savech; - RETURN(NASM_LINE_MARKER); - } - - switch (yasm_arch_parse_check_regtmod - (p_object->arch, TOK+1, TOKLEN-1, &lvalp->arch_data)) { - case YASM_ARCH_REG: - s->tok[TOKLEN] = savech; - RETURN(REG); - case YASM_ARCH_REGGROUP: - s->tok[TOKLEN] = savech; - RETURN(REGGROUP); - case YASM_ARCH_SEGREG: - s->tok[TOKLEN] = savech; - RETURN(SEGREG); - default: - break; - } - yasm_error_set(YASM_ERROR_GENERAL, - N_("Unrecognized register name `%s'"), s->tok); - s->tok[TOKLEN] = savech; - lvalp->arch_data = 0; - RETURN(REG); - } -yy36: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy37; -yy37: if(yybm[0+yych] & 4) { - goto yy36; - } - if(yych != '@') goto yy8; - goto yy38; -yy38: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy39; -yy39: if(yybm[0+yych] & 8) { - goto yy38; - } - goto yy40; -yy40: -{ - /* if @ not part of ID, move the scanner cursor to the first @ */ - if (!((yasm_objfmt_base *)p_object->objfmt)->module->id_at_ok) - cursor = (unsigned char *)strchr(TOK, '@'); - lvalp->str.contents = yasm__xstrndup(TOK, TOKLEN); - lvalp->str.len = TOKLEN; - RETURN(ID); - } -yy41: yych = *++YYCURSOR; - goto yy42; -yy42: -{ goto line_comment; } -yy43: yych = *++YYCURSOR; - goto yy44; -yy44: -{ parser_gas->state = COMMENT; goto comment; } -yy45: yych = *++YYCURSOR; - goto yy46; -yy46: -{ RETURN(RIGHT_OP); } -yy47: yych = *++YYCURSOR; - goto yy48; -yy48: -{ RETURN(LEFT_OP); } -yy49: ++YYCURSOR; - if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = *YYCURSOR; - goto yy50; -yy50: if(yybm[0+yych] & 16) { - goto yy49; - } - if(yych <= 'E'){ - if(yych <= '.'){ - if(yych == '$') goto yy36; - if(yych >= '.') goto yy36; - goto yy51; - } else { - if(yych <= '?') goto yy51; - if(yych <= '@') goto yy38; - if(yych <= 'D') goto yy36; - goto yy52; - } - } else { - if(yych <= '`'){ - if(yych <= 'Z') goto yy36; - if(yych == '_') goto yy36; - goto yy51; - } else { - if(yych == 'e') goto yy52; - if(yych <= 'z') goto yy36; - goto yy51; - } - } -yy51: -{ - savech = s->tok[TOKLEN]; - s->tok[TOKLEN] = '\0'; - lvalp->flt = yasm_floatnum_create(TOK); - s->tok[TOKLEN] = savech; - RETURN(FLTNUM); - } -yy52: yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - if(yych <= ','){ - if(yych == '+') goto yy55; - goto yy37; - } else { - if(yych <= '-') goto yy55; - if(yych <= '/') goto yy37; - if(yych >= ':') goto yy37; - goto yy53; - } -yy53: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy54; -yy54: if(yych <= '?'){ - if(yych <= '-'){ - if(yych == '$') goto yy36; - goto yy51; - } else { - if(yych <= '.') goto yy36; - if(yych <= '/') goto yy51; - if(yych <= '9') goto yy53; - goto yy51; - } - } else { - if(yych <= '^'){ - if(yych <= '@') goto yy38; - if(yych <= 'Z') goto yy36; - goto yy51; - } else { - if(yych == '`') goto yy51; - if(yych <= 'z') goto yy36; - goto yy51; - } - } -yy55: yych = *++YYCURSOR; - if(yych <= '/') goto yy56; - if(yych <= '9') goto yy57; - goto yy56; -yy56: YYCURSOR = YYMARKER; - switch(yyaccept){ - case 0: goto yy3; - case 6: goto yy91; - case 3: goto yy51; - case 4: goto yy66; - case 5: goto yy87; - case 1: goto yy6; - case 2: goto yy8; - } -yy57: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy58; -yy58: if(yych <= '/') goto yy51; - if(yych <= '9') goto yy57; - goto yy51; -yy59: ++YYCURSOR; - if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); - yych = *YYCURSOR; - goto yy60; -yy60: if(yych == '.') goto yy65; - if(yych <= '/') goto yy56; - if(yych <= '9') goto yy59; - goto yy56; -yy61: yych = *++YYCURSOR; - if(yych <= '/') goto yy56; - if(yych >= ':') goto yy56; - goto yy62; -yy62: yyaccept = 3; - YYMARKER = ++YYCURSOR; - if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = *YYCURSOR; - goto yy63; -yy63: if(yych <= 'D'){ - if(yych <= '/') goto yy51; - if(yych <= '9') goto yy62; - goto yy51; - } else { - if(yych <= 'E') goto yy64; - if(yych != 'e') goto yy51; - goto yy64; - } -yy64: yych = *++YYCURSOR; - if(yych <= ','){ - if(yych == '+') goto yy55; - goto yy56; - } else { - if(yych <= '-') goto yy55; - if(yych <= '/') goto yy56; - if(yych <= '9') goto yy57; - goto yy56; - } -yy65: yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if(yych <= 'D'){ - if(yych <= '/') goto yy66; - if(yych <= '9') goto yy67; - goto yy66; - } else { - if(yych <= 'E') goto yy69; - if(yych == 'e') goto yy69; - goto yy66; - } -yy66: -{ - savech = s->tok[TOKLEN]; - s->tok[TOKLEN] = '\0'; - lvalp->flt = yasm_floatnum_create(TOK); - s->tok[TOKLEN] = savech; - RETURN(FLTNUM); - } -yy67: yyaccept = 3; - YYMARKER = ++YYCURSOR; - if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = *YYCURSOR; - goto yy68; -yy68: if(yych <= 'D'){ - if(yych <= '/') goto yy51; - if(yych <= '9') goto yy67; - goto yy51; - } else { - if(yych <= 'E') goto yy73; - if(yych == 'e') goto yy73; - goto yy51; - } -yy69: yych = *++YYCURSOR; - if(yych <= ','){ - if(yych != '+') goto yy56; - goto yy70; - } else { - if(yych <= '-') goto yy70; - if(yych <= '/') goto yy56; - if(yych <= '9') goto yy71; - goto yy56; - } -yy70: yych = *++YYCURSOR; - if(yych <= '/') goto yy56; - if(yych >= ':') goto yy56; - goto yy71; -yy71: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy72; -yy72: if(yych <= '/') goto yy66; - if(yych <= '9') goto yy71; - goto yy66; -yy73: yych = *++YYCURSOR; - if(yych <= ','){ - if(yych != '+') goto yy56; - goto yy74; - } else { - if(yych <= '-') goto yy74; - if(yych <= '/') goto yy56; - if(yych <= '9') goto yy75; - goto yy56; - } -yy74: yych = *++YYCURSOR; - if(yych <= '/') goto yy56; - if(yych >= ':') goto yy56; - goto yy75; -yy75: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy76; -yy76: if(yych <= '/') goto yy51; - if(yych <= '9') goto yy75; - goto yy51; -yy77: yych = *++YYCURSOR; - goto yy78; -yy78: -{ - /* build local label name */ - lvalp->str.contents = yasm_xmalloc(30); - lvalp->str.len = - sprintf(lvalp->str.contents, "L%c\001%lu", s->tok[0], - parser_gas->local[s->tok[0]-'0']); - RETURN(ID); - } -yy79: yych = *++YYCURSOR; - goto yy80; -yy80: -{ - /* build local label name */ - lvalp->str.contents = yasm_xmalloc(30); - lvalp->str.len = - sprintf(lvalp->str.contents, "L%c\001%lu", s->tok[0], - parser_gas->local[s->tok[0]-'0']+1); - RETURN(ID); - } -yy81: yych = *++YYCURSOR; - goto yy82; -yy82: -{ - /* increment label index */ - parser_gas->local[s->tok[0]-'0']++; - /* build local label name */ - lvalp->str.contents = yasm_xmalloc(30); - lvalp->str.len = - sprintf(lvalp->str.contents, "L%c\001%lu", s->tok[0], - parser_gas->local[s->tok[0]-'0']); - RETURN(LABEL); - } -yy83: ++YYCURSOR; - if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); - yych = *YYCURSOR; - goto yy84; -yy84: if(yych == '.') goto yy65; - if(yych <= '/') goto yy3; - if(yych <= '9') goto yy83; - goto yy3; -yy85: yych = *++YYCURSOR; - if(yybm[0+yych] & 128) { - goto yy104; - } - goto yy78; -yy86: yyaccept = 5; - yych = *(YYMARKER = ++YYCURSOR); - if(yych == '+') goto yy96; - if(yych == '-') goto yy96; - goto yy97; -yy87: -{ - savech = s->tok[TOKLEN]; - s->tok[TOKLEN] = '\0'; - lvalp->flt = yasm_floatnum_create(TOK+2); - s->tok[TOKLEN] = savech; - RETURN(FLTNUM); - } -yy88: yyaccept = 5; - yych = *(YYMARKER = ++YYCURSOR); - if(yych == '+') goto yy96; - if(yych == '-') goto yy96; - goto yy97; -yy89: yyaccept = 6; - YYMARKER = ++YYCURSOR; - if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); - yych = *YYCURSOR; - goto yy90; -yy90: if(yybm[0+yych] & 32) { - goto yy89; - } - if(yych == '.') goto yy65; - if(yych <= '/') goto yy91; - if(yych <= '9') goto yy59; - goto yy91; -yy91: -{ - savech = s->tok[TOKLEN]; - s->tok[TOKLEN] = '\0'; - lvalp->intn = yasm_intnum_create_oct(TOK); - s->tok[TOKLEN] = savech; - RETURN(INTNUM); - } -yy92: yych = *++YYCURSOR; - if(yybm[0+yych] & 64) { - goto yy93; - } - goto yy56; -yy93: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy94; -yy94: if(yybm[0+yych] & 64) { - goto yy93; - } - goto yy95; -yy95: -{ - savech = s->tok[TOKLEN]; - s->tok[TOKLEN] = '\0'; - /* skip 0 and x */ - lvalp->intn = yasm_intnum_create_hex(TOK+2); - s->tok[TOKLEN] = savech; - RETURN(INTNUM); - } -yy96: yyaccept = 5; - YYMARKER = ++YYCURSOR; - if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = *YYCURSOR; - goto yy97; -yy97: if(yych <= '9'){ - if(yych == '.') goto yy98; - if(yych <= '/') goto yy87; - goto yy96; - } else { - if(yych <= 'E'){ - if(yych <= 'D') goto yy87; - goto yy100; - } else { - if(yych == 'e') goto yy100; - goto yy87; - } - } -yy98: yyaccept = 5; - YYMARKER = ++YYCURSOR; - if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = *YYCURSOR; - goto yy99; -yy99: if(yych <= 'D'){ - if(yych <= '/') goto yy87; - if(yych <= '9') goto yy98; - goto yy87; - } else { - if(yych <= 'E') goto yy100; - if(yych != 'e') goto yy87; - goto yy100; - } -yy100: yych = *++YYCURSOR; - if(yych <= ','){ - if(yych != '+') goto yy56; - goto yy101; - } else { - if(yych <= '-') goto yy101; - if(yych <= '/') goto yy56; - if(yych <= '9') goto yy102; - goto yy56; - } -yy101: yych = *++YYCURSOR; - if(yych <= '/') goto yy56; - if(yych >= ':') goto yy56; - goto yy102; -yy102: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy103; -yy103: if(yych <= '/') goto yy87; - if(yych <= '9') goto yy102; - goto yy87; -yy104: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy105; -yy105: if(yybm[0+yych] & 128) { - goto yy104; - } - goto yy106; -yy106: -{ - savech = s->tok[TOKLEN]; - s->tok[TOKLEN] = '\0'; - lvalp->intn = yasm_intnum_create_bin(TOK+2); - s->tok[TOKLEN] = savech; - RETURN(INTNUM); - } -} -} - - - /* C-style comment; nesting not supported */ -comment: - SCANINIT(); - - { - -{ - YYCTYPE yych; - goto yy107; - ++YYCURSOR; -yy107: - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if(yych == '\n') goto yy111; - if(yych != '*') goto yy113; - goto yy109; -yy109: yych = *++YYCURSOR; - if(yych == '/') goto yy114; - goto yy110; -yy110: -{ - if (cursor == s->eof) - return 0; - goto comment; - } -yy111: yych = *++YYCURSOR; - goto yy112; -yy112: -{ - if (parser_gas->save_input) - cursor = save_line(parser_gas, cursor); - RETURN(s->tok[0]); - } -yy113: yych = *++YYCURSOR; - goto yy110; -yy114: yych = *++YYCURSOR; - goto yy115; -yy115: -{ parser_gas->state = INITIAL; goto scan; } -} -} - - - /* Single line comment. */ -line_comment: - { - static unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - -{ - YYCTYPE yych; - goto yy116; -yy117: ++YYCURSOR; -yy116: - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy118; -yy118: if(yybm[0+yych] & 128) { - goto yy117; - } - goto yy119; -yy119: -{ goto scan; } -} -} - - - /* .section directive (the section name portion thereof) */ -section_directive: - SCANINIT(); - - { - static unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 128, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - -{ - YYCTYPE yych; - goto yy120; - ++YYCURSOR; -yy120: - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if(yych <= '$'){ - if(yych <= '\r'){ - if(yych <= '\t'){ - if(yych <= '\b') goto yy132; - goto yy126; - } else { - if(yych <= '\n') goto yy130; - if(yych <= '\f') goto yy132; - goto yy126; - } - } else { - if(yych <= '!'){ - if(yych == ' ') goto yy126; - goto yy132; - } else { - if(yych <= '"') goto yy124; - if(yych <= '#') goto yy132; - goto yy122; - } - } - } else { - if(yych <= '@'){ - if(yych <= '.'){ - if(yych <= '+') goto yy132; - if(yych <= ',') goto yy128; - goto yy122; - } else { - if(yych <= '/') goto yy132; - if(yych >= ':') goto yy132; - goto yy122; - } - } else { - if(yych <= '_'){ - if(yych <= 'Z') goto yy122; - if(yych <= '^') goto yy132; - goto yy122; - } else { - if(yych <= '`') goto yy132; - if(yych >= '{') goto yy132; - goto yy122; - } - } - } -yy122: yych = *++YYCURSOR; - goto yy137; -yy123: -{ - lvalp->str.contents = yasm__xstrndup(TOK, TOKLEN); - lvalp->str.len = TOKLEN; - parser_gas->state = INITIAL; - RETURN(ID); - } -yy124: yych = *++YYCURSOR; - goto yy125; -yy125: -{ goto stringconst; } -yy126: yych = *++YYCURSOR; - goto yy135; -yy127: -{ goto section_directive; } -yy128: yych = *++YYCURSOR; - goto yy129; -yy129: -{ - parser_gas->state = INITIAL; - RETURN(s->tok[0]); - } -yy130: yych = *++YYCURSOR; - goto yy131; -yy131: -{ - if (parser_gas->save_input) - cursor = save_line(parser_gas, cursor); - parser_gas->state = INITIAL; - RETURN(s->tok[0]); - } -yy132: yych = *++YYCURSOR; - goto yy133; -yy133: -{ - yasm_warn_set(YASM_WARN_UNREC_CHAR, - N_("ignoring unrecognized character `%s'"), - yasm__conv_unprint(s->tok[0])); - goto section_directive; - } -yy134: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy135; -yy135: if(yybm[0+yych] & 64) { - goto yy134; - } - goto yy127; -yy136: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy137; -yy137: if(yybm[0+yych] & 128) { - goto yy136; - } - goto yy123; -} -} - - - /* filename portion of nasm preproc %line */ -nasm_filename: - strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE); - strbuf_size = STRBUF_ALLOC_SIZE; - count = 0; - -nasm_filename_scan: - SCANINIT(); - - { - static unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - -{ - YYCTYPE yych; - goto yy138; - ++YYCURSOR; -yy138: - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if(yych <= '\f'){ - if(yych <= '\b') goto yy144; - if(yych <= '\t') goto yy142; - if(yych >= '\v') goto yy144; - goto yy140; - } else { - if(yych <= '\r') goto yy142; - if(yych == ' ') goto yy142; - goto yy144; - } -yy140: yych = *++YYCURSOR; - goto yy141; -yy141: -{ - strbuf_append(count++, cursor, s, '\0'); - lvalp->str.contents = (char *)strbuf; - lvalp->str.len = count; - parser_gas->state = INITIAL; - RETURN(STRING); - } -yy142: yych = *++YYCURSOR; - goto yy147; -yy143: -{ goto nasm_filename_scan; } -yy144: yych = *++YYCURSOR; - goto yy145; -yy145: -{ - if (cursor == s->eof) { - strbuf_append(count++, cursor, s, '\0'); - lvalp->str.contents = (char *)strbuf; - lvalp->str.len = count; - parser_gas->state = INITIAL; - RETURN(STRING); - } - strbuf_append(count++, cursor, s, s->tok[0]); - goto nasm_filename_scan; - } -yy146: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy147; -yy147: if(yybm[0+yych] & 128) { - goto yy146; - } - goto yy143; -} -} - - - /* character constant values */ -charconst: - /*TODO*/ - - /* string constant values */ -stringconst: - strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE); - strbuf_size = STRBUF_ALLOC_SIZE; - count = 0; - -stringconst_scan: - SCANINIT(); - - { - -{ - YYCTYPE yych; - goto yy148; - ++YYCURSOR; -yy148: - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if(yych == '"') goto yy152; - if(yych != '\\') goto yy154; - goto yy150; -yy150: yych = *++YYCURSOR; - if(yych != '\n') goto yy155; - goto yy151; -yy151: -{ - if (cursor == s->eof) { - yasm_error_set(YASM_ERROR_SYNTAX, - N_("unexpected end of file in string")); - lvalp->str.contents = (char *)strbuf; - lvalp->str.len = count; - RETURN(STRING); - } - strbuf_append(count++, cursor, s, s->tok[0]); - goto stringconst_scan; - } -yy152: yych = *++YYCURSOR; - goto yy153; -yy153: -{ - strbuf_append(count, cursor, s, '\0'); - yasm_unescape_cstring(strbuf, &count); - lvalp->str.contents = (char *)strbuf; - lvalp->str.len = count; - RETURN(STRING); - } -yy154: yych = *++YYCURSOR; - goto yy151; -yy155: yych = *++YYCURSOR; - goto yy156; -yy156: -{ - if (cursor == s->eof) { - yasm_error_set(YASM_ERROR_SYNTAX, - N_("unexpected end of file in string")); - lvalp->str.contents = (char *)strbuf; - lvalp->str.len = count; - RETURN(STRING); - } - strbuf_append(count++, cursor, s, '\\'); - strbuf_append(count++, cursor, s, s->tok[1]); - goto stringconst_scan; - } -} -} - -} - +/* Generated by re2c + */ +/* + * GAS-compatible re2c lexer + * + * Copyright (C) 2005-2007 Peter Johnson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the author nor the names of other contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include <util.h> + +#include <libyasm.h> + +#include "modules/parsers/gas/gas-parser.h" + + +#define BSIZE 8192 + +#define YYCURSOR cursor +#define YYLIMIT (s->lim) +#define YYMARKER (s->ptr) +#define YYFILL(n) {cursor = fill(parser_gas, cursor);} + +#define RETURN(i) do {s->cur = cursor; parser_gas->tokch = s->tok[0]; \ + return i;} while (0) + +#define SCANINIT() {s->tok = cursor;} + +#define TOK ((char *)s->tok) +#define TOKLEN (size_t)(cursor-s->tok) + +/* Bridge function to convert byte-oriented parser with line-oriented + * preprocessor. + */ +static size_t +preproc_input(yasm_parser_gas *parser_gas, /*@out@*/ YYCTYPE *buf, + size_t max_size) +{ + size_t tot=0; + while (max_size > 0) { + size_t n; + + if (!parser_gas->line) { + parser_gas->line = yasm_preproc_get_line(parser_gas->preproc); + if (!parser_gas->line) + return tot; /* EOF */ + parser_gas->linepos = parser_gas->line; + parser_gas->lineleft = strlen(parser_gas->line) + 1; + parser_gas->line[parser_gas->lineleft-1] = '\n'; + } + + n = parser_gas->lineleft<max_size ? parser_gas->lineleft : max_size; + strncpy((char *)buf+tot, parser_gas->linepos, n); + + if (n == parser_gas->lineleft) { + yasm_xfree(parser_gas->line); + parser_gas->line = NULL; + } else { + parser_gas->lineleft -= n; + parser_gas->linepos += n; + } + + tot += n; + max_size -= n; + } + return tot; +} +#if 0 +static size_t +fill_input(void *d, unsigned char *buf, size_t max) +{ + return yasm_preproc_input((yasm_preproc *)d, (char *)buf, max); +} +#endif +static YYCTYPE * +fill(yasm_parser_gas *parser_gas, YYCTYPE *cursor) +{ + yasm_scanner *s = &parser_gas->s; + int first = 0; + if(!s->eof){ + size_t cnt = s->tok - s->bot; + if(cnt){ + memmove(s->bot, s->tok, (size_t)(s->lim - s->tok)); + s->tok = s->bot; + s->ptr -= cnt; + cursor -= cnt; + s->lim -= cnt; + } + if (!s->bot) + first = 1; + if((s->top - s->lim) < BSIZE){ + YYCTYPE *buf = yasm_xmalloc((size_t)(s->lim - s->bot) + BSIZE); + memcpy(buf, s->tok, (size_t)(s->lim - s->tok)); + s->tok = buf; + s->ptr = &buf[s->ptr - s->bot]; + cursor = &buf[cursor - s->bot]; + s->lim = &buf[s->lim - s->bot]; + s->top = &s->lim[BSIZE]; + if (s->bot) + yasm_xfree(s->bot); + s->bot = buf; + } + if((cnt = preproc_input(parser_gas, s->lim, BSIZE)) == 0) { + s->eof = &s->lim[cnt]; *s->eof++ = '\n'; + } + s->lim += cnt; + if (first && parser_gas->save_input) { + int i; + YYCTYPE *saveline; + parser_gas->save_last ^= 1; + saveline = parser_gas->save_line[parser_gas->save_last]; + /* save next line into cur_line */ + for (i=0; i<79 && &s->tok[i] < s->lim && s->tok[i] != '\n'; i++) + saveline[i] = s->tok[i]; + saveline[i] = '\0'; + } + } + return cursor; +} + +static YYCTYPE * +save_line(yasm_parser_gas *parser_gas, YYCTYPE *cursor) +{ + yasm_scanner *s = &parser_gas->s; + int i = 0; + YYCTYPE *saveline; + + parser_gas->save_last ^= 1; + saveline = parser_gas->save_line[parser_gas->save_last]; + + /* save next line into cur_line */ + if ((YYLIMIT - YYCURSOR) < 80) + YYFILL(80); + for (i=0; i<79 && &cursor[i] < s->lim && cursor[i] != '\n'; i++) + saveline[i] = cursor[i]; + saveline[i] = '\0'; + return cursor; +} + +/* starting size of string buffer */ +#define STRBUF_ALLOC_SIZE 128 + +/* string buffer used when parsing strings/character constants */ +static YYCTYPE *strbuf = NULL; + +/* length of strbuf (including terminating NULL character) */ +static size_t strbuf_size = 0; + +static void +strbuf_append(size_t count, YYCTYPE *cursor, yasm_scanner *s, int ch) +{ + if (count >= strbuf_size) { + strbuf = yasm_xrealloc(strbuf, strbuf_size + STRBUF_ALLOC_SIZE); + strbuf_size += STRBUF_ALLOC_SIZE; + } + strbuf[count] = ch; +} + + + + +int +gas_parser_lex(YYSTYPE *lvalp, yasm_parser_gas *parser_gas) +{ + yasm_scanner *s = &parser_gas->s; + YYCTYPE *cursor = s->cur; + size_t count; + YYCTYPE savech; + + /* Handle one token of lookahead */ + if (parser_gas->peek_token != NONE) { + int tok = parser_gas->peek_token; + *lvalp = parser_gas->peek_tokval; /* structure copy */ + parser_gas->tokch = parser_gas->peek_tokch; + parser_gas->peek_token = NONE; + return tok; + } + + /* Catch EOF */ + if (s->eof && cursor == s->eof) + return 0; + + /* Jump to proper "exclusive" states */ + switch (parser_gas->state) { + case COMMENT: + goto comment; + case SECTION_DIRECTIVE: + goto section_directive; + case NASM_FILENAME: + goto nasm_filename; + default: + break; + } + +scan: + SCANINIT(); + + { + static unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, + 254, 254, 126, 126, 126, 126, 126, 126, + 94, 94, 0, 0, 0, 0, 0, 0, + 8, 78, 78, 78, 78, 78, 78, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 0, 0, 0, 12, + 0, 78, 78, 78, 78, 78, 78, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy0; + ++YYCURSOR; +yy0: + if((YYLIMIT - YYCURSOR) < 5) YYFILL(5); + yych = *YYCURSOR; + if(yych <= '/'){ + if(yych <= '#'){ + if(yych <= '\r'){ + if(yych <= '\t'){ + if(yych <= '\b') goto yy30; + goto yy26; + } else { + if(yych <= '\n') goto yy28; + if(yych <= '\f') goto yy30; + goto yy26; + } + } else { + if(yych <= ' '){ + if(yych <= '\037') goto yy30; + goto yy26; + } else { + if(yych <= '!') goto yy17; + if(yych <= '"') goto yy11; + goto yy24; + } + } + } else { + if(yych <= '*'){ + if(yych <= '%'){ + if(yych <= '$') goto yy17; + goto yy22; + } else { + if(yych == '\'') goto yy9; + goto yy17; + } + } else { + if(yych <= ','){ + if(yych <= '+') goto yy5; + goto yy17; + } else { + if(yych <= '-') goto yy5; + if(yych <= '.') goto yy7; + goto yy18; + } + } + } + } else { + if(yych <= 'Z'){ + if(yych <= '<'){ + if(yych <= '9'){ + if(yych >= '1') goto yy4; + goto yy2; + } else { + if(yych <= ':') goto yy17; + if(yych <= ';') goto yy19; + goto yy13; + } + } else { + if(yych <= '>'){ + if(yych <= '=') goto yy17; + goto yy15; + } else { + if(yych <= '?') goto yy30; + if(yych <= '@') goto yy17; + goto yy21; + } + } + } else { + if(yych <= 'z'){ + if(yych <= '^'){ + if(yych <= ']') goto yy30; + goto yy17; + } else { + if(yych == '`') goto yy30; + goto yy21; + } + } else { + if(yych <= '|'){ + if(yych <= '{') goto yy30; + goto yy17; + } else { + if(yych == '~') goto yy17; + goto yy30; + } + } + } + } +yy2: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= 'T'){ + if(yych <= 'A'){ + if(yych <= '/'){ + if(yych == '.') goto yy90; + goto yy3; + } else { + if(yych <= '9') goto yy90; + if(yych <= ':') goto yy81; + goto yy3; + } + } else { + if(yych <= 'E'){ + if(yych <= 'B') goto yy85; + if(yych >= 'D') goto yy88; + goto yy3; + } else { + if(yych <= 'F') goto yy86; + if(yych >= 'T') goto yy88; + goto yy3; + } + } + } else { + if(yych <= 'e'){ + if(yych <= 'a'){ + if(yych == 'X') goto yy92; + goto yy3; + } else { + if(yych <= 'b') goto yy85; + if(yych >= 'd') goto yy88; + goto yy3; + } + } else { + if(yych <= 't'){ + if(yych <= 'f') goto yy86; + if(yych >= 't') goto yy88; + goto yy3; + } else { + if(yych == 'x') goto yy92; + goto yy3; + } + } + } +yy3: +{ + savech = s->tok[TOKLEN]; + s->tok[TOKLEN] = '\0'; + lvalp->intn = yasm_intnum_create_dec(TOK); + s->tok[TOKLEN] = savech; + RETURN(INTNUM); + } +yy4: yych = *++YYCURSOR; + if(yych <= 'E'){ + if(yych <= ':'){ + if(yych <= '9') goto yy84; + goto yy81; + } else { + if(yych == 'B') goto yy77; + goto yy84; + } + } else { + if(yych <= 'b'){ + if(yych <= 'F') goto yy79; + if(yych <= 'a') goto yy84; + goto yy77; + } else { + if(yych == 'f') goto yy79; + goto yy84; + } + } +yy5: yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == '.') goto yy61; + if(yych <= '/') goto yy6; + if(yych <= '9') goto yy59; + goto yy6; +yy6: +{ RETURN(s->tok[0]); } +yy7: yych = *++YYCURSOR; + if(yybm[0+yych] & 16) { + goto yy49; + } + goto yy37; +yy8: +{ + lvalp->str.contents = yasm__xstrndup(TOK, TOKLEN); + lvalp->str.len = TOKLEN; + RETURN(ID); + } +yy9: yych = *++YYCURSOR; + goto yy10; +yy10: +{ + goto charconst; + } +yy11: yych = *++YYCURSOR; + goto yy12; +yy12: +{ + goto stringconst; + } +yy13: yych = *++YYCURSOR; + if(yych == '<') goto yy47; + goto yy14; +yy14: +{ RETURN(LEFT_OP); } +yy15: yych = *++YYCURSOR; + if(yych == '>') goto yy45; + goto yy16; +yy16: +{ RETURN(RIGHT_OP); } +yy17: yych = *++YYCURSOR; + goto yy6; +yy18: yych = *++YYCURSOR; + if(yych == '*') goto yy43; + if(yych == '/') goto yy41; + goto yy6; +yy19: yych = *++YYCURSOR; + goto yy20; +yy20: +{ + parser_gas->state = INITIAL; + RETURN(s->tok[0]); + } +yy21: yych = *++YYCURSOR; + goto yy37; +yy22: yych = *++YYCURSOR; + if(yybm[0+yych] & 2) { + goto yy33; + } + goto yy23; +yy23: +{ + yasm_warn_set(YASM_WARN_UNREC_CHAR, + N_("ignoring unrecognized character `%s'"), + yasm__conv_unprint(s->tok[0])); + goto scan; + } +yy24: yych = *++YYCURSOR; + goto yy25; +yy25: +{ + if (parser_gas->is_cpp_preproc) + { + RETURN(CPP_LINE_MARKER); + } else + goto line_comment; + } +yy26: yych = *++YYCURSOR; + goto yy32; +yy27: +{ goto scan; } +yy28: yych = *++YYCURSOR; + goto yy29; +yy29: +{ + if (parser_gas->save_input) + cursor = save_line(parser_gas, cursor); + parser_gas->state = INITIAL; + RETURN(s->tok[0]); + } +yy30: yych = *++YYCURSOR; + goto yy23; +yy31: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy32; +yy32: if(yybm[0+yych] & 1) { + goto yy31; + } + goto yy27; +yy33: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy34; +yy34: if(yybm[0+yych] & 2) { + goto yy33; + } + goto yy35; +yy35: +{ + savech = s->tok[TOKLEN]; + s->tok[TOKLEN] = '\0'; + if (parser_gas->is_nasm_preproc && strcmp(TOK+1, "line") == 0) { + s->tok[TOKLEN] = savech; + RETURN(NASM_LINE_MARKER); + } + + switch (yasm_arch_parse_check_regtmod + (p_object->arch, TOK+1, TOKLEN-1, &lvalp->arch_data)) { + case YASM_ARCH_REG: + s->tok[TOKLEN] = savech; + RETURN(REG); + case YASM_ARCH_REGGROUP: + s->tok[TOKLEN] = savech; + RETURN(REGGROUP); + case YASM_ARCH_SEGREG: + s->tok[TOKLEN] = savech; + RETURN(SEGREG); + default: + break; + } + yasm_error_set(YASM_ERROR_GENERAL, + N_("Unrecognized register name `%s'"), s->tok); + s->tok[TOKLEN] = savech; + lvalp->arch_data = 0; + RETURN(REG); + } +yy36: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy37; +yy37: if(yybm[0+yych] & 4) { + goto yy36; + } + if(yych != '@') goto yy8; + goto yy38; +yy38: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy39; +yy39: if(yybm[0+yych] & 8) { + goto yy38; + } + goto yy40; +yy40: +{ + /* if @ not part of ID, move the scanner cursor to the first @ */ + if (!((yasm_objfmt_base *)p_object->objfmt)->module->id_at_ok) + cursor = (unsigned char *)strchr(TOK, '@'); + lvalp->str.contents = yasm__xstrndup(TOK, TOKLEN); + lvalp->str.len = TOKLEN; + RETURN(ID); + } +yy41: yych = *++YYCURSOR; + goto yy42; +yy42: +{ goto line_comment; } +yy43: yych = *++YYCURSOR; + goto yy44; +yy44: +{ parser_gas->state = COMMENT; goto comment; } +yy45: yych = *++YYCURSOR; + goto yy46; +yy46: +{ RETURN(RIGHT_OP); } +yy47: yych = *++YYCURSOR; + goto yy48; +yy48: +{ RETURN(LEFT_OP); } +yy49: ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + goto yy50; +yy50: if(yybm[0+yych] & 16) { + goto yy49; + } + if(yych <= 'E'){ + if(yych <= '.'){ + if(yych == '$') goto yy36; + if(yych >= '.') goto yy36; + goto yy51; + } else { + if(yych <= '?') goto yy51; + if(yych <= '@') goto yy38; + if(yych <= 'D') goto yy36; + goto yy52; + } + } else { + if(yych <= '`'){ + if(yych <= 'Z') goto yy36; + if(yych == '_') goto yy36; + goto yy51; + } else { + if(yych == 'e') goto yy52; + if(yych <= 'z') goto yy36; + goto yy51; + } + } +yy51: +{ + savech = s->tok[TOKLEN]; + s->tok[TOKLEN] = '\0'; + lvalp->flt = yasm_floatnum_create(TOK); + s->tok[TOKLEN] = savech; + RETURN(FLTNUM); + } +yy52: yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= ','){ + if(yych == '+') goto yy55; + goto yy37; + } else { + if(yych <= '-') goto yy55; + if(yych <= '/') goto yy37; + if(yych >= ':') goto yy37; + goto yy53; + } +yy53: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy54; +yy54: if(yych <= '?'){ + if(yych <= '-'){ + if(yych == '$') goto yy36; + goto yy51; + } else { + if(yych <= '.') goto yy36; + if(yych <= '/') goto yy51; + if(yych <= '9') goto yy53; + goto yy51; + } + } else { + if(yych <= '^'){ + if(yych <= '@') goto yy38; + if(yych <= 'Z') goto yy36; + goto yy51; + } else { + if(yych == '`') goto yy51; + if(yych <= 'z') goto yy36; + goto yy51; + } + } +yy55: yych = *++YYCURSOR; + if(yych <= '/') goto yy56; + if(yych <= '9') goto yy57; + goto yy56; +yy56: YYCURSOR = YYMARKER; + switch(yyaccept){ + case 0: goto yy3; + case 6: goto yy91; + case 3: goto yy51; + case 4: goto yy66; + case 5: goto yy87; + case 1: goto yy6; + case 2: goto yy8; + } +yy57: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy58; +yy58: if(yych <= '/') goto yy51; + if(yych <= '9') goto yy57; + goto yy51; +yy59: ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); + yych = *YYCURSOR; + goto yy60; +yy60: if(yych == '.') goto yy65; + if(yych <= '/') goto yy56; + if(yych <= '9') goto yy59; + goto yy56; +yy61: yych = *++YYCURSOR; + if(yych <= '/') goto yy56; + if(yych >= ':') goto yy56; + goto yy62; +yy62: yyaccept = 3; + YYMARKER = ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + goto yy63; +yy63: if(yych <= 'D'){ + if(yych <= '/') goto yy51; + if(yych <= '9') goto yy62; + goto yy51; + } else { + if(yych <= 'E') goto yy64; + if(yych != 'e') goto yy51; + goto yy64; + } +yy64: yych = *++YYCURSOR; + if(yych <= ','){ + if(yych == '+') goto yy55; + goto yy56; + } else { + if(yych <= '-') goto yy55; + if(yych <= '/') goto yy56; + if(yych <= '9') goto yy57; + goto yy56; + } +yy65: yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= 'D'){ + if(yych <= '/') goto yy66; + if(yych <= '9') goto yy67; + goto yy66; + } else { + if(yych <= 'E') goto yy69; + if(yych == 'e') goto yy69; + goto yy66; + } +yy66: +{ + savech = s->tok[TOKLEN]; + s->tok[TOKLEN] = '\0'; + lvalp->flt = yasm_floatnum_create(TOK); + s->tok[TOKLEN] = savech; + RETURN(FLTNUM); + } +yy67: yyaccept = 3; + YYMARKER = ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + goto yy68; +yy68: if(yych <= 'D'){ + if(yych <= '/') goto yy51; + if(yych <= '9') goto yy67; + goto yy51; + } else { + if(yych <= 'E') goto yy73; + if(yych == 'e') goto yy73; + goto yy51; + } +yy69: yych = *++YYCURSOR; + if(yych <= ','){ + if(yych != '+') goto yy56; + goto yy70; + } else { + if(yych <= '-') goto yy70; + if(yych <= '/') goto yy56; + if(yych <= '9') goto yy71; + goto yy56; + } +yy70: yych = *++YYCURSOR; + if(yych <= '/') goto yy56; + if(yych >= ':') goto yy56; + goto yy71; +yy71: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy72; +yy72: if(yych <= '/') goto yy66; + if(yych <= '9') goto yy71; + goto yy66; +yy73: yych = *++YYCURSOR; + if(yych <= ','){ + if(yych != '+') goto yy56; + goto yy74; + } else { + if(yych <= '-') goto yy74; + if(yych <= '/') goto yy56; + if(yych <= '9') goto yy75; + goto yy56; + } +yy74: yych = *++YYCURSOR; + if(yych <= '/') goto yy56; + if(yych >= ':') goto yy56; + goto yy75; +yy75: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy76; +yy76: if(yych <= '/') goto yy51; + if(yych <= '9') goto yy75; + goto yy51; +yy77: yych = *++YYCURSOR; + goto yy78; +yy78: +{ + /* build local label name */ + lvalp->str.contents = yasm_xmalloc(30); + lvalp->str.len = + sprintf(lvalp->str.contents, "L%c\001%lu", s->tok[0], + parser_gas->local[s->tok[0]-'0']); + RETURN(ID); + } +yy79: yych = *++YYCURSOR; + goto yy80; +yy80: +{ + /* build local label name */ + lvalp->str.contents = yasm_xmalloc(30); + lvalp->str.len = + sprintf(lvalp->str.contents, "L%c\001%lu", s->tok[0], + parser_gas->local[s->tok[0]-'0']+1); + RETURN(ID); + } +yy81: yych = *++YYCURSOR; + goto yy82; +yy82: +{ + /* increment label index */ + parser_gas->local[s->tok[0]-'0']++; + /* build local label name */ + lvalp->str.contents = yasm_xmalloc(30); + lvalp->str.len = + sprintf(lvalp->str.contents, "L%c\001%lu", s->tok[0], + parser_gas->local[s->tok[0]-'0']); + RETURN(LABEL); + } +yy83: ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); + yych = *YYCURSOR; + goto yy84; +yy84: if(yych == '.') goto yy65; + if(yych <= '/') goto yy3; + if(yych <= '9') goto yy83; + goto yy3; +yy85: yych = *++YYCURSOR; + if(yybm[0+yych] & 128) { + goto yy104; + } + goto yy78; +yy86: yyaccept = 5; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == '+') goto yy96; + if(yych == '-') goto yy96; + goto yy97; +yy87: +{ + savech = s->tok[TOKLEN]; + s->tok[TOKLEN] = '\0'; + lvalp->flt = yasm_floatnum_create(TOK+2); + s->tok[TOKLEN] = savech; + RETURN(FLTNUM); + } +yy88: yyaccept = 5; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == '+') goto yy96; + if(yych == '-') goto yy96; + goto yy97; +yy89: yyaccept = 6; + YYMARKER = ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); + yych = *YYCURSOR; + goto yy90; +yy90: if(yybm[0+yych] & 32) { + goto yy89; + } + if(yych == '.') goto yy65; + if(yych <= '/') goto yy91; + if(yych <= '9') goto yy59; + goto yy91; +yy91: +{ + savech = s->tok[TOKLEN]; + s->tok[TOKLEN] = '\0'; + lvalp->intn = yasm_intnum_create_oct(TOK); + s->tok[TOKLEN] = savech; + RETURN(INTNUM); + } +yy92: yych = *++YYCURSOR; + if(yybm[0+yych] & 64) { + goto yy93; + } + goto yy56; +yy93: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy94; +yy94: if(yybm[0+yych] & 64) { + goto yy93; + } + goto yy95; +yy95: +{ + savech = s->tok[TOKLEN]; + s->tok[TOKLEN] = '\0'; + /* skip 0 and x */ + lvalp->intn = yasm_intnum_create_hex(TOK+2); + s->tok[TOKLEN] = savech; + RETURN(INTNUM); + } +yy96: yyaccept = 5; + YYMARKER = ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + goto yy97; +yy97: if(yych <= '9'){ + if(yych == '.') goto yy98; + if(yych <= '/') goto yy87; + goto yy96; + } else { + if(yych <= 'E'){ + if(yych <= 'D') goto yy87; + goto yy100; + } else { + if(yych == 'e') goto yy100; + goto yy87; + } + } +yy98: yyaccept = 5; + YYMARKER = ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + goto yy99; +yy99: if(yych <= 'D'){ + if(yych <= '/') goto yy87; + if(yych <= '9') goto yy98; + goto yy87; + } else { + if(yych <= 'E') goto yy100; + if(yych != 'e') goto yy87; + goto yy100; + } +yy100: yych = *++YYCURSOR; + if(yych <= ','){ + if(yych != '+') goto yy56; + goto yy101; + } else { + if(yych <= '-') goto yy101; + if(yych <= '/') goto yy56; + if(yych <= '9') goto yy102; + goto yy56; + } +yy101: yych = *++YYCURSOR; + if(yych <= '/') goto yy56; + if(yych >= ':') goto yy56; + goto yy102; +yy102: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy103; +yy103: if(yych <= '/') goto yy87; + if(yych <= '9') goto yy102; + goto yy87; +yy104: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy105; +yy105: if(yybm[0+yych] & 128) { + goto yy104; + } + goto yy106; +yy106: +{ + savech = s->tok[TOKLEN]; + s->tok[TOKLEN] = '\0'; + lvalp->intn = yasm_intnum_create_bin(TOK+2); + s->tok[TOKLEN] = savech; + RETURN(INTNUM); + } +} +} + + + /* C-style comment; nesting not supported */ +comment: + SCANINIT(); + + { + +{ + YYCTYPE yych; + goto yy107; + ++YYCURSOR; +yy107: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych == '\n') goto yy111; + if(yych != '*') goto yy113; + goto yy109; +yy109: yych = *++YYCURSOR; + if(yych == '/') goto yy114; + goto yy110; +yy110: +{ + if (cursor == s->eof) + return 0; + goto comment; + } +yy111: yych = *++YYCURSOR; + goto yy112; +yy112: +{ + if (parser_gas->save_input) + cursor = save_line(parser_gas, cursor); + RETURN(s->tok[0]); + } +yy113: yych = *++YYCURSOR; + goto yy110; +yy114: yych = *++YYCURSOR; + goto yy115; +yy115: +{ parser_gas->state = INITIAL; goto scan; } +} +} + + + /* Single line comment. */ +line_comment: + { + static unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + +{ + YYCTYPE yych; + goto yy116; +yy117: ++YYCURSOR; +yy116: + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy118; +yy118: if(yybm[0+yych] & 128) { + goto yy117; + } + goto yy119; +yy119: +{ goto scan; } +} +} + + + /* .section directive (the section name portion thereof) */ +section_directive: + SCANINIT(); + + { + static unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 0, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 64, 0, 0, 0, 128, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 128, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + +{ + YYCTYPE yych; + goto yy120; + ++YYCURSOR; +yy120: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= '$'){ + if(yych <= '\r'){ + if(yych <= '\t'){ + if(yych <= '\b') goto yy132; + goto yy126; + } else { + if(yych <= '\n') goto yy130; + if(yych <= '\f') goto yy132; + goto yy126; + } + } else { + if(yych <= '!'){ + if(yych == ' ') goto yy126; + goto yy132; + } else { + if(yych <= '"') goto yy124; + if(yych <= '#') goto yy132; + goto yy122; + } + } + } else { + if(yych <= '@'){ + if(yych <= '.'){ + if(yych <= '+') goto yy132; + if(yych <= ',') goto yy128; + goto yy122; + } else { + if(yych <= '/') goto yy132; + if(yych >= ':') goto yy132; + goto yy122; + } + } else { + if(yych <= '_'){ + if(yych <= 'Z') goto yy122; + if(yych <= '^') goto yy132; + goto yy122; + } else { + if(yych <= '`') goto yy132; + if(yych >= '{') goto yy132; + goto yy122; + } + } + } +yy122: yych = *++YYCURSOR; + goto yy137; +yy123: +{ + lvalp->str.contents = yasm__xstrndup(TOK, TOKLEN); + lvalp->str.len = TOKLEN; + parser_gas->state = INITIAL; + RETURN(ID); + } +yy124: yych = *++YYCURSOR; + goto yy125; +yy125: +{ goto stringconst; } +yy126: yych = *++YYCURSOR; + goto yy135; +yy127: +{ goto section_directive; } +yy128: yych = *++YYCURSOR; + goto yy129; +yy129: +{ + parser_gas->state = INITIAL; + RETURN(s->tok[0]); + } +yy130: yych = *++YYCURSOR; + goto yy131; +yy131: +{ + if (parser_gas->save_input) + cursor = save_line(parser_gas, cursor); + parser_gas->state = INITIAL; + RETURN(s->tok[0]); + } +yy132: yych = *++YYCURSOR; + goto yy133; +yy133: +{ + yasm_warn_set(YASM_WARN_UNREC_CHAR, + N_("ignoring unrecognized character `%s'"), + yasm__conv_unprint(s->tok[0])); + goto section_directive; + } +yy134: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy135; +yy135: if(yybm[0+yych] & 64) { + goto yy134; + } + goto yy127; +yy136: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy137; +yy137: if(yybm[0+yych] & 128) { + goto yy136; + } + goto yy123; +} +} + + + /* filename portion of nasm preproc %line */ +nasm_filename: + strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE); + strbuf_size = STRBUF_ALLOC_SIZE; + count = 0; + +nasm_filename_scan: + SCANINIT(); + + { + static unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + +{ + YYCTYPE yych; + goto yy138; + ++YYCURSOR; +yy138: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= '\f'){ + if(yych <= '\b') goto yy144; + if(yych <= '\t') goto yy142; + if(yych >= '\v') goto yy144; + goto yy140; + } else { + if(yych <= '\r') goto yy142; + if(yych == ' ') goto yy142; + goto yy144; + } +yy140: yych = *++YYCURSOR; + goto yy141; +yy141: +{ + strbuf_append(count++, cursor, s, '\0'); + lvalp->str.contents = (char *)strbuf; + lvalp->str.len = count; + parser_gas->state = INITIAL; + RETURN(STRING); + } +yy142: yych = *++YYCURSOR; + goto yy147; +yy143: +{ goto nasm_filename_scan; } +yy144: yych = *++YYCURSOR; + goto yy145; +yy145: +{ + if (cursor == s->eof) { + strbuf_append(count++, cursor, s, '\0'); + lvalp->str.contents = (char *)strbuf; + lvalp->str.len = count; + parser_gas->state = INITIAL; + RETURN(STRING); + } + strbuf_append(count++, cursor, s, s->tok[0]); + goto nasm_filename_scan; + } +yy146: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy147; +yy147: if(yybm[0+yych] & 128) { + goto yy146; + } + goto yy143; +} +} + + + /* character constant values */ +charconst: + /*TODO*/ + + /* string constant values */ +stringconst: + strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE); + strbuf_size = STRBUF_ALLOC_SIZE; + count = 0; + +stringconst_scan: + SCANINIT(); + + { + +{ + YYCTYPE yych; + goto yy148; + ++YYCURSOR; +yy148: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych == '"') goto yy152; + if(yych != '\\') goto yy154; + goto yy150; +yy150: yych = *++YYCURSOR; + if(yych != '\n') goto yy155; + goto yy151; +yy151: +{ + if (cursor == s->eof) { + yasm_error_set(YASM_ERROR_SYNTAX, + N_("unexpected end of file in string")); + lvalp->str.contents = (char *)strbuf; + lvalp->str.len = count; + RETURN(STRING); + } + strbuf_append(count++, cursor, s, s->tok[0]); + goto stringconst_scan; + } +yy152: yych = *++YYCURSOR; + goto yy153; +yy153: +{ + strbuf_append(count, cursor, s, '\0'); + yasm_unescape_cstring(strbuf, &count); + lvalp->str.contents = (char *)strbuf; + lvalp->str.len = count; + RETURN(STRING); + } +yy154: yych = *++YYCURSOR; + goto yy151; +yy155: yych = *++YYCURSOR; + goto yy156; +yy156: +{ + if (cursor == s->eof) { + yasm_error_set(YASM_ERROR_SYNTAX, + N_("unexpected end of file in string")); + lvalp->str.contents = (char *)strbuf; + lvalp->str.len = count; + RETURN(STRING); + } + strbuf_append(count++, cursor, s, '\\'); + strbuf_append(count++, cursor, s, s->tok[1]); + goto stringconst_scan; + } +} +} + +} + |