|
|
1.1 root 1: # include <stdio.h>
2: # include "constants.h"
3: # include "globals.h"
4: # include "y.tab.h"
5: # include <sccs.h>
6:
7: SCCSID(@(#)operator.c 7.1 2/5/81)
8:
9:
10: /*
11: ** OPERATOR -- process a token starting with an operator
12: **
13: ** Processes operators, strings, comments, and
14: ** floating constants without a leading 0.
15: **
16: ** Parameters:
17: ** chr - first character of token {Cmap [chr] == OPATR}
18: **
19: ** Returns:
20: ** NUMBER or STRING token, or operator token.
21: ** CONTINUE on error.
22: **
23: ** Side Effects:
24: ** Adds a node to the Symbol space, and returns adress
25: ** in "yylval".
26: ** Opcode is set to the opcode of the operator.
27: ** May backup a character.
28: */
29:
30: operator(chr)
31: char chr;
32: {
33: register struct optab *op;
34: char opbuf [3];
35:
36: opbuf [0] = chr;
37: opbuf [1] = getch();
38: opbuf [2] = '\0';
39:
40: if (opbuf [0] == '.' && Cmap [opbuf [1]] == NUMBR)
41: {
42: /* floating mantissa w/o leading 0 */
43: backup(opbuf [1]);
44: return (number(opbuf [0]));
45: }
46: if (Cmap [opbuf [1]] != OPATR)
47: {
48: backup(opbuf [1]);
49: opbuf [1] = '\0';
50: }
51: /* operator has been reduced to its smallest
52: * possible length, now try to find it in the
53: * operator table [tokens.y]
54: */
55: for ( ; ; )
56: {
57: for (op = Optab; op->op_term; op++)
58: if (sequal(op->op_term, opbuf))
59: break;
60: if (!op->op_term && opbuf [1])
61: {
62: /* reduce a 2 char operator to 1 char,
63: * and re-search
64: */
65: backup(opbuf[1]);
66: opbuf [1] = '\0';
67: continue;
68: }
69: break;
70: }
71: if (op->op_term)
72: {
73: /* string quotes ? */
74: if (op->op_token == Tokens.sp_quote)
75: return (string(op));
76:
77: /* comment indicator ? */
78: if (op->op_token == Tokens.sp_bgncmnt)
79: return (comment());
80:
81: /* {sequal(opbuf, op->op_term)} */
82: Opcode = op->op_code;
83: yylval.u_dn = addsym(op->op_term);
84: return (op->op_token);
85: }
86: yysemerr("bad operator", opbuf);
87:
88: /* operator not found, skip token and try again */
89: return (CONTINUE);
90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.