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

📄 calc_008.b.c

📁 a little DFA compiler.
💻 C
字号:
/* Generated by re2c */#line 1 "calc_008.b.re"/* re2c lesson 001_upn_calculator, calc_008, (c) M. Boerger 2006 - 2007 */#line 31 "calc_008.b.re"#include <stdlib.h>#include <stdio.h>#include <string.h>#define DEBUG(stmt) stmtint  stack[4];int  depth = 0;int push_num(const char *t, const char *l, int radix){	int num = 0;		if (depth >= sizeof(stack))	{		return 3;	}	--t;	while(++t < l)	{		num = num * radix + (*t - '0');	}	DEBUG(printf("Num: %d\n", num));	stack[depth++] = num;	return 0;}int stack_add(){	if (depth < 2) return 4;		--depth;	stack[depth-1] = stack[depth-1] + stack[depth];	DEBUG(printf("+\n"));	return 0;}int stack_sub(){	if (depth < 2) return 4;	--depth;	stack[depth-1] = stack[depth-1] - stack[depth];	DEBUG(printf("+\n"));	return 0;}int scan(char *p){	char *t;	int res = 0;		while(!res)	{		t = p;		{			static const unsigned char yybm[] = {				  0,   0,   0,   0,   0,   0,   0,   0, 				  0, 128,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				128,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				 64,  64,  64,  64,  64,  64,  64,  64, 				 64,  64,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 				  0,   0,   0,   0,   0,   0,   0,   0, 			};#line 100 "<stdout>"			{				unsigned char curr;				curr = (unsigned char)*p;				if(curr <= '*') {					if(curr <= 0x09) {						if(curr <= 0x00) goto scan11;						if(curr <= 0x08) goto scan13;					} else {						if(curr != ' ') goto scan13;					}				} else {					if(curr <= '-') {						if(curr <= '+') goto scan7;						if(curr <= ',') goto scan13;						goto scan9;					} else {						if(curr <= '/') goto scan13;						if(curr <= '0') goto scan4;						if(curr <= '9') goto scan6;						goto scan13;					}				}				++p;				curr = (unsigned char)*p;				goto scan21;scan3:#line 103 "calc_008.b.re"				{ continue; }#line 130 "<stdout>"scan4:				++p;				if((curr = (unsigned char)*p) <= '/') goto scan5;				if(curr <= '9') goto scan17;scan5:#line 105 "calc_008.b.re"				{ res = push_num(t, p, 10); continue; }#line 138 "<stdout>"scan6:				curr = (unsigned char)*++p;				goto scan16;scan7:				++p;#line 106 "calc_008.b.re"				{ res = stack_add();		continue; }#line 146 "<stdout>"scan9:				++p;#line 107 "calc_008.b.re"				{ res = stack_sub();		continue; }#line 151 "<stdout>"scan11:				++p;#line 108 "calc_008.b.re"				{ res = depth == 1 ? 0 : 2;	break; }#line 156 "<stdout>"scan13:				++p;#line 109 "calc_008.b.re"				{ res = 1; 					continue; }#line 161 "<stdout>"scan15:				++p;				curr = (unsigned char)*p;scan16:				if(yybm[0+curr] & 64) {					goto scan15;				}				goto scan5;scan17:				++p;				curr = (unsigned char)*p;				if(curr <= '/') goto scan19;				if(curr <= '9') goto scan17;scan19:#line 104 "calc_008.b.re"				{ res = push_num(t, p, 8);	continue; }#line 178 "<stdout>"scan20:				++p;				curr = (unsigned char)*p;scan21:				if(yybm[0+curr] & 128) {					goto scan20;				}				goto scan3;			}		}#line 110 "calc_008.b.re"	}	return res;}int main(int argc, char **argv){	if (argc > 1)	{		char *inp;		int res = 0, argp = 0, len;				while(!res && ++argp < argc)		{			inp = strdup(argv[argp]);			len = strlen(inp);			if (inp[0] == '\"' && inp[len-1] == '\"')			{				inp[len - 1] = '\0';				++inp;			}			res = scan(inp);			free(inp);		}		switch(res)		{		case 0:			printf("Result: %d\n", stack[0]);			return 0;		case 1:			fprintf(stderr, "Illegal character in input.\n");			return 1;		case 2:			fprintf(stderr, "Premature end of input.\n");			return 2;		case 3:			fprintf(stderr, "Stack overflow.\n");			return 3;		case 4:			fprintf(stderr, "Stack underflow.\n");			return 4;		}	}	else	{		fprintf(stderr, "%s <expr>\n", argv[0]);		return 0;	}}

⌨️ 快捷键说明

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