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

📄 error_table.y

📁 早期freebsd实现
💻 Y
字号:
%{#include <stdio.h>#include <stdlib.h>char *str_concat(), *ds(), *quote();char *current_token = (char *)NULL;extern char *table_name;%}%union {	char *dynstr;}%token ERROR_TABLE ERROR_CODE_ENTRY END%token <dynstr> STRING QUOTED_STRING%type <dynstr> ec_name description table_id%{%}%start error_table%%error_table	:	ERROR_TABLE table_id error_codes END			{ table_name = ds($2);			  current_token = table_name;			  put_ecs(); }		;table_id	:	STRING			{ current_token = $1;			  set_table_num($1);			  $$ = $1; }		;error_codes	:	error_codes ec_entry		|	ec_entry		;ec_entry	:	ERROR_CODE_ENTRY ec_name ',' description			{ add_ec($2, $4);			  free($2);			  free($4); }		|	ERROR_CODE_ENTRY ec_name '=' STRING ',' description			{ add_ec_val($2, $4, $6);			  free($2);			  free($4);			  free($6);			}		;ec_name		:	STRING			{ $$ = ds($1);			  current_token = $$; }		;description	:	QUOTED_STRING			{ $$ = ds($1);			  current_token = $$; }		;%%/* * * Copyright 1986, 1987 by the MIT Student Information Processing Board * * For copyright info, see mit-sipb-copyright.h. */#include <strings.h>#include <ctype.h>#include <sys/types.h>#include <sys/time.h>#include "error_table.h"#include "mit-sipb-copyright.h"extern FILE *hfile, *cfile;static long gensym_n = 0;char *gensym(x)	char *x;{	char *symbol;	if (!gensym_n) {		struct timeval tv;		struct timezone tzp;		gettimeofday(&tv, &tzp);		gensym_n = (tv.tv_sec%10000)*100 + tv.tv_usec/10000;	}	symbol = malloc(32 * sizeof(char));	gensym_n++;	sprintf(symbol, "et%ld", gensym_n);	return(symbol);}char *ds(string)	char *string;{	char *rv;	rv = malloc(strlen(string)+1);	strcpy(rv, string);	return(rv);}char *quote(string)	char *string;{	char *rv;	rv = malloc(strlen(string)+3);	strcpy(rv, "\"");	strcat(rv, string);	strcat(rv, "\"");	return(rv);}int table_number;int current = 0;char **error_codes = (char **)NULL;add_ec(name, description)	char *name, *description;{	fprintf(cfile, "\t\"%s\",\n", description);	if (error_codes == (char **)NULL) {		error_codes = (char **)malloc(sizeof(char *));		*error_codes = (char *)NULL;	}	error_codes = (char **)realloc((char *)error_codes,				       (current + 2)*sizeof(char *));	error_codes[current++] = ds(name);	error_codes[current] = (char *)NULL;}add_ec_val(name, val, description)	char *name, *val, *description;{	int ncurrent = atoi(val);	if (ncurrent < current) {		printf("Error code %s (%d) out of order", name,		       current);		return;	}      	while (ncurrent > current)	     fputs("\t(char *)NULL,\n", cfile), current++;		fprintf(cfile, "\t\"%s\",\n", description);	if (error_codes == (char **)NULL) {		error_codes = (char **)malloc(sizeof(char *));		*error_codes = (char *)NULL;	}	error_codes = (char **)realloc((char *)error_codes,				       (current + 2)*sizeof(char *));	error_codes[current++] = ds(name);	error_codes[current] = (char *)NULL;} put_ecs(){	int i;	for (i = 0; i < current; i++) {	     if (error_codes[i] != (char *)NULL)		  fprintf(hfile, "#define %-40s ((%s)%d)\n",			  error_codes[i], ERROR_CODE, table_number + i);	}}/* * char_to_num -- maps letters and numbers into a small numbering space * 	uppercase ->  1-26 *	lowercase -> 27-52 *	digits    -> 53-62 *	underscore-> 63 */intchar_to_num(c)	char c;{	if (isupper(c))		return(c-'A'+1);	else if (islower(c))		return(c-'a'+27);	else if (isdigit(c))		return(c-'0'+53);	else {		fprintf(stderr, "Illegal character in name: %c\n", c);		exit(1);		/*NOTREACHED*/	}}set_table_num(string)	char *string;{	if (strlen(string) > 4) {		fprintf(stderr, "Table name %s too long, truncated ",			string);		string[4] = '\0';		fprintf(stderr, "to %s\n", string);	}	while (*string != '\0') {		table_number = (table_number << BITS_PER_CHAR)			+ char_to_num(*string);		string++;	}	table_number = table_number << ERRCODE_RANGE;}#include "et_lex.lex.c"

⌨️ 快捷键说明

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