home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
adaptor.zip
/
adapt.zip
/
adaptor
/
src
/
expressi.c
< prev
next >
Wrap
Text File
|
1994-01-03
|
27KB
|
1,317 lines
# include "Expressi.h"
# include "yyExpres.w"
# include <stdio.h>
# if defined __STDC__ | defined __cplusplus
# include <stdlib.h>
# else
extern void exit ();
# endif
# include "Tree.h"
# include "Definiti.h"
# ifndef NULL
# define NULL 0L
# endif
# ifndef false
# define false 0
# endif
# ifndef true
# define true 1
# endif
# ifdef yyInline
# define yyALLOC(tree, free, max, alloc, nodesize, make, ptr, kind) \
if ((ptr = (tree) free) >= (tree) max) ptr = alloc (); \
free += nodesize [kind]; \
ptr->yyHead.yyMark = 0; \
ptr->Kind = kind;
# else
# define yyALLOC(tree, free, max, alloc, nodesize, make, ptr, kind) ptr = make (kind);
# endif
# define yyWrite(s) (void) fputs (s, yyf)
# define yyWriteNl (void) fputc ('\n', yyf)
# line 37 "Expressions.puma"
# include "Tree.h"
# include "Idents.h"
# include "StringMe.h"
# include "protocol.h"
# include "Definiti.h"
int power (base, n)
int base, n;
{ int i, p;
p = 1;
for (i=1; i<=n; ++i)
p = p * base;
return p;
}
static FILE * yyf = stdout;
static void yyAbort
# ifdef __cplusplus
(char * yyFunction)
# else
(yyFunction) char * yyFunction;
# endif
{
(void) fprintf (stderr, "Error: module Expressions, routine %s failed\n", yyFunction);
exit (1);
}
void GetIntConstValue ARGS((tTree exp, bool * found, int * val));
void GetConstDifference ARGS((tTree exp1, tTree exp2, bool * found, int * val));
void ResolveExpression ARGS((tTree exp, bool * found, int * a, int * b, tTree * var));
static void MergeVars ARGS((int a1, tTree v1, int a2, tTree v2, bool * ok, tTree * var));
bool EqualExpression ARGS((tTree e1, tTree e2));
int IsVarInExp ARGS((tIdent name, tTree exp));
tTree MakeNotExp ARGS((tTree e));
void SliceIncrement ARGS((tTree yyP1, bool * yyP3, int * yyP2));
tTree MakeSliceExp ARGS((tTree start, tTree stop));
tTree AddConstant ARGS((tTree exp, int c));
tTree MakeConstant ARGS((int n));
void GetIntConstValue
# if defined __STDC__ | defined __cplusplus
(register tTree exp, register bool * found, register int * val)
# else
(exp, found, val)
register tTree exp;
register bool * found;
register int * val;
# endif
{
switch (exp->Kind) {
case kOP_EXP:
if (exp->OP_EXP.EXP_OP->Kind == kOP_PLUS) {
# line 69 "Expressions.puma"
{
bool yyV1;
int yyV2;
bool yyV3;
int yyV4;
{
# line 70 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND1, & yyV1, & yyV2);
# line 71 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND2, & yyV3, & yyV4);
}
* found = yyV1 && yyV3;
* val = yyV2 + yyV4;
return;
}
}
if (exp->OP_EXP.EXP_OP->Kind == kOP_MINUS) {
# line 74 "Expressions.puma"
{
bool yyV1;
int yyV2;
bool yyV3;
int yyV4;
{
# line 75 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND1, & yyV1, & yyV2);
# line 76 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND2, & yyV3, & yyV4);
}
* found = yyV1 && yyV3;
* val = yyV2 - yyV4;
return;
}
}
if (exp->OP_EXP.EXP_OP->Kind == kOP_TIMES) {
# line 79 "Expressions.puma"
{
bool yyV1;
int yyV2;
bool yyV3;
int yyV4;
{
# line 80 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND1, & yyV1, & yyV2);
# line 81 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND2, & yyV3, & yyV4);
}
* found = yyV1 && yyV3;
* val = yyV2 * yyV4;
return;
}
}
if (exp->OP_EXP.EXP_OP->Kind == kOP_DIVIDE) {
# line 84 "Expressions.puma"
{
bool yyV1;
int yyV2;
bool yyV3;
int yyV4;
{
# line 85 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND1, & yyV1, & yyV2);
# line 86 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND2, & yyV3, & yyV4);
# line 87 "Expressions.puma"
if (yyV4 == 0)
{ yyV3 = false;
yyV4 = 1;
}
}
* found = yyV1 && yyV3;
* val = yyV2 / yyV4;
return;
}
}
if (exp->OP_EXP.EXP_OP->Kind == kOP_EXPO) {
# line 94 "Expressions.puma"
{
bool yyV1;
int yyV2;
bool yyV3;
int yyV4;
{
# line 95 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND1, & yyV1, & yyV2);
# line 96 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND2, & yyV3, & yyV4);
# line 97 "Expressions.puma"
if (yyV4 < 0) yyV3 = false;
}
* found = yyV1 && yyV3;
* val = power (yyV2, yyV4);
return;
}
}
break;
case kOP1_EXP:
if (exp->OP1_EXP.EXP_OP1->Kind == kOP1_SIGN) {
# line 100 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 101 "Expressions.puma"
GetIntConstValue (exp->OP1_EXP.OPND, & yyV1, & yyV2);
}
* found = yyV1;
* val = - yyV2;
return;
}
}
break;
case kVAR_EXP:
# line 104 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 105 "Expressions.puma"
GetIntConstValue (exp->VAR_EXP.V, & yyV1, & yyV2);
}
* found = yyV1;
* val = yyV2;
return;
}
case kUSED_VAR:
# line 108 "Expressions.puma"
{
# line 111 "Expressions.puma"
if (! (exp->USED_VAR.VARNAME->VAR_OBJ.Object == NoObject)) goto yyL8;
}
* found = false;
* val = 0;
return;
yyL8:;
if (exp->USED_VAR.VARNAME->VAR_OBJ.Object->Kind == kVarObject) {
if (exp->USED_VAR.VARNAME->VAR_OBJ.Object->VarObject.Kind->Kind == kVarConstant) {
# line 114 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 116 "Expressions.puma"
GetIntConstValue (exp->USED_VAR.VARNAME->VAR_OBJ.Object->VarObject.Kind->VarConstant.Val, & yyV1, & yyV2);
}
* found = yyV1;
* val = yyV2;
return;
}
}
}
break;
case kVAR_PARAM:
# line 119 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 120 "Expressions.puma"
GetIntConstValue (exp->VAR_PARAM.V, & yyV1, & yyV2);
}
* found = yyV1;
* val = yyV2;
return;
}
case kADDR:
# line 123 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 124 "Expressions.puma"
GetIntConstValue (exp->ADDR.E, & yyV1, & yyV2);
}
* found = yyV1;
* val = yyV2;
return;
}
case kCONST_EXP:
if (exp->CONST_EXP.C->Kind == kINT_CONSTANT) {
# line 127 "Expressions.puma"
* found = true;
* val = exp->CONST_EXP.C->INT_CONSTANT.value;
return;
}
break;
}
# line 130 "Expressions.puma"
* found = false;
* val = 0;
return;
;
}
void GetConstDifference
# if defined __STDC__ | defined __cplusplus
(register tTree exp1, register tTree exp2, register bool * found, register int * val)
# else
(exp1, exp2, found, val)
register tTree exp1;
register tTree exp2;
register bool * found;
register int * val;
# endif
{
# line 147 "Expressions.puma"
{
# line 148 "Expressions.puma"
if (! (((exp1 == NoTree) || (exp2 == NoTree)))) goto yyL1;
{
# line 149 "Expressions.puma"
printf ("Illegal Call of GetConstDifference with NoTree\n");
# line 150 "Expressions.puma"
kill_in_protocol ();
}
}
* found = false;
* val = 0;
return;
yyL1:;
# line 153 "Expressions.puma"
{
# line 155 "Expressions.puma"
if (! ( EqualExpression (exp1, exp2 ) == true)) goto yyL2;
}
* found = true;
* val = 0;
return;
yyL2:;
# line 158 "Expressions.puma"
{
bool yyV1;
int yyV2;
int yyV3;
tTree yyV4;
bool yyV5;
int yyV6;
int yyV7;
tTree yyV8;
bool yyV9;
tTree yyV10;
{
# line 159 "Expressions.puma"
ResolveExpression (exp1, & yyV1, & yyV2, & yyV3, & yyV4);
# line 160 "Expressions.puma"
if (! ((yyV1))) goto yyL3;
{
# line 161 "Expressions.puma"
ResolveExpression (exp2, & yyV5, & yyV6, & yyV7, & yyV8);
# line 162 "Expressions.puma"
if (! ((yyV5))) goto yyL3;
{
# line 163 "Expressions.puma"
MergeVars (yyV2, yyV4, yyV6, yyV8, & yyV9, & yyV10);
# line 164 "Expressions.puma"
if (! ((yyV9 == true))) goto yyL3;
{
# line 165 "Expressions.puma"
if (! ((yyV2 == yyV6))) goto yyL3;
}
}
}
}
* found = true;
* val = yyV3 - yyV7;
return;
}
yyL3:;
if (exp1->Kind == kSLICE_EXP) {
if (exp2->Kind == kSLICE_EXP) {
# line 168 "Expressions.puma"
{
bool yyV1;
int yyV2;
bool yyV3;
int yyV4;
{
# line 170 "Expressions.puma"
GetConstDifference (exp1->SLICE_EXP.START, exp2->SLICE_EXP.START, & yyV1, & yyV2);
# line 171 "Expressions.puma"
if (! ((yyV1 == true))) goto yyL4;
{
# line 172 "Expressions.puma"
GetConstDifference (exp1->SLICE_EXP.STOP, exp2->SLICE_EXP.STOP, & yyV3, & yyV4);
# line 173 "Expressions.puma"
if (! ((yyV3 == true))) goto yyL4;
{
# line 174 "Expressions.puma"
if (! ((yyV2 == yyV4))) goto yyL4;
{
# line 175 "Expressions.puma"
if (! (EqualExpression (exp1->SLICE_EXP.INC, exp2->SLICE_EXP.INC))) goto yyL4;
}
}
}
}
* found = true;
* val = yyV2;
return;
}
yyL4:;
}
}
# line 178 "Expressions.puma"
* found = false;
* val = 0;
return;
;
}
void ResolveExpression
# if defined __STDC__ | defined __cplusplus
(register tTree exp, register bool * found, register int * a, register int * b, register tTree * var)
# else
(exp, found, a, b, var)
register tTree exp;
register bool * found;
register int * a;
register int * b;
register tTree * var;
# endif
{
# line 203 "Expressions.puma"
{
# line 204 "Expressions.puma"
if (! ((exp == NoTree))) goto yyL1;
{
# line 205 "Expressions.puma"
printf ("Call of ResolveExpression with NoTree\n");
# line 206 "Expressions.puma"
kill_in_protocol ();
}
}
* found = false;
* a = 0;
* b = 0;
* var = NoTree;
return;
yyL1:;
# line 209 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 210 "Expressions.puma"
GetIntConstValue (exp, & yyV1, & yyV2);
# line 211 "Expressions.puma"
if (! ((yyV1))) goto yyL2;
}
* found = true;
* a = 0;
* b = yyV2;
* var = NoTree;
return;
}
yyL2:;
switch (exp->Kind) {
case kOP_EXP:
if (exp->OP_EXP.EXP_OP->Kind == kOP_PLUS) {
# line 214 "Expressions.puma"
{
bool yyV1;
int yyV2;
int yyV3;
tTree yyV4;
bool yyV5;
int yyV6;
int yyV7;
tTree yyV8;
bool yyV9;
tTree yyV10;
{
# line 215 "Expressions.puma"
ResolveExpression (exp->OP_EXP.OPND1, & yyV1, & yyV2, & yyV3, & yyV4);
# line 216 "Expressions.puma"
if (! ((yyV1))) goto yyL3;
{
# line 217 "Expressions.puma"
ResolveExpression (exp->OP_EXP.OPND2, & yyV5, & yyV6, & yyV7, & yyV8);
# line 218 "Expressions.puma"
if (! ((yyV5))) goto yyL3;
{
# line 219 "Expressions.puma"
MergeVars (yyV2, yyV4, yyV6, yyV8, & yyV9, & yyV10);
# line 220 "Expressions.puma"
if (! ((yyV9))) goto yyL3;
}
}
}
* found = true;
* a = yyV2 + yyV6;
* b = yyV3 + yyV7;
* var = yyV10;
return;
}
yyL3:;
}
if (exp->OP_EXP.EXP_OP->Kind == kOP_MINUS) {
# line 223 "Expressions.puma"
{
bool yyV1;
int yyV2;
int yyV3;
tTree yyV4;
bool yyV5;
int yyV6;
int yyV7;
tTree yyV8;
bool yyV9;
tTree yyV10;
{
# line 224 "Expressions.puma"
ResolveExpression (exp->OP_EXP.OPND1, & yyV1, & yyV2, & yyV3, & yyV4);
# line 225 "Expressions.puma"
ResolveExpression (exp->OP_EXP.OPND2, & yyV5, & yyV6, & yyV7, & yyV8);
# line 226 "Expressions.puma"
if (! ((yyV1 && yyV5))) goto yyL4;
{
# line 227 "Expressions.puma"
MergeVars (yyV2, yyV4, yyV6, yyV8, & yyV9, & yyV10);
# line 228 "Expressions.puma"
if (! ((yyV9))) goto yyL4;
}
}
* found = true;
* a = yyV2 - yyV6;
* b = yyV3 - yyV7;
* var = yyV10;
return;
}
yyL4:;
}
if (exp->OP_EXP.EXP_OP->Kind == kOP_TIMES) {
# line 231 "Expressions.puma"
{
bool yyV1;
int yyV2;
bool yyV3;
int yyV4;
int yyV5;
tTree yyV6;
{
# line 232 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND1, & yyV1, & yyV2);
# line 233 "Expressions.puma"
if (! ((yyV1))) goto yyL5;
{
# line 234 "Expressions.puma"
ResolveExpression (exp->OP_EXP.OPND2, & yyV3, & yyV4, & yyV5, & yyV6);
# line 235 "Expressions.puma"
if (! ((yyV3))) goto yyL5;
}
}
* found = true;
* a = yyV2 * yyV4;
* b = yyV2 * yyV5;
* var = yyV6;
return;
}
yyL5:;
# line 238 "Expressions.puma"
{
bool yyV1;
int yyV2;
bool yyV3;
int yyV4;
int yyV5;
tTree yyV6;
{
# line 239 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND2, & yyV1, & yyV2);
# line 240 "Expressions.puma"
if (! ((yyV1))) goto yyL6;
{
# line 241 "Expressions.puma"
ResolveExpression (exp->OP_EXP.OPND1, & yyV3, & yyV4, & yyV5, & yyV6);
# line 242 "Expressions.puma"
if (! ((yyV3))) goto yyL6;
}
}
* found = yyV3 && yyV1;
* a = yyV2 * yyV4;
* b = yyV2 * yyV5;
* var = yyV6;
return;
}
yyL6:;
}
break;
case kOP1_EXP:
if (exp->OP1_EXP.EXP_OP1->Kind == kOP1_SIGN) {
# line 245 "Expressions.puma"
{
bool yyV1;
int yyV2;
int yyV3;
tTree yyV4;
{
# line 246 "Expressions.puma"
ResolveExpression (exp->OP1_EXP.OPND, & yyV1, & yyV2, & yyV3, & yyV4);
# line 247 "Expressions.puma"
if (! ((yyV1))) goto yyL7;
}
* found = yyV1;
* a = - yyV2;
* b = - yyV3;
* var = yyV4;
return;
}
yyL7:;
}
break;
case kVAR_EXP:
# line 250 "Expressions.puma"
* found = true;
* a = 1;
* b = 0;
* var = exp->VAR_EXP.V;
return;
case kVAR_PARAM:
# line 253 "Expressions.puma"
* found = true;
* a = 1;
* b = 0;
* var = exp->VAR_PARAM.V;
return;
case kUSED_VAR:
# line 256 "Expressions.puma"
* found = true;
* a = 1;
* b = 0;
* var = exp;
return;
case kINDEXED_VAR:
# line 259 "Expressions.puma"
* found = true;
* a = 1;
* b = 0;
* var = exp;
return;
case kLOOP_VAR:
# line 262 "Expressions.puma"
* found = true;
* a = 1;
* b = 0;
* var = exp;
return;
}
# line 265 "Expressions.puma"
* found = false;
* a = 0;
* b = 0;
* var = NoTree;
return;
;
}
static void MergeVars
# if defined __STDC__ | defined __cplusplus
(register int a1, register tTree v1, register int a2, register tTree v2, register bool * ok, register tTree * var)
# else
(a1, v1, a2, v2, ok, var)
register int a1;
register tTree v1;
register int a2;
register tTree v2;
register bool * ok;
register tTree * var;
# endif
{
if (equalint (a1, 0)) {
# line 271 "Expressions.puma"
* ok = true;
* var = v2;
return;
}
if (equalint (a2, 0)) {
# line 274 "Expressions.puma"
* ok = true;
* var = v1;
return;
}
# line 277 "Expressions.puma"
{
# line 278 "Expressions.puma"
if (! ( EqualExpression (v1, v2) == true)) goto yyL3;
}
* ok = true;
* var = v1;
return;
yyL3:;
# line 281 "Expressions.puma"
* ok = false;
* var = NoTree;
return;
;
}
bool EqualExpression
# if defined __STDC__ | defined __cplusplus
(register tTree e1, register tTree e2)
# else
(e1, e2)
register tTree e1;
register tTree e2;
# endif
{
# line 293 "Expressions.puma"
{
bool found;
int val1;
int val2;
{
# line 295 "Expressions.puma"
# line 296 "Expressions.puma"
# line 297 "Expressions.puma"
# line 299 "Expressions.puma"
GetIntConstValue (e1, &found, &val1);
# line 300 "Expressions.puma"
if (! ((found))) goto yyL1;
{
# line 301 "Expressions.puma"
GetIntConstValue (e2, &found, &val2);
# line 302 "Expressions.puma"
if (! ((found))) goto yyL1;
{
# line 303 "Expressions.puma"
if (! ((val1 == val2))) goto yyL1;
}
}
}
return true;
}
yyL1:;
switch (e1->Kind) {
case kSLICE_EXP:
if (e2->Kind == kSLICE_EXP) {
# line 306 "Expressions.puma"
{
# line 307 "Expressions.puma"
if (! (EqualExpression (e1->SLICE_EXP.START, e2->SLICE_EXP.START))) goto yyL2;
{
# line 308 "Expressions.puma"
if (! (EqualExpression (e1->SLICE_EXP.STOP, e2->SLICE_EXP.STOP))) goto yyL2;
{
# line 309 "Expressions.puma"
if (! (EqualExpression (e1->SLICE_EXP.INC, e2->SLICE_EXP.INC))) goto yyL2;
}
}
}
return true;
yyL2:;
}
break;
case kDUMMY_EXP:
if (e2->Kind == kDUMMY_EXP) {
# line 312 "Expressions.puma"
return true;
}
break;
case kVAR_EXP:
if (e2->Kind == kVAR_EXP) {
# line 315 "Expressions.puma"
{
# line 316 "Expressions.puma"
if (! (EqualExpression (e1->VAR_EXP.V, e2->VAR_EXP.V))) goto yyL4;
}
return true;
yyL4:;
}
break;
case kUSED_VAR:
if (e2->Kind == kUSED_VAR) {
# line 319 "Expressions.puma"
{
# line 320 "Expressions.puma"
if (! (EqualExpression (e1->USED_VAR.VARNAME, e2->USED_VAR.VARNAME))) goto yyL5;
}
return true;
yyL5:;
}
break;
case kLOOP_VAR:
if (e2->Kind == kLOOP_VAR) {
# line 323 "Expressions.puma"
{
# line 324 "Expressions.puma"
if (! (EqualExpression (e1->LOOP_VAR.LOOP_VARNAME, e2->LOOP_VAR.LOOP_VARNAME))) goto yyL6;
}
return true;
yyL6:;
}
break;
case kVAR_OBJ:
if (e2->Kind == kVAR_OBJ) {
# line 327 "Expressions.puma"
{
# line 329 "Expressions.puma"
if (! (e1->VAR_OBJ.Ident == e2->VAR_OBJ.Ident)) goto yyL7;
}
return true;
yyL7:;
}
break;
case kOP_EXP:
if (e2->Kind == kOP_EXP) {
# line 332 "Expressions.puma"
{
# line 334 "Expressions.puma"
if (! (e1->OP_EXP.EXP_OP -> Kind == e2->OP_EXP.EXP_OP -> Kind)) goto yyL8;
{
# line 335 "Expressions.puma"
if (! (EqualExpression (e1->OP_EXP.OPND1, e2->OP_EXP.OPND1))) goto yyL8;
{
# line 336 "Expressions.puma"
if (! (EqualExpression (e1->OP_EXP.OPND2, e2->OP_EXP.OPND2))) goto yyL8;
}
}
}
return true;
yyL8:;
}
break;
case kOP1_EXP:
if (e2->Kind == kOP1_EXP) {
# line 339 "Expressions.puma"
{
# line 341 "Expressions.puma"
if (! (e1->OP1_EXP.EXP_OP1 -> Kind == e2->OP1_EXP.EXP_OP1 -> Kind)) goto yyL9;
{
# line 342 "Expressions.puma"
if (! (EqualExpression (e1->OP1_EXP.OPND, e2->OP1_EXP.OPND))) goto yyL9;
}
}
return true;
yyL9:;
}
break;
}
return false;
}
int IsVarInExp
# if defined __STDC__ | defined __cplusplus
(register tIdent name, register tTree exp)
# else
(name, exp)
register tIdent name;
register tTree exp;
# endif
{
# line 353 "Expressions.puma"
int c;
switch (exp->Kind) {
case kVAR_OBJ:
# line 357 "Expressions.puma"
{
# line 358 "Expressions.puma"
if (! (name == exp->VAR_OBJ.Ident)) goto yyL1;
}
return 1;
yyL1:;
# line 362 "Expressions.puma"
return 0;
case kUSED_VAR:
# line 366 "Expressions.puma"
return IsVarInExp (name, exp->USED_VAR.VARNAME);
case kLOOP_VAR:
# line 370 "Expressions.puma"
return IsVarInExp (name, exp->LOOP_VAR.LOOP_VARNAME);
case kINDEXED_VAR:
# line 374 "Expressions.puma"
return (IsVarInExp (name, exp->INDEXED_VAR.IND_VAR) + IsVarInExp (name, exp->INDEXED_VAR.IND_EXPS));
case kVAR_EXP:
# line 378 "Expressions.puma"
return IsVarInExp (name, exp->VAR_EXP.V);
case kBTE_LIST:
# line 382 "Expressions.puma"
return (IsVarInExp (name, exp->BTE_LIST.Elem) + IsVarInExp (name, exp->BTE_LIST.Next));
case kBTE_EMPTY:
# line 386 "Expressions.puma"
return 0;
case kSLICE_EXP:
# line 390 "Expressions.puma"
return (IsVarInExp (name, exp->SLICE_EXP.START) + IsVarInExp (name, exp->SLICE_EXP.STOP) + IsVarInExp (name, exp->SLICE_EXP.INC));
case kDUMMY_EXP:
# line 395 "Expressions.puma"
return 0;
case kCONST_EXP:
# line 399 "Expressions.puma"
return 0;
case kADDR:
# line 403 "Expressions.puma"
return (IsVarInExp (name, exp->ADDR.E));
case kOP_EXP:
# line 407 "Expressions.puma"
return (IsVarInExp (name, exp->OP_EXP.OPND1) + IsVarInExp (name, exp->OP_EXP.OPND2));
case kOP1_EXP:
# line 411 "Expressions.puma"
return (IsVarInExp (name, exp->OP1_EXP.OPND));
case kARRAY_EXP:
# line 415 "Expressions.puma"
return IsVarInExp (name, exp->ARRAY_EXP.ELEMENTS);
case kFUNC_CALL_EXP:
# line 419 "Expressions.puma"
return IsVarInExp (name, exp->FUNC_CALL_EXP.FUNC_PARAMS);
case kBTP_LIST:
# line 423 "Expressions.puma"
return (IsVarInExp (name, exp->BTP_LIST.Elem) + IsVarInExp (name, exp->BTP_LIST.Next));
case kBTP_EMPTY:
# line 427 "Expressions.puma"
return 0;
case kVAR_PARAM:
# line 431 "Expressions.puma"
return (IsVarInExp (name, exp->VAR_PARAM.V));
}
# line 435 "Expressions.puma"
{
# line 436 "Expressions.puma"
printf ("Determination of IsVarInExp fails\n");
# line 437 "Expressions.puma"
FileUnparse (stdout, exp);
# line 438 "Expressions.puma"
WriteTree (stdout, exp);
# line 439 "Expressions.puma"
exit (- 1);
}
return 0;
}
tTree MakeNotExp
# if defined __STDC__ | defined __cplusplus
(register tTree e)
# else
(e)
register tTree e;
# endif
{
if (e->Kind == kOP1_EXP) {
if (e->OP1_EXP.EXP_OP1->Kind == kOP1_NOT) {
# line 451 "Expressions.puma"
return e->OP1_EXP.OPND;
}
}
if (e->Kind == kOP_EXP) {
if (e->OP_EXP.EXP_OP->Kind == kOP_LT) {
# line 455 "Expressions.puma"
{
# line 456 "Expressions.puma"
e->OP_EXP.EXP_OP = mOP_GE ();
}
return e;
}
if (e->OP_EXP.EXP_OP->Kind == kOP_LE) {
# line 460 "Expressions.puma"
{
# line 461 "Expressions.puma"
e->OP_EXP.EXP_OP = mOP_GT ();
}
return e;
}
if (e->OP_EXP.EXP_OP->Kind == kOP_GT) {
# line 465 "Expressions.puma"
{
# line 466 "Expressions.puma"
e->OP_EXP.EXP_OP = mOP_LE ();
}
return e;
}
if (e->OP_EXP.EXP_OP->Kind == kOP_GE) {
# line 470 "Expressions.puma"
{
# line 471 "Expressions.puma"
e->OP_EXP.EXP_OP = mOP_LT ();
}
return e;
}
if (e->OP_EXP.EXP_OP->Kind == kOP_EQ) {
# line 475 "Expressions.puma"
{
# line 476 "Expressions.puma"
e->OP_EXP.EXP_OP = mOP_NE ();
}
return e;
}
if (e->OP_EXP.EXP_OP->Kind == kOP_NE) {
# line 480 "Expressions.puma"
{
# line 481 "Expressions.puma"
e->OP_EXP.EXP_OP = mOP_NE ();
}
return e;
}
}
# line 485 "Expressions.puma"
return mOP1_EXP (mOP1_NOT (), e);
}
void SliceIncrement
# if defined __STDC__ | defined __cplusplus
(register tTree yyP1, register bool * yyP3, register int * yyP2)
# else
(yyP1, yyP3, yyP2)
register tTree yyP1;
register bool * yyP3;
register int * yyP2;
# endif
{
if (yyP1->Kind == kSLICE_EXP) {
# line 491 "Expressions.puma"
{
bool found;
int val;
{
# line 492 "Expressions.puma"
# line 493 "Expressions.puma"
# line 494 "Expressions.puma"
if (yyP1->SLICE_EXP.INC == NoTree)
{ found = true;
val = 1;
}
else if (yyP1->SLICE_EXP.INC->Kind == kDUMMY_EXP)
{ found = true;
val = 1;
}
else
GetIntConstValue (yyP1->SLICE_EXP.INC, &found, &val);
}
* yyP3 = found;
* yyP2 = val;
return;
}
}
;
}
tTree MakeSliceExp
# if defined __STDC__ | defined __cplusplus
(register tTree start, register tTree stop)
# else
(start, stop)
register tTree start;
register tTree stop;
# endif
{
# line 517 "Expressions.puma"
{
bool yyV1;
int yyV2;
bool yyV3;
int yyV4;
tTree exp;
{
# line 518 "Expressions.puma"
GetIntConstValue (start, & yyV1, & yyV2);
# line 519 "Expressions.puma"
if (! (yyV1)) goto yyL1;
{
# line 520 "Expressions.puma"
GetIntConstValue (stop, & yyV3, & yyV4);
# line 522 "Expressions.puma"
# line 524 "Expressions.puma"
if (yyV3)
exp = mCONST_EXP (mINT_CONSTANT (yyV4 - yyV2 + 1));
else if (yyV2 > 1)
exp = mOP_EXP (mOP_MINUS(), stop, mCONST_EXP (mINT_CONSTANT(yyV2-1)));
else if (yyV2 < 1)
exp = mOP_EXP (mOP_PLUS(), stop, mCONST_EXP (mINT_CONSTANT(1-yyV2)));
else
exp = stop;
}
}
{
return exp;
}
}
yyL1:;
# line 538 "Expressions.puma"
{
tTree exp;
{
# line 542 "Expressions.puma"
# line 544 "Expressions.puma"
exp = mOP_EXP (mOP_MINUS(), stop, start);
exp = mOP_EXP (mOP_PLUS (), exp, mCONST_EXP (mINT_CONSTANT(1)));
}
{
return exp;
}
}
}
tTree AddConstant
# if defined __STDC__ | defined __cplusplus
(register tTree exp, register int c)
# else
(exp, c)
register tTree exp;
register int c;
# endif
{
if (equalint (c, 0)) {
# line 562 "Expressions.puma"
return exp;
}
# line 566 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 567 "Expressions.puma"
GetIntConstValue (exp, & yyV1, & yyV2);
# line 568 "Expressions.puma"
if (! (yyV1 == true)) goto yyL2;
}
{
return MakeConstant (c + yyV2);
}
}
yyL2:;
if (exp->Kind == kOP_EXP) {
if (exp->OP_EXP.EXP_OP->Kind == kOP_PLUS) {
# line 572 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 573 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND1, & yyV1, & yyV2);
# line 574 "Expressions.puma"
if (! (yyV1 == true)) goto yyL3;
}
{
return AddConstant (exp->OP_EXP.OPND2, c + yyV2);
}
}
yyL3:;
# line 578 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 579 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND2, & yyV1, & yyV2);
# line 580 "Expressions.puma"
if (! (yyV1 == true)) goto yyL4;
}
{
return AddConstant (exp->OP_EXP.OPND1, c + yyV2);
}
}
yyL4:;
}
if (exp->OP_EXP.EXP_OP->Kind == kOP_MINUS) {
# line 584 "Expressions.puma"
{
bool yyV1;
int yyV2;
{
# line 585 "Expressions.puma"
GetIntConstValue (exp->OP_EXP.OPND2, & yyV1, & yyV2);
# line 586 "Expressions.puma"
if (! (yyV1 == true)) goto yyL5;
}
{
return AddConstant (exp->OP_EXP.OPND1, c - yyV2);
}
}
yyL5:;
}
}
# line 590 "Expressions.puma"
{
# line 591 "Expressions.puma"
if (! (c > 0)) goto yyL6;
}
return mOP_EXP (mOP_PLUS (), exp, mCONST_EXP (mINT_CONSTANT (c)));
yyL6:;
# line 595 "Expressions.puma"
{
# line 596 "Expressions.puma"
if (! (c < 0)) goto yyL7;
}
return mOP_EXP (mOP_MINUS (), exp, mCONST_EXP (mINT_CONSTANT (- c)));
yyL7:;
yyAbort ("AddConstant");
}
tTree MakeConstant
# if defined __STDC__ | defined __cplusplus
(register int n)
# else
(n)
register int n;
# endif
{
# line 602 "Expressions.puma"
{
# line 603 "Expressions.puma"
if (! ((n >= 0))) goto yyL1;
}
return mCONST_EXP (mINT_CONSTANT (n));
yyL1:;
# line 607 "Expressions.puma"
return mOP1_EXP (mOP1_SIGN (), mCONST_EXP (mINT_CONSTANT (- n)));
}
void BeginExpressions ()
{
}
void CloseExpressions ()
{
}