|
|
1.1 root 1: static char *sccsid = "@(#)rval.c 1.1 (Berkeley) 3/2/81";
2: /* Copyright (c) 1979 Regents of the University of California */
3: #
4: /*
5: * pxp - Pascal execution profiler
6: *
7: * Bill Joy UCB
8: * Version 1.2 January 1979
9: */
10:
11: #include "0.h"
12: #include "tree.h"
13:
14: extern char *opnames[];
15:
16: #define alph(c) ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
17: /*
18: * Rvalue reformats an expression.
19: * Par is a flag indicating that the expression
20: * should be parenthesized if it is non-atomic.
21: */
22: rvalue(r, par)
23: register int *r;
24: int par;
25: {
26: register int *al;
27: register char *opname;
28:
29: if (r == NIL) {
30: ppid("{expr}");
31: return;
32: }
33: if (r[0] <= T_IN)
34: opname = opnames[r[0]];
35: switch (r[0]) {
36: case T_BINT:
37: case T_INT:
38: case T_FINT:
39: ppnumb(r[2]);
40: if (r[0] == T_BINT)
41: ppsep("b");
42: return;
43: case T_NIL:
44: ppkw("nil");
45: return;
46: case T_FCALL:
47: funccod(r);
48: return;
49: case T_VAR:
50: lvalue(r);
51: return;
52: case T_CSET:
53: cset(r);
54: return;
55: case T_STRNG:
56: ppstr(r[2]);
57: return;
58: }
59: if (par)
60: ppbra("(");
61: switch (r[0]) {
62: default:
63: panic("rval");
64: case T_PLUS:
65: case T_MINUS:
66: ppop(r[0] == T_PLUS ? "+" : "-");
67: al = r[2];
68: rvalue(r[2], prec(al) > prec(r) || full);
69: break;
70: case T_NOT:
71: ppkw(opname);
72: ppspac();
73: rvalue(r[2], 1);
74: break;
75: case T_EQ:
76: case T_NE:
77: case T_GE:
78: case T_LE:
79: case T_GT:
80: case T_LT:
81: al = r[2];
82: rvalue(al, prec(al) <= prec(r) || full);
83: goto rest;
84: case T_AND:
85: case T_OR:
86: case T_MULT:
87: case T_ADD:
88: case T_SUB:
89: case T_DIVD:
90: case T_MOD:
91: case T_DIV:
92: case T_IN:
93: al = r[2];
94: rvalue(al, prec(al) < prec(r) || full);
95: rest:
96: ppspac();
97: if (alph(opname[0]))
98: ppkw(opname);
99: else
100: ppop(opname);
101: ppspac();
102: al = r[3];
103: rvalue(al, prec(al) <= prec(r) || full);
104: break;
105: }
106: if (par)
107: ppket(")");
108: }
109:
110: /*
111: * Prec returns the precedence of an operator,
112: * with larger numbers indicating stronger binding.
113: * This is used to determine when parenthesization
114: * is needed on subexpressions.
115: */
116: prec(r)
117: register int *r;
118: {
119:
120: if (r == NIL)
121: return;
122: switch (r[0]) {
123: case T_NOT:
124: return (3);
125: case T_MULT:
126: case T_DIVD:
127: case T_DIV:
128: case T_MOD:
129: case T_AND:
130: return (2);
131: case T_ADD:
132: case T_SUB:
133: case T_OR:
134: case T_PLUS:
135: case T_MINUS:
136: return (1);
137: default:
138: return (0);
139: }
140: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.