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

📄 y.c

📁 操作系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
  r->n_arg[i] = NULL;  return r;}static NODE *expr(){  NODE *p;  p = expr1();  if (isassign(sym))	p = doassign(sym, p);  return p;}static isassign(sym){  return (sym == ASSIGN || sym == ADDEQ || sym == SUBEQ || sym == MULTEQ  	|| sym == DIVEQ || sym == MODEQ || sym == POWEQ);}static NODE *doassign(op, p) NODE *p;{	/* evaluate right to left */  NODE *q;  lex();  q = expr();  if (isassign(sym))	q = doassign(sym, q);  return node3(ASSIGN, (NODE *)op, p, q);}static NODE *expr1(){  NODE *p, *q;/*printf("expr1(%d)(%s)\n", sym, text);*/  p = expr2();  if (sym == '?') {	lex();#if 0	q = stat();	if (sym != ':')		synerr("':' expected");	lex();	return node3(IF, p, q, stat());#else	q = expr();	if (sym != ':')		synerr("':' expected");	lex();	return node3(IF, p, q, expr());#endif  }  return p;	/* 930213 */}static NODE *expr2(){  NODE *p;/*printf("expr2(%d)(%s)\n", sym, text);*/  p = expr3();  while (sym == OR) {	lex();	skipeol();	p = node3(COND, (NODE *)OR, p, expr3());  }  return p;}static NODE *expr3(){  NODE *p;/*printf("expr3(%d)(%s)\n", sym, text);*/  p = expr4();  while (sym == AND) {	lex();	skipeol();	p = node3(COND, (NODE *)AND, p, expr4());  }  return p;}static NODE *expr4(){  NODE *p;  CELL *q;  int op;/*printf("expr4(%d)(%s)\n", sym, text);*/  p = expr5();  if (!forflg && sym == IN) {	lex();	q = getvar(text, hashtab, ARR);	lex();	return node2(IN, p, q);  }  while (sym == EQ || sym == NE || sym == LT || sym == LE  || sym == GT	|| sym == GE || sym == MATCH || sym == NOMATCH) {	op = sym;	lex();	p = node3(COND, (NODE *)op, p, expr5());  }  return p;}static NODE *expr5(){  NODE *p, *q;/*printf("expr5(%d)(%s)\n", sym, text);*/  p = expr6();  while (iscat(sym)) {	q = expr6();	p = node2(CAT, p, q);  }  return p;}static iscat(sym){  static int ctab[] = {	ADD, SUB, MULT, DIV, MOD, INC, DEC, STRING, NUMBER, IDENT, '(',	MATHFUN, STRFUN, SPRINTF, '$', SUBST, ARG, CALL, 0	};  register int i, j;  for (i = 0; j = ctab[i]; i++)	if (sym == j)		break;  return j;}static NODE *expr6(){  register int sign = sym;  NODE *p, *q;/*printf("expr6(%d)(%s)\n", sym, text);*/  if (sym == SUB || sym == ADD)	lex();  p = expr7();  if (sign == SUB)	p = node2(ARITH, (NODE *)UMINUS, p);  while (sym == ADD || sym == SUB) {	sign = sym;	lex();	q = expr7();	if (sign == ADD) {		p = node3(ARITH, (NODE *)ADD, p, q);	}	else if (sign == SUB) {		p = node3(ARITH, (NODE *)SUB, p, q);	}	else		synerr("'+' or '-' expected");  }  return p;}static NODE *expr7(){  register int op;  NODE *p, *q;/*printf("expr7(%d)(%s)\n", sym, text);*/  p = expr8();  while (sym == MULT || sym == DIV || sym == MOD) {	op = sym;	lex();	q = expr8();	switch (op) {	case MULT:	p = node3(ARITH, (NODE *)MULT, p, q); break;	case DIV:	p = node3(ARITH, (NODE *)DIV, p, q); break;	case MOD:	p = node3(ARITH, (NODE *)MOD, p, q); break;	default:	synerr("'*', '/' or '%' expected"); break;	}  }  return p;}static NODE *expr8(){  NODE *p;  int op;/*printf("expr8(%d)(%s)\n", sym, text);*/  if (sym == NOT) {	lex();	p = node2(COND, (NODE *)NOT, expr9());  }  else {	p = expr9();	if (sym == POWER) {		lex();		p = node3(ARITH, (NODE *)POWER, p, expr9());	}  }  return p;}static NODE *expr9(){  NODE *p, *q;  int op, sym0;/*printf("expr9(%d)(%s)\n", sym, text);*/  if (op = isincdec(sym)) {	lex();	if (sym != IDENT && sym != ARG)		synerr("illegal '++/--' operator");	p = expr10();	p = node4(ARITH, (NODE *)INCDEC, p, (NODE *)op, (NODE *)PRE);  }  else {	sym0 = sym;	p = expr10();	if (op = isincdec(sym)) {/*printf("POST(%d)(%d)(%s)\n", sym, sym0, text);*/		if (sym0 == IDENT || sym0 == ARG) {			p = node4(ARITH, (NODE *)INCDEC, p, (NODE *)op,				(NODE *)POST);			lex();		}	}	if (sym == BINOR) {	/* | getline */		lex();		if (sym != GETLINE)			synerr("'GETLINE' expected");		lex();		if (sym == IDENT || sym == STRING || sym == ARG) {			q = expr();		}		else			q = NULL;		p = node3(GETLINE, q, p, (NODE *)R_PIN);	}  }  return p;}static isincdec(sym){  return sym == INC ? 1 : (sym == DEC ? -1 : 0);}static NODE *expr10(){  NODE *p, *q;  CELL *u, *v;  int op;  int c;int gsave, psave;  double atof();/*printf("expr10(%d)(%s)\n", sym, text);*/  switch (sym) {  case STRING:	u = mkcell(STR, text, 0.0);	goto g1;  case NUMBER:	u = mkcell(NUM, NULL, atof(text));g1:	p = node1(VALUE, u);	lex();	break;  case IDENT: case ARG:	if ((c = Getc()) == '[') {	/* array */		/* 940403 */		if (sym == ARG) {			u = (CELL *)emalloc(sizeof(CELL));			u = mkcell(POS, NULL, (double)sym1);			p = doarray(u);		}		else {			u = getvar(text, hashtab, ARR);			p = doarray(u);		}	}	else {		Ungetc(c);		if (sym == ARG) {			u = mkcell(POS, NULL, (double)sym1);			p = node1(ARG, u);		}		else {	/* symple variable */			u = getvar(text, hashtab, VAR|STR|NUM);			p = node1(VALUE, u);		}	}	lex();	break;  case '(':	/* print >(x ? y : z) needs this */gsave = getlineflg; psave = printflg;getlineflg = printflg = 0;	lex();	p = expr();	if (sym == ',')	/* (expr, expr, .. ) */		p = doelement(p);	if (sym != ')')		synerr("')' expected");getlineflg = gsave; printflg = psave;	lex();	break;  case CALL:	p = dofuncn(sym, getvar(text, funtab, UDF));	break;  case MATHFUN: case STRFUN: case SUBST:	p = dofuncn(sym, (CELL *)sym1);	break;  case SPRINTF:	p = doprint(FORMAT|STROUT);	break;  case '$':	lex();	switch (sym) {	case NUMBER:		u = mkcell(NUM, NULL, atof(text));		p = node1(VALUE, u);		p = node1(FIELD, p);		lex();		break;	case IDENT: case ARG: case '(':		p = node1(FIELD, expr10());		break;	default:		synerr("number or identifier expected after '$'", (char *)0);	}	break;  case DIV:	regexflg++;	lex();	regexflg = 0;	u = mkcell(PAT, NULL, 0.0);	u->c_sval = (char *) mkpat(text);	p = node1(VALUE, u);	lex();	break;  case GETLINE:	getlineflg++;	lex();	if (sym == IDENT || sym == STRING || sym == ARG)		q = expr10();	/* read into var */	else		q = NULL;	getlineflg = 0;	if (sym == R_IN) {		op = R_IN;		lex();		p = expr10();	}	else		op = (int) (p = NULL);	p = node3(GETLINE, q, p, (NODE *)op);	break;  default:	synerr(	"identifier, number, string, argument, regexpr, call or '(' expected");	break;  }  return p;}static NODE *dofuncn(fun, op) CELL *op;{  NODE *p;  int i, j;  int n = 0;  NODE *a[100];  if (lex() == '(') {	prmflg++;	for (lex(); sym && (sym != ')'); n++) {		if ((int)op == SPLIT && n == 1) {/*printf("sym(%d)sym1(%d)(%d)\n", sym, sym1, isarg(text));*/			if (sym != ARG) {	/*isarg(text) == -1*/				/* make an array if not exist */				prmflg = 0;				getvar(text, hashtab, ARR);				prmflg++;			}		}		a[n] = expr();		if (sym == ',')			lex();		else if (sym != ')')			synerr("',' or ')' expected");	}	prmflg = 0;	if (sym == ')')		lex();	else		synerr("')' expected");  }  p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * (n + 2));  p->n_type = fun;  p->n_next = NULL;  p->n_arg[0] = (NODE *) op;  p->n_arg[1] = (NODE *) n;  for (i = 0, j = 2; i < n; )	p->n_arg[j++] = a[i++];  p->n_arg[j] = NULL;  return p;}static NODE *doarray(u) CELL *u;{  NODE *p;  int i, j;  int n;  NODE *a[20];  for (lex(), n = 0; sym &&  sym != ']'; n++) {	a[n] = expr();	if (sym == ',')		lex();  }  if (sym != ']')	synerr("']' expected");  /* left ']' for expr10() */  p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * (n + 1));  p->n_type = ARRAY;  p->n_next = NULL;  p->n_arg[0] = (NODE *)u;  p->n_arg[1] = (NODE *) n;  for (i = 0, j = 2; i < n; )	p->n_arg[j++] = a[i++];  return p;}static NODE *doelement(q) NODE *q;{  NODE *p;  int i, j;  int n;  NODE *a[20];  a[0] = q;  for (lex(), n = 1; sym &&  sym != ')'; n++) {	a[n] = expr();	if (sym == ',')		lex();	else if (sym != ')')		synerr("',' or ')' expected");  }  /* left ')' for expr10() */  p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * (n + 1));  p->n_type = ELEMENT;  p->n_next = NULL;  p->n_arg[0] = NULL;  p->n_arg[1] = (NODE *) n;  for (i = 0, j = 2; i < n; )	p->n_arg[j++] = a[i++];  return p;}synerr(s, t) char *s, *t;{  extern int lineno;  extern char line[], *linep;  int c, i;  char *u, *v;  fprintf(stderr, "%s: Syntax error at line %d", cmd, lineno);  if (funflg)	fprintf(stderr, " in function %s", funnam);  fprintf(stderr, ":\n");  if ((v = linep - 1) < line)	v = line + BUFSIZ - 1;  for (i = 0, u = v - 1; ; --u) {	if (u < line) {		if (line[BUFSIZ - 1] == '\0')			break;		u = line + BUFSIZ - 1;	}	if (*u == '\n' && ++i == 2)		break;  }  if (u != v) {	while (u != v) {		fputc(*u, stderr);		if ((++u - line) == BUFSIZ)			u = line;	}	if (*u != '\n')		fputc(*u, stderr);	fprintf(stderr, " <--\n\n");/*	fprintf(stderr, " <-- ");	while ((c = Getc()) != EOF && c != '\n')		fputc(c, stderr);	fprintf(stderr, "\n");	if (c == EOF);		fprintf(stderr, "\n");*/  }  fprintf(stderr, s, t);  fprintf(stderr, "\n");#ifdef DOS  closeall();#endif  exit(1);}

⌨️ 快捷键说明

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