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