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 + -
显示快捷键?