⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanner.cc

📁 a little DFA compiler.
💻 CC
📖 第 1 页 / 共 2 页
字号:
/* 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 + -