scanner.c
来自「a little DFA compiler.」· C语言 代码 · 共 1,421 行 · 第 1/2 页
C
1,421 行
/* Generated by re2c */#line 1 "scanner.re"/* Id: scanner.re,v 1.37 2006/02/25 12:41:41 helly Exp */#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 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;}#line 95 "scanner.re"int Scanner::echo(){ char *cursor = cur; bool ignore_eoc = false; if (eof && cursor == eof) // Catch EOF { return 0; } tok = cursor;echo:#line 96 "<stdout>"{ YYCTYPE yych; if((YYLIMIT - YYCURSOR) < 11) YYFILL(11); yych = *YYCURSOR; switch(yych) { case 0x00: goto yy7; case 0x0A: goto yy5; case '*': goto yy4; case '/': goto yy2; default: goto yy9; }yy2: yych = *(YYMARKER = ++YYCURSOR); switch(yych) { case '*': goto yy12; default: goto yy3; }yy3:#line 141 "scanner.re" { goto echo; }#line 120 "<stdout>"yy4: yych = *++YYCURSOR; switch(yych) { case '/': goto yy10; default: goto yy3; }yy5: ++YYCURSOR;#line 130 "scanner.re" { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); tok = pos = cursor; cline++; goto echo; }#line 135 "<stdout>"yy7: ++YYCURSOR;#line 135 "scanner.re" { 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); } }#line 145 "<stdout>"yy9: yych = *++YYCURSOR; goto yy3;yy10: ++YYCURSOR;#line 121 "scanner.re" { if (ignore_eoc) { ignore_eoc = false; } else { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); } tok = pos = cursor; goto echo; }#line 161 "<stdout>"yy12: yych = *++YYCURSOR; switch(yych) { case '!': goto yy14; default: goto yy13; }yy13: YYCURSOR = YYMARKER; goto yy3;yy14: yych = *++YYCURSOR; switch(yych) { case 'm': goto yy15; case 'r': goto yy16; default: goto yy13; }yy15: yych = *++YYCURSOR; switch(yych) { case 'a': goto yy21; default: goto yy13; }yy16: yych = *++YYCURSOR; switch(yych) { case 'e': goto yy17; default: goto yy13; }yy17: yych = *++YYCURSOR; switch(yych) { case '2': goto yy18; default: goto yy13; }yy18: yych = *++YYCURSOR; switch(yych) { case 'c': goto yy19; default: goto yy13; }yy19: ++YYCURSOR;#line 110 "scanner.re" { out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok)); tok = cursor; RETURN(1); }#line 210 "<stdout>"yy21: yych = *++YYCURSOR; switch(yych) { case 'x': goto yy22; default: goto yy13; }yy22: yych = *++YYCURSOR; switch(yych) { case ':': goto yy23; default: goto yy13; }yy23: yych = *++YYCURSOR; switch(yych) { case 'r': goto yy24; default: goto yy13; }yy24: yych = *++YYCURSOR; switch(yych) { case 'e': goto yy25; default: goto yy13; }yy25: yych = *++YYCURSOR; switch(yych) { case '2': goto yy26; default: goto yy13; }yy26: yych = *++YYCURSOR; switch(yych) { case 'c': goto yy27; default: goto yy13; }yy27: ++YYCURSOR;#line 115 "scanner.re" { out << "#define YYMAXFILL " << maxFill << std::endl; tok = pos = cursor; ignore_eoc = true; goto echo; }#line 256 "<stdout>"}#line 144 "scanner.re"}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; }#line 281 "<stdout>"{ YYCTYPE yych; unsigned int yyaccept = 0; if((YYLIMIT - YYCURSOR) < 5) YYFILL(5); yych = *YYCURSOR; switch(yych) { case 0x09: case ' ': goto yy50; case 0x0A: goto yy52; case 0x0D: goto yy54; case '"': goto yy37; case '\'': goto yy39; case '(': case ')': case ';': case '=': case '\\': case '|': goto yy43; case '*': goto yy35; case '+': case '?': goto yy44; case '.': goto yy48; case '/': goto yy33; 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 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy47; case '[': goto yy41; case 'r': goto yy45; case '{': goto yy31; default: goto yy56; }yy31: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); switch(yych) { case ',': goto yy97; case '0': goto yy94; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy95; default: goto yy32; }yy32:#line 166 "scanner.re" { depth = 1; goto code; }#line 383 "<stdout>"yy33: ++YYCURSOR; switch((yych = *YYCURSOR)) { case '*': goto yy92; default: goto yy34; }yy34:#line 196 "scanner.re" { RETURN(*tok); }#line 393 "<stdout>"yy35: ++YYCURSOR; switch((yych = *YYCURSOR)) { case '/': goto yy90; default: goto yy36; }yy36:#line 198 "scanner.re" { yylval.op = *tok; RETURN(CLOSE); }#line 404 "<stdout>"yy37: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); switch(yych) { case 0x0A: goto yy38; default: goto yy86; }yy38:#line 183 "scanner.re" { fatal("unterminated string constant (missing \")"); }#line 415 "<stdout>"yy39: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); switch(yych) { case 0x0A: goto yy40; default: goto yy81; }yy40:#line 184 "scanner.re" { fatal("unterminated string constant (missing ')"); }#line 426 "<stdout>"yy41: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); switch(yych) { case 0x0A: goto yy42; case '^': goto yy72; default: goto yy71; }yy42:#line 194 "scanner.re" { fatal("unterminated range (missing ])"); }#line 438 "<stdout>"yy43: yych = *++YYCURSOR; goto yy34;yy44: yych = *++YYCURSOR; goto yy36;yy45: ++YYCURSOR; switch((yych = *YYCURSOR)) { case 'e': goto yy62; default: goto yy61; }yy46:#line 225 "scanner.re" { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; }#line 456 "<stdout>"yy47: yych = *++YYCURSOR; goto yy61;yy48: ++YYCURSOR;#line 229 "scanner.re" { cur = cursor; yylval.regexp = mkDot(); return RANGE; }#line 467 "<stdout>"yy50: ++YYCURSOR; yych = *YYCURSOR; goto yy59;yy51:#line 234 "scanner.re" { goto scan; }#line 475 "<stdout>"yy52: ++YYCURSOR;yy53:#line 236 "scanner.re" { if(cursor == eof) RETURN(0); pos = cursor; cline++; goto scan; }#line 484 "<stdout>"yy54: ++YYCURSOR; switch((yych = *YYCURSOR)) { case 0x0A: goto yy57; default: goto yy55; }yy55:#line 241 "scanner.re" { std::ostringstream msg; msg << "unexpected character: "; prtChOrHex(msg, *tok); fatal(msg.str().c_str()); goto scan; }#line 499 "<stdout>"yy56: yych = *++YYCURSOR; goto yy55;yy57: yych = *++YYCURSOR; goto yy53;yy58: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR;yy59: switch(yych) { case 0x09: case ' ': goto yy58; default: goto yy51; }yy60: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR;yy61: 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 '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 yy60; default: goto yy46; }yy62: yych = *++YYCURSOR; switch(yych) { case '2': goto yy63; default: goto yy61; }yy63: yych = *++YYCURSOR; switch(yych) { case 'c': goto yy64; default: goto yy61; }yy64: yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); switch(yych) { case ':': goto yy65; default: goto yy61; }yy65: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; switch(yych) { 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 '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 yy67; default: goto yy66; }yy66: YYCURSOR = YYMARKER; switch(yyaccept) { case 0: goto yy32; case 1: goto yy38; case 2: goto yy40; case 3: goto yy42; case 4: goto yy46; case 5: goto yy69; case 6: goto yy98; }yy67: yyaccept = 5; YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; 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':
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?