|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include "scanner.h" ! 3: # include <sccs.h> ! 4: # include <errors.h> ! 5: ! 6: SCCSID(@(#)s_operator.c 8.2 3/23/85) ! 7: ! 8: /* ! 9: ** OPERATOR ! 10: ** an operator is defined as any 1-3 character sequence of ! 11: ** non-alphanumerics. It looks up each operator in 'Optab' ! 12: ** and returns the appropriate token. ! 13: */ ! 14: operator(chr) ! 15: char chr; ! 16: { ! 17: extern int yylval; ! 18: extern char Cmap[]; ! 19: register struct optab *op; ! 20: register int save; ! 21: char buf[4]; ! 22: ! 23: /* get lookahead characer */ ! 24: save = Lcase; ! 25: Lcase = 0; ! 26: buf[0] = chr; ! 27: buf[1] = get_scan(NORMAL); ! 28: buf[2] = get_scan(NORMAL); ! 29: buf[3] = '\0'; ! 30: ! 31: /* is it a floating fraction without leading zero ? */ ! 32: if (buf[0] == '.' && Cmap[buf[1]] == NUMBR) ! 33: { ! 34: Lcase = save; ! 35: backup(buf[2]); ! 36: backup(buf[1]); ! 37: return(number(chr)); ! 38: } ! 39: ! 40: /* three character operator ? */ ! 41: for (op = &Optab[0]; op->term; op++) ! 42: if (sequal(op->term, buf)) ! 43: break; ! 44: if (!op->term) ! 45: { ! 46: /* two character operator ? */ ! 47: backup(buf[2]); ! 48: buf[2] = '\0'; ! 49: for (op = &Optab[0]; op->term; op++) ! 50: if (sequal(op->term, buf)) ! 51: break; ! 52: if (!op->term) ! 53: { ! 54: backup(buf[1]); ! 55: buf[1] = '\0'; ! 56: for (op = &Optab[0]; op->term; op++) ! 57: if (sequal(op->term, buf)) ! 58: break; ! 59: if (!op->term) ! 60: { ! 61: Lcase = save; ! 62: /* invalid operator */ ! 63: par_error (BADOP, WARN, 0); ! 64: } ! 65: } ! 66: } ! 67: Lcase = save; ! 68: if(op->token == Tokens.bgncmnt) ! 69: return(comment()); ! 70: if(op->token == Tokens.sconst) ! 71: return (string(op)); ! 72: Lastok.tok = op->term; ! 73: Lastok.toktyp = Tokens.sconst; ! 74: yylval = op->opcode; ! 75: return (op->token); ! 76: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.