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

📄 parse.c

📁 Object-Oriented Programming With ANSI-C这本书中的源代码!找了很久
💻 C
字号:
#include <ctype.h>#include <errno.h>#include <setjmp.h>#include <stdarg.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "parse.h"			/* defines NUMBER */#include "value.h"/* *	scanner */static enum tokens token;	/* current input symbol */static double number;		/* if NUMBER: numerical value */static enum tokens scan (const char * buf)					/* return token = next input symbol */{	static const char * bp;	if (buf)		bp = buf;			/* new input line */	while (isspace(* bp & 0xff))		++ bp;	if (isdigit(* bp & 0xff) || * bp == '.')	{	errno = 0;		token = NUMBER, number = strtod(bp, (char **) & bp);		if (errno == ERANGE)			error("bad value: %s", strerror(errno));	}	else		token = * bp ? * bp ++ : 0;	return token;}/* *	factor : + factor *			 - factor *			 NUMBER *			 ( sum ) */static void * sum (void);static void * factor (void){	void * result;	switch (token) {	case '+':		scan(0);		return factor();	case '-':		scan(0);		return new(Minus, factor());	default:		error("bad factor: '%c' 0x%x", token, token);	case NUMBER:		result = new(Value, number);		break;	case '(':		scan(0);		result = sum();		if (token != ')')			error("expecting )");	}	scan(0);	return result;}/* *	product : factor { *|/ factor }... */static void * product (void){	void * result = factor();	const void * type;	for (;;)	{	switch (token) {		case '*':			type = Mult;			break;		case '/':			type = Div;			break;		default:			return result;		}		scan(0);		result = new(type, result, factor());	}}/* *	sum : product { +|- product }... */static void * sum (void){	void * result = product();	const void * type;	for (;;)	{	switch (token) {		case '+':			type = Add;			break;		case '-':			type = Sub;			break;		default:			return result;		}		scan(0);		result = new(type, result, product());	}}/* *	sum \n ... */static jmp_buf onError;int main (void){	volatile int errors = 0;	char buf [BUFSIZ];	if (setjmp(onError))		++ errors;	while (fgets(buf, sizeof buf, stdin))		if (scan(buf))		{	void * e = sum();			if (token)				error("trash after sum");			process(e);			delete(e);		}	return errors > 0;}void error (const char * fmt, ...){	va_list ap;	va_start(ap, fmt);	vfprintf(stderr, fmt, ap), putc('\n', stderr);	va_end(ap);	longjmp(onError, 1);}

⌨️ 快捷键说明

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