📄 scanner.cc
字号:
/* Generated by re2c 0.12.2 on Wed Jun 27 00:25:02 2007 *//* $Id: scanner.cc 768 2007-06-26 22:26:06Z helly $ */#include <stdlib.h>#include <string.h>#include <iostream>#include <sstream>#include "scanner.h"#include "parser.h"#include "y.tab.h"#include "globals.h"#include "dfa.h"extern YYSTYPE yylval;#ifndef MAX#define MAX(a,b) (((a)>(b))?(a):(b))#endif#define BSIZE 8192#define YYCTYPE unsigned char#define YYCURSOR cursor#define YYLIMIT lim#define YYMARKER ptr#define YYFILL(n) {cursor = fill(cursor);}#define RETURN(i) {cur = cursor; return i;}namespace re2c{Scanner::Scanner(std::istream& i, std::ostream& o) : in(i) , out(o) , bot(NULL), tok(NULL), ptr(NULL), cur(NULL), pos(NULL), lim(NULL) , top(NULL), eof(NULL), tchar(0), tline(0), cline(1), iscfg(0){ ;}char *Scanner::fill(char *cursor){ if(!eof) { uint cnt = tok - bot; if(cnt) { memcpy(bot, tok, lim - tok); tok = bot; ptr -= cnt; cursor -= cnt; pos -= cnt; lim -= cnt; } if((top - lim) < BSIZE) { char *buf = new char[(lim - bot) + BSIZE]; memcpy(buf, tok, lim - tok); tok = buf; ptr = &buf[ptr - bot]; cursor = &buf[cursor - bot]; pos = &buf[pos - bot]; lim = &buf[lim - bot]; top = &lim[BSIZE]; delete [] bot; bot = buf; } in.read(lim, BSIZE); if ((cnt = in.gcount()) != BSIZE ) { eof = &lim[cnt]; *eof++ = '\0'; } lim += cnt; } return cursor;}int Scanner::echo(){ char *cursor = cur; bool ignore_eoc = false; int ignore_cnt = 0; if (eof && cursor == eof) // Catch EOF { return 0; } tok = cursor;echo:{ { YYCTYPE yych; unsigned int yyaccept = 0; if((YYLIMIT - YYCURSOR) < 16) YYFILL(16); yych = *YYCURSOR; if(yych <= ')') { if(yych <= 0x00) goto yy7; if(yych == 0x0A) goto yy5; goto yy9; } else { if(yych <= '*') goto yy4; if(yych != '/') goto yy9; } yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych == '*') goto yy16;yy3: { goto echo; }yy4: yych = *++YYCURSOR; if(yych == '/') goto yy10; goto yy3;yy5: ++YYCURSOR; { if (ignore_eoc) { ignore_cnt++; } else { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); } tok = pos = cursor; cline++; goto echo; }yy7: ++YYCURSOR; { if (!ignore_eoc) { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok) - 1); // -1 so we don't write out the \0 } if(cursor == eof) { RETURN(0); } }yy9: yych = *++YYCURSOR; goto yy3;yy10: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if(yych == 0x0A) goto yy14; if(yych == 0x0D) goto yy12;yy11: { if (ignore_eoc) { if (ignore_cnt) { out << "\n" << sourceFileInfo; } ignore_eoc = false; ignore_cnt = 0; } else { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); } tok = pos = cursor; goto echo; }yy12: yych = *++YYCURSOR; if(yych == 0x0A) goto yy14;yy13: YYCURSOR = YYMARKER; if(yyaccept <= 0) { goto yy3; } else { goto yy11; }yy14: ++YYCURSOR; { cline++; if (ignore_eoc) { if (ignore_cnt) { out << sourceFileInfo; } ignore_eoc = false; ignore_cnt = 0; } else { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); } tok = pos = cursor; goto echo; }yy16: yych = *++YYCURSOR; if(yych != '!') goto yy13; yych = *++YYCURSOR; switch(yych) { case 'g': goto yy19; case 'i': goto yy18; case 'm': goto yy20; case 'r': goto yy21; default: goto yy13; }yy18: yych = *++YYCURSOR; if(yych == 'g') goto yy47; goto yy13;yy19: yych = *++YYCURSOR; if(yych == 'e') goto yy34; goto yy13;yy20: yych = *++YYCURSOR; if(yych == 'a') goto yy26; goto yy13;yy21: yych = *++YYCURSOR; if(yych != 'e') goto yy13; yych = *++YYCURSOR; if(yych != '2') goto yy13; yych = *++YYCURSOR; if(yych != 'c') goto yy13; ++YYCURSOR; { if (bUsedYYMaxFill && bSinglePass) { fatal("found scanner block after YYMAXFILL declaration"); } out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok)); tok = cursor; RETURN(1); }yy26: yych = *++YYCURSOR; if(yych != 'x') goto yy13; yych = *++YYCURSOR; if(yych != ':') goto yy13; yych = *++YYCURSOR; if(yych != 'r') goto yy13; yych = *++YYCURSOR; if(yych != 'e') goto yy13; yych = *++YYCURSOR; if(yych != '2') goto yy13; yych = *++YYCURSOR; if(yych != 'c') goto yy13; ++YYCURSOR; { if (bUsedYYMaxFill) { fatal("cannot generate YYMAXFILL twice"); } out << "#define YYMAXFILL " << maxFill << std::endl; tok = pos = cursor; ignore_eoc = true; bUsedYYMaxFill = true; goto echo; }yy34: yych = *++YYCURSOR; if(yych != 't') goto yy13; yych = *++YYCURSOR; if(yych != 's') goto yy13; yych = *++YYCURSOR; if(yych != 't') goto yy13; yych = *++YYCURSOR; if(yych != 'a') goto yy13; yych = *++YYCURSOR; if(yych != 't') goto yy13; yych = *++YYCURSOR; if(yych != 'e') goto yy13; yych = *++YYCURSOR; if(yych != ':') goto yy13; yych = *++YYCURSOR; if(yych != 'r') goto yy13; yych = *++YYCURSOR; if(yych != 'e') goto yy13; yych = *++YYCURSOR; if(yych != '2') goto yy13; yych = *++YYCURSOR; if(yych != 'c') goto yy13; ++YYCURSOR; { tok = pos = cursor; genGetState(out, topIndent, 0); ignore_eoc = true; goto echo; }yy47: yych = *++YYCURSOR; if(yych != 'n') goto yy13; yych = *++YYCURSOR; if(yych != 'o') goto yy13; yych = *++YYCURSOR; if(yych != 'r') goto yy13; yych = *++YYCURSOR; if(yych != 'e') goto yy13; yych = *++YYCURSOR; if(yych != ':') goto yy13; yych = *++YYCURSOR; if(yych != 'r') goto yy13; yych = *++YYCURSOR; if(yych != 'e') goto yy13; yych = *++YYCURSOR; if(yych != '2') goto yy13; yych = *++YYCURSOR; if(yych != 'c') goto yy13; ++YYCURSOR; { tok = pos = cursor; ignore_eoc = true; goto echo; } }}}int Scanner::scan(){ char *cursor = cur; uint depth;scan: tchar = cursor - pos; tline = cline; tok = cursor; if (iscfg == 1) { goto config; } else if (iscfg == 2) { goto value; }{ static const unsigned char yybm[] = { 112, 112, 112, 112, 112, 112, 112, 112, 112, 116, 0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 116, 112, 48, 112, 112, 112, 112, 80, 112, 112, 112, 112, 112, 112, 112, 112, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 112, 112, 112, 112, 112, 112, 112, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 112, 0, 96, 112, 120, 112, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, }; { YYCTYPE yych; unsigned int yyaccept = 0; if((YYLIMIT - YYCURSOR) < 5) YYFILL(5); yych = *YYCURSOR; if(yych <= ':') { if(yych <= '"') { if(yych <= 0x0C) { if(yych <= 0x08) goto yy85; if(yych <= 0x09) goto yy79; if(yych <= 0x0A) goto yy81; goto yy85; } else { if(yych <= 0x1F) { if(yych <= 0x0D) goto yy83; goto yy85; } else { if(yych <= ' ') goto yy79; if(yych <= '!') goto yy85; goto yy66; } } } else { if(yych <= '*') { if(yych <= '&') goto yy85; if(yych <= '\'') goto yy68; if(yych <= ')') goto yy72; goto yy64; } else { if(yych <= '-') { if(yych <= '+') goto yy73; goto yy85; } else { if(yych <= '.') goto yy77; if(yych <= '/') goto yy62; goto yy85; } } } } else { if(yych <= '\\') { if(yych <= '>') { if(yych == '<') goto yy85; if(yych <= '=') goto yy72; goto yy85; } else { if(yych <= '@') { if(yych <= '?') goto yy73; goto yy85; } else { if(yych <= 'Z') goto yy76; if(yych <= '[') goto yy70; goto yy72; } } } else { if(yych <= 'q') { if(yych == '_') goto yy76; if(yych <= '`') goto yy85; goto yy76; } else { if(yych <= 'z') { if(yych <= 'r') goto yy74; goto yy76; } else { if(yych <= '{') goto yy60; if(yych <= '|') goto yy72; goto yy85; } } } }yy60: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych <= '/') { if(yych == ',') goto yy126; } else { if(yych <= '0') goto yy123; if(yych <= '9') goto yy124; }yy61: { depth = 1; goto code; }yy62: ++YYCURSOR; if((yych = *YYCURSOR) == '*') goto yy121;yy63: { RETURN(*tok); }yy64: ++YYCURSOR; if((yych = *YYCURSOR) == '/') goto yy119;yy65: { yylval.op = *tok; RETURN(CLOSE); }yy66: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if(yych != 0x0A) goto yy115;yy67: { fatal("unterminated string constant (missing \")"); }yy68: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if(yych != 0x0A) goto yy110;yy69: { fatal("unterminated string constant (missing ')"); }yy70: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if(yych == 0x0A) goto yy71; if(yych == '^') goto yy101; goto yy100;yy71: { fatal("unterminated range (missing ])"); }yy72: yych = *++YYCURSOR; goto yy63;yy73: yych = *++YYCURSOR; goto yy65;yy74: ++YYCURSOR; if((yych = *YYCURSOR) == 'e') goto yy91; goto yy90;yy75: { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; }yy76: yych = *++YYCURSOR; goto yy90;yy77: ++YYCURSOR; { cur = cursor; yylval.regexp = mkDot(); return RANGE; }yy79: ++YYCURSOR; yych = *YYCURSOR; goto yy88;yy80: { goto scan; }yy81: ++YYCURSOR;yy82: { if(cursor == eof) RETURN(0); pos = cursor; cline++; goto scan; }yy83: ++YYCURSOR; if((yych = *YYCURSOR) == 0x0A) goto yy86;yy84: { std::ostringstream msg; msg << "unexpected character: "; prtChOrHex(msg, *tok); fatal(msg.str().c_str()); goto scan; }yy85: yych = *++YYCURSOR; goto yy84;yy86: yych = *++YYCURSOR; goto yy82;yy87: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR;yy88: if(yybm[0+yych] & 4) { goto yy87; } goto yy80;yy89: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR;yy90: if(yybm[0+yych] & 8) { goto yy89; } goto yy75;yy91: yych = *++YYCURSOR; if(yych != '2') goto yy90; yych = *++YYCURSOR; if(yych != 'c') goto yy90; yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if(yych != ':') goto yy90;yy94: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= '^') { if(yych <= '@') goto yy95; if(yych <= 'Z') goto yy96; } else { if(yych == '`') goto yy95; if(yych <= 'z') goto yy96; }yy95: YYCURSOR = YYMARKER; if(yyaccept <= 3) { if(yyaccept <= 1) { if(yyaccept <= 0) { goto yy61; } else { goto yy67; } } else { if(yyaccept <= 2) { goto yy69; } else { goto yy71; } } } else { if(yyaccept <= 5) { if(yyaccept <= 4) { goto yy75; } else { goto yy98; } } else { goto yy127; } }yy96: yyaccept = 5; YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 'Z') { if(yych <= '9') { if(yych >= '0') goto yy96; } else { if(yych <= ':') goto yy94; if(yych >= 'A') goto yy96; } } else { if(yych <= '_') { if(yych >= '_') goto yy96; } else { if(yych <= '`') goto yy98; if(yych <= 'z') goto yy96; } }yy98: { cur = cursor; tok+= 5; /* skip "re2c:" */ iscfg = 1; yylval.str = new Str(token()); return CONFIG; }yy99: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR;yy100: if(yybm[0+yych] & 16) { goto yy99; } if(yych <= '[') goto yy95; if(yych <= '\\') goto yy103; goto yy104;yy101: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= '[') { if(yych == 0x0A) goto yy95; goto yy101; } else { if(yych <= '\\') goto yy106; if(yych <= ']') goto yy107; goto yy101; }yy103:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -