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

📄 scanner.fs.c

📁 a little DFA compiler.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Generated by re2c */#line 1 "scanner.fs.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.fs.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>"{	switch(YYGETSTATE()) {	default: goto yy0;	case 0: goto yyFillLabel0;	case 1: goto yyFillLabel1;	case 2: goto yyFillLabel2;	case 3: goto yyFillLabel3;	case 4: goto yyFillLabel4;	case 5: goto yyFillLabel5;	case 6: goto yyFillLabel6;	case 7: goto yyFillLabel7;	case 8: goto yyFillLabel8;	case 9: goto yyFillLabel9;	case 10: goto yyFillLabel10;	case 11: goto yyFillLabel11;	case 12: goto yyFillLabel12;	case 13: goto yyFillLabel13;	case 14: goto yyFillLabel14;	case 15: goto yyFillLabel15;	case 16: goto yyFillLabel16;	case 17: goto yyFillLabel17;	case 18: goto yyFillLabel18;	case 19: goto yyFillLabel19;	case 20: goto yyFillLabel20;	case 21: goto yyFillLabel21;	case 22: goto yyFillLabel22;	case 23: goto yyFillLabel23;	case 24: goto yyFillLabel24;	case 25: goto yyFillLabel25;	case 26: goto yyFillLabel26;	case 27: goto yyFillLabel27;	case 28: goto yyFillLabel28;	case 29: goto yyFillLabel29;	case 30: goto yyFillLabel30;	case 31: goto yyFillLabel31;	case 32: goto yyFillLabel32;	case 33: goto yyFillLabel33;	case 34: goto yyFillLabel34;	case 35: goto yyFillLabel35;	}yy0:	YYSETSTATE(0);	if((YYLIMIT - YYCURSOR) < 11) YYFILL(11);yyFillLabel0:	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;	}	yych = *(YYMARKER = ++YYCURSOR);	if(yych == '*') goto yy12;yy3:#line 141 "scanner.fs.re"	{					goto echo;				}#line 158 "<stdout>"yy4:	yych = *++YYCURSOR;	if(yych == '/') goto yy10;	goto yy3;yy5:	++YYCURSOR;#line 130 "scanner.fs.re"	{					out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok));					tok = pos = cursor; cline++;				  	goto echo;				}#line 171 "<stdout>"yy7:	++YYCURSOR;#line 135 "scanner.fs.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 181 "<stdout>"yy9:	yych = *++YYCURSOR;	goto yy3;yy10:	++YYCURSOR;#line 121 "scanner.fs.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 197 "<stdout>"yy12:	yych = *++YYCURSOR;	if(yych == '!') goto yy14;yy13:	YYCURSOR = YYMARKER;	goto yy3;yy14:	yych = *++YYCURSOR;	if(yych == 'm') goto yy15;	if(yych == 'r') goto yy16;	goto yy13;yy15:	yych = *++YYCURSOR;	if(yych == 'a') goto yy21;	goto yy13;yy16:	yych = *++YYCURSOR;	if(yych != 'e') goto yy13;	yych = *++YYCURSOR;	if(yych != '2') goto yy13;	yych = *++YYCURSOR;	if(yych != 'c') goto yy13;	++YYCURSOR;#line 110 "scanner.fs.re"	{ 					out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok));					tok = cursor;					RETURN(1);				}#line 227 "<stdout>"yy21:	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;#line 115 "scanner.fs.re"	{					out << "#define YYMAXFILL " << maxFill << std::endl;					tok = pos = cursor;					ignore_eoc = true;					goto echo;				}#line 249 "<stdout>"}#line 144 "scanner.fs.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 274 "<stdout>"{	YYSETSTATE(1);	if((YYLIMIT - YYCURSOR) < 5) YYFILL(5);yyFillLabel1:	yych = *YYCURSOR;	if(yych <= '/') {		if(yych <= '!') {			if(yych <= 0x0C) {				if(yych <= 0x08) goto yy56;				if(yych <= 0x09) goto yy50;				if(yych <= 0x0A) goto yy52;				goto yy56;			} else {				if(yych <= 0x0D) goto yy54;				if(yych == ' ') goto yy50;				goto yy56;			}		} else {			if(yych <= ')') {				if(yych <= '"') goto yy37;				if(yych <= '&') goto yy56;				if(yych <= '\'') goto yy39;				goto yy43;			} else {				if(yych <= '+') {					if(yych <= '*') goto yy35;					goto yy44;				} else {					if(yych <= '-') goto yy56;					if(yych <= '.') goto yy48;					goto yy33;				}			}		}	} else {		if(yych <= 'Z') {			if(yych <= '=') {				if(yych == ';') goto yy43;				if(yych <= '<') goto yy56;				goto yy43;			} else {				if(yych == '?') goto yy44;				if(yych <= '@') goto yy56;				goto yy47;			}		} else {			if(yych <= 'q') {				if(yych <= '[') goto yy41;				if(yych <= '\\') goto yy43;				if(yych <= '`') goto yy56;				goto yy47;			} else {				if(yych <= 'z') {					if(yych <= 'r') goto yy45;					goto yy47;				} else {					if(yych <= '{') goto yy31;					if(yych <= '|') goto yy43;					goto yy56;				}			}		}	}yy31:	yyaccept = 0;	yych = *(YYMARKER = ++YYCURSOR);	if(yych <= '/') {		if(yych == ',') goto yy97;	} else {		if(yych <= '0') goto yy94;		if(yych <= '9') goto yy95;	}yy32:#line 166 "scanner.fs.re"	{ depth = 1;				  goto code;				}#line 353 "<stdout>"yy33:	++YYCURSOR;	if((yych = *YYCURSOR) == '*') goto yy92;yy34:#line 196 "scanner.fs.re"	{ RETURN(*tok); }#line 360 "<stdout>"yy35:	++YYCURSOR;	if((yych = *YYCURSOR) == '/') goto yy90;yy36:#line 198 "scanner.fs.re"	{ yylval.op = *tok;				  RETURN(CLOSE); }#line 368 "<stdout>"yy37:	yyaccept = 1;	yych = *(YYMARKER = ++YYCURSOR);	if(yych != 0x0A) goto yy86;yy38:#line 183 "scanner.fs.re"	{ fatal("unterminated string constant (missing \")"); }#line 376 "<stdout>"yy39:	yyaccept = 2;	yych = *(YYMARKER = ++YYCURSOR);	if(yych != 0x0A) goto yy81;yy40:#line 184 "scanner.fs.re"	{ fatal("unterminated string constant (missing ')"); }#line 384 "<stdout>"yy41:	yyaccept = 3;	yych = *(YYMARKER = ++YYCURSOR);	if(yych == 0x0A) goto yy42;	if(yych == '^') goto yy72;	goto yy71;yy42:#line 194 "scanner.fs.re"	{ fatal("unterminated range (missing ])"); }#line 394 "<stdout>"yy43:	yych = *++YYCURSOR;	goto yy34;yy44:	yych = *++YYCURSOR;	goto yy36;yy45:	++YYCURSOR;	if((yych = *YYCURSOR) == 'e') goto yy62;	goto yy61;yy46:#line 225 "scanner.fs.re"	{ cur = cursor;				  yylval.symbol = Symbol::find(token());				  return ID; }#line 410 "<stdout>"yy47:	yych = *++YYCURSOR;	goto yy61;yy48:	++YYCURSOR;#line 229 "scanner.fs.re"	{ cur = cursor;				  yylval.regexp = mkDot();				  return RANGE;				}#line 421 "<stdout>"yy50:	++YYCURSOR;	yych = *YYCURSOR;	goto yy59;yy51:#line 234 "scanner.fs.re"	{ goto scan; }#line 429 "<stdout>"yy52:	++YYCURSOR;yy53:#line 236 "scanner.fs.re"	{ if(cursor == eof) RETURN(0);				  pos = cursor; cline++;				  goto scan;	    			}#line 438 "<stdout>"yy54:	++YYCURSOR;	if((yych = *YYCURSOR) == 0x0A) goto yy57;yy55:#line 241 "scanner.fs.re"	{ std::ostringstream msg;				  msg << "unexpected character: ";				  prtChOrHex(msg, *tok);				  fatal(msg.str().c_str());				  goto scan;				}#line 450 "<stdout>"yy56:	yych = *++YYCURSOR;	goto yy55;yy57:	yych = *++YYCURSOR;	goto yy53;yy58:	++YYCURSOR;	YYSETSTATE(2);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel2:	yych = *YYCURSOR;yy59:	if(yych == 0x09) goto yy58;	if(yych == ' ') goto yy58;	goto yy51;yy60:	++YYCURSOR;	YYSETSTATE(3);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel3:	yych = *YYCURSOR;yy61:	if(yych <= '@') {		if(yych <= '/') goto yy46;		if(yych <= '9') goto yy60;		goto yy46;	} else {		if(yych <= 'Z') goto yy60;		if(yych <= '`') goto yy46;		if(yych <= 'z') goto yy60;		goto yy46;	}yy62:	yych = *++YYCURSOR;	if(yych != '2') goto yy61;	yych = *++YYCURSOR;	if(yych != 'c') goto yy61;	yyaccept = 4;	yych = *(YYMARKER = ++YYCURSOR);	if(yych != ':') goto yy61;yy65:	++YYCURSOR;	YYSETSTATE(4);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel4:	yych = *YYCURSOR;	if(yych <= '@') goto yy66;	if(yych <= 'Z') goto yy67;	if(yych <= '`') goto yy66;	if(yych <= 'z') goto yy67;yy66:	YYCURSOR = YYMARKER;	if(yyaccept <= 3) {		if(yyaccept <= 1) {			if(yyaccept <= 0) {				goto yy32;			} else {				goto yy38;			}		} else {			if(yyaccept <= 2) {				goto yy40;			} else {				goto yy42;			}		}	} else {		if(yyaccept <= 5) {			if(yyaccept <= 4) {				goto yy46;			} else {				goto yy69;			}		} else {			goto yy98;		}	}yy67:	yyaccept = 5;	YYMARKER = ++YYCURSOR;	YYSETSTATE(5);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel5:	yych = *YYCURSOR;	if(yych <= 'Z') {		if(yych <= '9') {			if(yych >= '0') goto yy67;		} else {			if(yych <= ':') goto yy65;			if(yych >= 'A') goto yy67;		}	} else {		if(yych <= '_') {			if(yych >= '_') goto yy67;		} else {			if(yych <= '`') goto yy69;			if(yych <= 'z') goto yy67;		}	}yy69:#line 218 "scanner.fs.re"	{ cur = cursor;				  tok+= 5; /* skip "re2c:" */				  iscfg = 1;				  yylval.str = new Str(token());				  return CONFIG;				}#line 559 "<stdout>"yy70:	++YYCURSOR;	YYSETSTATE(6);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel6:	yych = *YYCURSOR;yy71:	if(yych <= '[') {		if(yych == 0x0A) goto yy66;		goto yy70;	} else {		if(yych <= '\\') goto yy74;		if(yych <= ']') goto yy75;		goto yy70;	}yy72:	++YYCURSOR;	YYSETSTATE(7);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel7:	yych = *YYCURSOR;	if(yych <= '[') {		if(yych == 0x0A) goto yy66;		goto yy72;	} else {		if(yych <= '\\') goto yy77;		if(yych <= ']') goto yy78;		goto yy72;	}yy74:	++YYCURSOR;	YYSETSTATE(8);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel8:	yych = *YYCURSOR;	if(yych == 0x0A) goto yy66;	goto yy70;yy75:	++YYCURSOR;#line 190 "scanner.fs.re"	{ cur = cursor;				  yylval.regexp = ranToRE(token());				  return RANGE; }#line 603 "<stdout>"yy77:	++YYCURSOR;	YYSETSTATE(9);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel9:	yych = *YYCURSOR;	if(yych == 0x0A) goto yy66;	goto yy72;yy78:	++YYCURSOR;#line 186 "scanner.fs.re"	{ cur = cursor;				  yylval.regexp = invToRE(token());				  return RANGE; }#line 618 "<stdout>"yy80:	++YYCURSOR;	YYSETSTATE(10);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel10:	yych = *YYCURSOR;yy81:	if(yych <= '&') {		if(yych == 0x0A) goto yy66;		goto yy80;	} else {		if(yych <= '\'') goto yy83;		if(yych != '\\') goto yy80;	}	++YYCURSOR;	YYSETSTATE(11);	if(YYLIMIT == YYCURSOR) YYFILL(1);yyFillLabel11:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -