home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
adaptor.zip
/
adapt.zip
/
adaptor
/
src
/
semexp.c
< prev
next >
Wrap
Text File
|
1994-01-03
|
29KB
|
1,358 lines
# include "SemExp.h"
# include "yySExp.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 46 "SemExp.puma"
# include "Idents.h"
# include "StringMe.h"
# include "protocol.h"
# include "Types.h"
# include "ShowDefs.h"
bool IsAllocated (); /* global used from Semantic.puma */
void SemanticCall (); /* global used from Semantic.puma */
int Nesting; /* actual nesting depth */
tTree Nest[MAXLoops]; /* actual loops of loop nesting */
static FILE * yyf = stdout;
static void yyAbort
# ifdef __cplusplus
(char * yyFunction)
# else
(yyFunction) char * yyFunction;
# endif
{
(void) fprintf (stderr, "Error: module SemExp, routine %s failed\n", yyFunction);
exit (1);
}
void SemExp ARGS((tTree t, int * ResultRank));
static void SemIndexList ARGS((tTree t, int * ResultRank));
void SemExpList ARGS((tTree t));
static void SemIntrParamList ARGS((tTree t, int * ResultRank));
void SemParamList ARGS((tTree t));
static void AnalIntrinsicFunction ARGS((tIdent name, tTree params, int * ResultRank));
static void CheckMerge ARGS((tTree params, int * ResultRank));
static void CheckCShift ARGS((tTree params, int * ResultRank));
static void CheckTranspose ARGS((tTree params, int * ResultRank));
static void CheckSpread ARGS((tTree params, int * ResultRank));
static void CheckRed ARGS((tTree params, int * ResultRank));
static bool IsCurrentLoopVar ARGS((tTree t));
static tTree CheckNamedParameters ARGS((tTree t));
static void DefineNamedParameters ARGS((tTree t));
static tTree GetUnnamedParameters ARGS((tTree t));
void SemExp
# if defined __STDC__ | defined __cplusplus
(register tTree t, register int * ResultRank)
# else
(t, ResultRank)
register tTree t;
register int * ResultRank;
# endif
{
if (t == NoTree) return;
switch (t->Kind) {
case kUSED_VAR:
# line 81 "SemExp.puma"
{
int yyV1;
{
# line 83 "SemExp.puma"
if (IsCurrentLoopVar (t))
t->Kind = kLOOP_VAR;
# line 87 "SemExp.puma"
SemExp (t->USED_VAR.VARNAME, & yyV1);
}
* ResultRank = yyV1;
return;
}
case kLOOP_VAR:
# line 90 "SemExp.puma"
{
int yyV1;
{
# line 91 "SemExp.puma"
SemExp (t->LOOP_VAR.LOOP_VARNAME, & yyV1);
}
* ResultRank = yyV1;
return;
}
case kSELECTED_VAR:
# line 94 "SemExp.puma"
{
int yyV1;
{
# line 95 "SemExp.puma"
SemExp (t->SELECTED_VAR.SELEC_VAR, & yyV1);
}
* ResultRank = yyV1 + VarRank (t->SELECTED_VAR.SELECTOR->REC_COMP.Object);
return;
}
case kSUBSTRING_VAR:
# line 98 "SemExp.puma"
{
int yyV1;
int yyV2;
{
# line 100 "SemExp.puma"
SemExp (t->SUBSTRING_VAR.IND_VAR, & yyV1);
# line 101 "SemExp.puma"
if (yyV1 != 0)
{ error_protocol ("rank of string variable > 0");
tree_protocol ("string variable is ", t);
}
# line 106 "SemExp.puma"
SemExp (t->SUBSTRING_VAR.IND_EXP, & yyV2);
}
* ResultRank = 0;
return;
}
case kINDEXED_VAR:
# line 109 "SemExp.puma"
{
int yyV1;
int yyV2;
{
# line 111 "SemExp.puma"
SemExp (t->INDEXED_VAR.IND_VAR, & yyV1);
# line 112 "SemExp.puma"
if (yyV1 != TreeListLength (t->INDEXED_VAR.IND_EXPS))
{ error_protocol ("Illegal number of indexes");
tree_protocol ("Indexed variable is ", t);
}
# line 117 "SemExp.puma"
SemIndexList (t->INDEXED_VAR.IND_EXPS, & yyV2);
}
* ResultRank = yyV2;
return;
}
case kVAR_OBJ:
# line 120 "SemExp.puma"
{
int rank;
{
# line 122 "SemExp.puma"
# line 124 "SemExp.puma"
if (t->VAR_OBJ.Object == NoObject)
{ error_protocol ("No object for use of variable found");
tree_protocol ("Variable is ", t);
rank = 0;
}
else if (t->VAR_OBJ.Object != GetGlobalDecl (t->VAR_OBJ.Ident))
{ error_protocol ("var name has become a function name");
obj_error_protocol ("var has obj = ", t->VAR_OBJ.Object);
obj_error_protocol ("table has obj = ", GetGlobalDecl(t->VAR_OBJ.Ident));
rank = 0;
}
else
{ rank = VarRank (t->VAR_OBJ.Object);
if (IsVarAllocatable (t->VAR_OBJ.Object))
{ if (!IsAllocated (t->VAR_OBJ.Ident))
{ error_protocol ("Allocatable Variable used before allocate");
tree_protocol ("Variable is ", t);
}
}
}
}
* ResultRank = rank;
return;
}
case kDUMMY_EXP:
# line 156 "SemExp.puma"
* ResultRank = 0;
return;
case kCONST_EXP:
# line 159 "SemExp.puma"
* ResultRank = 0;
return;
case kARRAY_EXP:
# line 162 "SemExp.puma"
{
# line 163 "SemExp.puma"
SemExpList (t->ARRAY_EXP.ELEMENTS);
}
* ResultRank = 1;
return;
case kSLICE_EXP:
# line 166 "SemExp.puma"
{
int yyV1;
int yyV2;
int yyV3;
{
# line 168 "SemExp.puma"
SemExp (t->SLICE_EXP.START, & yyV1);
# line 169 "SemExp.puma"
if (yyV1 != 0)
{ error_protocol ("Start in Slice has illegal rank");
tree_protocol ("Expression is ", t->SLICE_EXP.START);
}
# line 175 "SemExp.puma"
SemExp (t->SLICE_EXP.STOP, & yyV2);
# line 176 "SemExp.puma"
if (yyV2 != 0)
{ error_protocol ("Stop in Slice has illegal rank");
tree_protocol ("Expression is ", t->SLICE_EXP.STOP);
}
# line 182 "SemExp.puma"
SemExp (t->SLICE_EXP.INC, & yyV3);
# line 183 "SemExp.puma"
if (yyV3 != 0)
{ error_protocol ("Increment in Slice has illegal rank");
tree_protocol ("Expression is ", t->SLICE_EXP.INC);
}
}
* ResultRank = 1;
return;
}
case kOP_EXP:
# line 190 "SemExp.puma"
{
int yyV1;
int yyV2;
{
# line 192 "SemExp.puma"
SemExp (t->OP_EXP.OPND1, & yyV1);
# line 193 "SemExp.puma"
SemExp (t->OP_EXP.OPND2, & yyV2);
# line 195 "SemExp.puma"
if (yyV1 == 0)
yyV1 = yyV2;
else if (yyV2 == 0)
yyV1 = yyV1;
else if (yyV1 != yyV2)
{ error_protocol ("Rank Error for binary expression");
tree_protocol ("Expression is : ", t);
}
}
* ResultRank = yyV1;
return;
}
case kOP1_EXP:
# line 206 "SemExp.puma"
{
int yyV1;
{
# line 207 "SemExp.puma"
SemExp (t->OP1_EXP.OPND, & yyV1);
}
* ResultRank = yyV1;
return;
}
case kTYPE_EXP:
# line 210 "SemExp.puma"
{
# line 211 "SemExp.puma"
SemExpList (t->TYPE_EXP.ELEMENTS);
}
* ResultRank = 0;
return;
case kVAR_EXP:
# line 214 "SemExp.puma"
{
int yyV1;
{
# line 215 "SemExp.puma"
SemExp (t->VAR_EXP.V, & yyV1);
}
* ResultRank = yyV1;
return;
}
case kDO_EXP:
# line 218 "SemExp.puma"
{
int yyV1;
int yyV2;
{
# line 219 "SemExp.puma"
SemExp (t->DO_EXP.DO_ID, & yyV1);
# line 220 "SemExp.puma"
SemExp (t->DO_EXP.RANGE, & yyV2);
# line 221 "SemExp.puma"
SemExpList (t->DO_EXP.BODY);
}
* ResultRank = 1;
return;
}
case kFUNC_CALL_EXP:
# line 224 "SemExp.puma"
{
int rank;
int len;
{
# line 226 "SemExp.puma"
if (! (IsIntrFunc (t) == true)) goto yyL16;
{
# line 228 "SemExp.puma"
# line 229 "SemExp.puma"
# line 231 "SemExp.puma"
len = TreeListLength (t->FUNC_CALL_EXP.FUNC_PARAMS);
# line 232 "SemExp.puma"
if (IntrFuncKind1 (t->FUNC_CALL_EXP.FUNC_ID->PROC_OBJ.Ident))
{ if (len != 1)
{ error_protocol ("One parameter for function call is required");
tree_protocol ("Function call is : ", t);
}
SemIntrParamList (t->FUNC_CALL_EXP.FUNC_PARAMS, &rank);
}
else if (IntrFuncKind2 (t->FUNC_CALL_EXP.FUNC_ID->PROC_OBJ.Ident))
{ if (len != 2)
{ error_protocol ("Two parameters for function call are required");
tree_protocol ("Function call is : ", t);
}
SemIntrParamList (t->FUNC_CALL_EXP.FUNC_PARAMS, &rank);
}
else if (IntrFuncKindn (t->FUNC_CALL_EXP.FUNC_ID->PROC_OBJ.Ident))
{ if (len < 1)
{ error_protocol ("No parameter in intrinsic function");
tree_protocol ("Function call is : ", t);
}
SemIntrParamList (t->FUNC_CALL_EXP.FUNC_PARAMS, &rank);
}
else
{ t->FUNC_CALL_EXP.FUNC_PARAMS = GetUnnamedParameters (t->FUNC_CALL_EXP.FUNC_PARAMS);
AnalIntrinsicFunction (t->FUNC_CALL_EXP.FUNC_ID->PROC_OBJ.Ident, t->FUNC_CALL_EXP.FUNC_PARAMS, &rank);
}
}
}
* ResultRank = rank;
return;
}
yyL16:;
# line 260 "SemExp.puma"
{
# line 263 "SemExp.puma"
SemanticCall (t, t->FUNC_CALL_EXP.FUNC_ID->PROC_OBJ.Object);
}
* ResultRank = 0;
return;
case kVAR_PARAM:
# line 272 "SemExp.puma"
{
int yyV1;
{
# line 274 "SemExp.puma"
SemExp (t->VAR_PARAM.V, & yyV1);
}
* ResultRank = yyV1;
return;
}
case kNAMED_PARAM:
# line 277 "SemExp.puma"
{
int yyV1;
{
# line 279 "SemExp.puma"
SemExp (t->NAMED_PARAM.VAL, & yyV1);
}
* ResultRank = yyV1;
return;
}
case kPROC_PARAM:
# line 282 "SemExp.puma"
* ResultRank = 0;
return;
case kADDR:
# line 285 "SemExp.puma"
{
int yyV1;
{
# line 286 "SemExp.puma"
SemExp (t->ADDR.E, & yyV1);
}
* ResultRank = yyV1;
return;
}
}
# line 289 "SemExp.puma"
{
# line 290 "SemExp.puma"
error_protocol ("Unknown Tree Node for SemExp");
printf ("Unknown Tree Node in SemExp");
FileUnparse (stdout, t);
WriteTree (stdout, t);
kill_in_protocol ();
}
* ResultRank = 0;
return;
;
}
static void SemIndexList
# if defined __STDC__ | defined __cplusplus
(register tTree t, register int * ResultRank)
# else
(t, ResultRank)
register tTree t;
register int * ResultRank;
# endif
{
if (t == NoTree) return;
if (t->Kind == kBTE_LIST) {
# line 315 "SemExp.puma"
{
int yyV1;
int yyV2;
{
# line 317 "SemExp.puma"
SemExp (t->BTE_LIST.Elem, & yyV1);
# line 318 "SemExp.puma"
if (yyV1 > 1)
{ error_protocol ("Illegal Rank of an Index");
tree_protocol ("Index is : ", t->BTE_LIST.Elem);
}
# line 323 "SemExp.puma"
SemIndexList (t->BTE_LIST.Next, & yyV2);
}
* ResultRank = yyV2 + yyV1;
return;
}
}
if (t->Kind == kBTE_EMPTY) {
# line 326 "SemExp.puma"
* ResultRank = 0;
return;
}
# line 329 "SemExp.puma"
{
# line 330 "SemExp.puma"
error_protocol ("Illegal Call of SemIndexList");
# line 331 "SemExp.puma"
printf ("Illegal Call of SemIndexList, Tree : ");
# line 332 "SemExp.puma"
FileUnparse (stdout, t);
# line 333 "SemExp.puma"
WriteTree (stdout, t);
# line 334 "SemExp.puma"
kill_in_protocol ();
}
* ResultRank = 0;
return;
;
}
void SemExpList
# if defined __STDC__ | defined __cplusplus
(register tTree t)
# else
(t)
register tTree t;
# endif
{
if (t == NoTree) return;
if (t->Kind == kBTE_LIST) {
# line 347 "SemExp.puma"
{
int yyV1;
{
# line 349 "SemExp.puma"
SemExp (t->BTE_LIST.Elem, & yyV1);
# line 350 "SemExp.puma"
SemExpList (t->BTE_LIST.Next);
}
return;
}
}
if (t->Kind == kBTE_EMPTY) {
# line 353 "SemExp.puma"
return;
}
# line 356 "SemExp.puma"
{
# line 357 "SemExp.puma"
error_protocol ("Illegal Call of SemExpList");
# line 358 "SemExp.puma"
printf ("Illegal Call of SemExpList, Tree : ");
# line 359 "SemExp.puma"
FileUnparse (stdout, t);
# line 360 "SemExp.puma"
WriteTree (stdout, t);
# line 361 "SemExp.puma"
kill_in_protocol ();
}
return;
;
}
static void SemIntrParamList
# if defined __STDC__ | defined __cplusplus
(register tTree t, register int * ResultRank)
# else
(t, ResultRank)
register tTree t;
register int * ResultRank;
# endif
{
if (t == NoTree) return;
if (t->Kind == kBTP_LIST) {
# line 372 "SemExp.puma"
{
int rank;
int yyV1;
int yyV2;
{
# line 374 "SemExp.puma"
# line 376 "SemExp.puma"
SemExp (t->BTP_LIST.Elem, & yyV1);
# line 377 "SemExp.puma"
SemIntrParamList (t->BTP_LIST.Next, & yyV2);
# line 379 "SemExp.puma"
if (yyV1 == 0)
rank = yyV2;
else if (yyV2 == 0)
rank = yyV1;
else if (yyV1 == yyV2)
rank = yyV1;
else
{ error_protocol ("Illegal Rank combination in Parameter List");
tree_protocol ("parameter list is ", t);
};
}
* ResultRank = rank;
return;
}
}
if (t->Kind == kBTP_EMPTY) {
# line 392 "SemExp.puma"
* ResultRank = 0;
return;
}
# line 395 "SemExp.puma"
{
# line 396 "SemExp.puma"
error_protocol ("Illegal Call of SemIntrParamList");
# line 397 "SemExp.puma"
printf ("Illegal Call of SemIntrParamList, Tree : ");
# line 398 "SemExp.puma"
FileUnparse (stdout, t);
# line 399 "SemExp.puma"
WriteTree (stdout, t);
# line 400 "SemExp.puma"
kill_in_protocol ();
}
* ResultRank = 0;
return;
;
}
void SemParamList
# if defined __STDC__ | defined __cplusplus
(register tTree t)
# else
(t)
register tTree t;
# endif
{
if (t == NoTree) return;
if (t->Kind == kBTP_LIST) {
# line 405 "SemExp.puma"
{
int yyV1;
{
# line 407 "SemExp.puma"
SemExp (t->BTP_LIST.Elem, & yyV1);
# line 408 "SemExp.puma"
SemParamList (t->BTP_LIST.Next);
}
return;
}
}
if (t->Kind == kBTP_EMPTY) {
# line 411 "SemExp.puma"
return;
}
# line 414 "SemExp.puma"
{
# line 415 "SemExp.puma"
error_protocol ("Illegal Call of SemParamList");
# line 416 "SemExp.puma"
printf ("Illegal Call of SemParamList, Tree : ");
# line 417 "SemExp.puma"
FileUnparse (stdout, t);
# line 418 "SemExp.puma"
WriteTree (stdout, t);
# line 419 "SemExp.puma"
kill_in_protocol ();
}
return;
;
}
static void AnalIntrinsicFunction
# if defined __STDC__ | defined __cplusplus
(register tIdent name, register tTree params, register int * ResultRank)
# else
(name, params, ResultRank)
register tIdent name;
register tTree params;
register int * ResultRank;
# endif
{
# line 431 "SemExp.puma"
int no;
if (params == NoTree) return;
# line 437 "SemExp.puma"
{
int yyV1;
{
# line 439 "SemExp.puma"
if (! (IntrFuncRed (name) == true)) goto yyL1;
{
# line 441 "SemExp.puma"
SemParamList (params);
# line 442 "SemExp.puma"
CheckRed (params, & yyV1);
}
}
* ResultRank = yyV1;
return;
}
yyL1:;
if (equaltIdent (name, MakeIdent ("MINLOC", 6))) {
# line 445 "SemExp.puma"
{
# line 446 "SemExp.puma"
SemParamList (params);
# line 447 "SemExp.puma"
error_protocol ("MINLOC is not supported until now");
}
* ResultRank = 0;
return;
}
if (equaltIdent (name, MakeIdent ("MAXLOC", 6))) {
# line 450 "SemExp.puma"
{
# line 451 "SemExp.puma"
SemParamList (params);
# line 452 "SemExp.puma"
error_protocol ("MAXLOC is not supported until now");
}
* ResultRank = 0;
return;
}
{
int len;
int rank;
if (equaltIdent (name, MakeIdent ("SPREAD", 6))) {
# line 455 "SemExp.puma"
{
# line 457 "SemExp.puma"
# line 458 "SemExp.puma"
# line 460 "SemExp.puma"
SemParamList (params);
# line 461 "SemExp.puma"
len = TreeListLength (params);
if (len != 3)
error_protocol ("SPREAD has not three parameters");
if (len >= 1)
rank = TreeRank (params->BTP_LIST.Elem) + 1;
else
rank = 0;
}
* ResultRank = rank;
return;
}
}
{
int yyV1;
if (equaltIdent (name, MakeIdent ("CSHIFT", 6))) {
# line 471 "SemExp.puma"
{
# line 472 "SemExp.puma"
CheckCShift (params, & yyV1);
}
* ResultRank = yyV1;
return;
}
}
{
int yyV1;
if (equaltIdent (name, MakeIdent ("TRANSPOSE", 9))) {
# line 475 "SemExp.puma"
{
# line 476 "SemExp.puma"
CheckTranspose (params, & yyV1);
}
* ResultRank = yyV1;
return;
}
}
if (equaltIdent (name, MakeIdent ("DOTPRODUCT", 10))) {
# line 479 "SemExp.puma"
{
# line 480 "SemExp.puma"
SemParamList (params);
# line 481 "SemExp.puma"
error_protocol ("DOTPRODUCT is not supported until now");
}
* ResultRank = 0;
return;
}
if (equaltIdent (name, MakeIdent ("MATMUL", 6))) {
# line 484 "SemExp.puma"
{
# line 485 "SemExp.puma"
SemParamList (params);
# line 486 "SemExp.puma"
error_protocol ("MATMUL is not supported until now");
}
* ResultRank = 0;
return;
}
{
int yyV1;
if (equaltIdent (name, MakeIdent ("MERGE", 5))) {
# line 489 "SemExp.puma"
{
# line 490 "SemExp.puma"
CheckMerge (params, & yyV1);
}
* ResultRank = yyV1;
return;
}
}
if (equaltIdent (name, MakeIdent ("EOSHIFT", 7))) {
# line 493 "SemExp.puma"
{
# line 494 "SemExp.puma"
SemParamList (params);
# line 495 "SemExp.puma"
error_protocol ("EOSHIFT is not supported until now");
}
* ResultRank = 0;
return;
}
if (equaltIdent (name, MakeIdent ("DIAGONAL", 8))) {
# line 498 "SemExp.puma"
{
# line 499 "SemExp.puma"
SemParamList (params);
# line 500 "SemExp.puma"
error_protocol ("DIAGONAL ist not supported until now");
}
* ResultRank = 0;
return;
}
if (equaltIdent (name, MakeIdent ("PACK", 4))) {
# line 503 "SemExp.puma"
{
# line 504 "SemExp.puma"
SemParamList (params);
# line 505 "SemExp.puma"
error_protocol ("PACK ist not supported until now");
}
* ResultRank = 0;
return;
}
if (equaltIdent (name, MakeIdent ("UNPACK", 6))) {
# line 508 "SemExp.puma"
{
# line 509 "SemExp.puma"
SemParamList (params);
# line 510 "SemExp.puma"
error_protocol ("UNPACK ist not supported until now");
}
* ResultRank = 0;
return;
}
# line 513 "SemExp.puma"
{
# line 514 "SemExp.puma"
SemParamList (params);
# line 515 "SemExp.puma"
error_protocol ("Unknown intrinsic Function in Semantic Analysis");
}
* ResultRank = 0;
return;
;
}
static void CheckMerge
# if defined __STDC__ | defined __cplusplus
(register tTree params, register int * ResultRank)
# else
(params, ResultRank)
register tTree params;
register int * ResultRank;
# endif
{
if (params == NoTree) return;
if (params->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->BTP_LIST.Next->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->BTP_LIST.Next->BTP_LIST.Next->Kind == kBTP_EMPTY) {
# line 526 "SemExp.puma"
{
int yyV1;
int yyV2;
int yyV3;
{
# line 528 "SemExp.puma"
SemExp (params->BTP_LIST.Elem, & yyV1);
# line 529 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Elem, & yyV2);
# line 530 "SemExp.puma"
if (yyV1 != yyV2)
error_protocol ("Parameters in MERGE have different rank");
# line 533 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Next->BTP_LIST.Elem, & yyV3);
# line 534 "SemExp.puma"
if (yyV1 != yyV3)
error_protocol ("Mask in MERGE has wrong rank");
}
* ResultRank = yyV1;
return;
}
}
}
}
}
# line 539 "SemExp.puma"
{
# line 540 "SemExp.puma"
error_protocol ("MERGE has not three Parameters");
}
* ResultRank = 0;
return;
;
}
static void CheckCShift
# if defined __STDC__ | defined __cplusplus
(register tTree params, register int * ResultRank)
# else
(params, ResultRank)
register tTree params;
register int * ResultRank;
# endif
{
if (params == NoTree) return;
if (params->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->BTP_LIST.Next->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->BTP_LIST.Next->BTP_LIST.Next->Kind == kBTP_EMPTY) {
# line 551 "SemExp.puma"
{
int yyV1;
int yyV2;
int yyV3;
{
# line 553 "SemExp.puma"
SemExp (params->BTP_LIST.Elem, & yyV1);
# line 554 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Elem, & yyV2);
# line 555 "SemExp.puma"
if (yyV2 != 0)
error_protocol ("Dim Parameter in CSHIFT is not a scalar");
# line 558 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Next->BTP_LIST.Elem, & yyV3);
# line 559 "SemExp.puma"
if (yyV3 != 0)
error_protocol ("Shift Parameter in CSHIFT is not a scalar");
}
* ResultRank = yyV1;
return;
}
}
}
}
}
# line 564 "SemExp.puma"
{
# line 565 "SemExp.puma"
error_protocol ("CSHIFT has not three Parameters");
}
* ResultRank = 0;
return;
;
}
static void CheckTranspose
# if defined __STDC__ | defined __cplusplus
(register tTree params, register int * ResultRank)
# else
(params, ResultRank)
register tTree params;
register int * ResultRank;
# endif
{
if (params == NoTree) return;
if (params->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->Kind == kBTP_EMPTY) {
# line 576 "SemExp.puma"
{
int yyV1;
{
# line 578 "SemExp.puma"
SemExp (params->BTP_LIST.Elem, & yyV1);
# line 579 "SemExp.puma"
if (yyV1 != 2)
error_protocol ("Array in transpose must be two-dimensional");
}
* ResultRank = yyV1;
return;
}
}
}
# line 584 "SemExp.puma"
{
# line 585 "SemExp.puma"
error_protocol ("TRANSPOSE has not one Parameter");
}
* ResultRank = 0;
return;
;
}
static void CheckSpread
# if defined __STDC__ | defined __cplusplus
(register tTree params, register int * ResultRank)
# else
(params, ResultRank)
register tTree params;
register int * ResultRank;
# endif
{
if (params == NoTree) return;
if (params->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->BTP_LIST.Next->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->BTP_LIST.Next->BTP_LIST.Next->Kind == kBTP_EMPTY) {
# line 596 "SemExp.puma"
{
int yyV1;
int yyV2;
int yyV3;
{
# line 598 "SemExp.puma"
SemExp (params->BTP_LIST.Elem, & yyV1);
# line 599 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Elem, & yyV2);
# line 600 "SemExp.puma"
if (yyV2 != 0)
error_protocol ("Dim Parameter in CSHIFT is not a scalar");
# line 603 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Next->BTP_LIST.Elem, & yyV3);
# line 604 "SemExp.puma"
if (yyV3 != 0)
error_protocol ("Shift Parameter in CSHIFT is not a scalar");
}
* ResultRank = yyV1 + 1;
return;
}
}
}
}
}
# line 609 "SemExp.puma"
{
# line 610 "SemExp.puma"
error_protocol ("SPREAD has not three Parameters");
}
* ResultRank = 0;
return;
;
}
static void CheckRed
# if defined __STDC__ | defined __cplusplus
(register tTree params, register int * ResultRank)
# else
(params, ResultRank)
register tTree params;
register int * ResultRank;
# endif
{
if (params == NoTree) return;
if (params->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->Kind == kBTP_EMPTY) {
# line 624 "SemExp.puma"
{
int yyV1;
{
# line 625 "SemExp.puma"
SemExp (params->BTP_LIST.Elem, & yyV1);
# line 626 "SemExp.puma"
if (yyV1 <= 0)
error_protocol ("reduction: first parameter must be an array");
}
* ResultRank = 0;
return;
}
}
if (params->BTP_LIST.Next->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->BTP_LIST.Next->Kind == kBTP_EMPTY) {
# line 631 "SemExp.puma"
{
int yyV1;
int yyV2;
{
# line 632 "SemExp.puma"
SemExp (params->BTP_LIST.Elem, & yyV1);
# line 633 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Elem, & yyV2);
# line 634 "SemExp.puma"
if (yyV1 <= 0)
error_protocol ("reduction: first parameter must be an array");
# line 637 "SemExp.puma"
if (! (yyV2 == 0)) goto yyL2;
}
* ResultRank = yyV1 - 1;
return;
}
yyL2:;
# line 640 "SemExp.puma"
{
int yyV1;
int yyV2;
{
# line 641 "SemExp.puma"
SemExp (params->BTP_LIST.Elem, & yyV1);
# line 642 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Elem, & yyV2);
# line 643 "SemExp.puma"
if (yyV1 <= 0)
error_protocol ("reduction: first parameter must be an array");
if (yyV2 != yyV1)
error_protocol ("reduction: mask has not same rank as array");
}
* ResultRank = 0;
return;
}
}
if (params->BTP_LIST.Next->BTP_LIST.Next->Kind == kBTP_LIST) {
if (params->BTP_LIST.Next->BTP_LIST.Next->BTP_LIST.Next->Kind == kBTP_EMPTY) {
# line 650 "SemExp.puma"
{
int yyV1;
int yyV2;
int yyV3;
{
# line 651 "SemExp.puma"
SemExp (params->BTP_LIST.Elem, & yyV1);
# line 652 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Elem, & yyV2);
# line 653 "SemExp.puma"
SemExp (params->BTP_LIST.Next->BTP_LIST.Next->BTP_LIST.Elem, & yyV3);
# line 654 "SemExp.puma"
if (yyV1 <= 0)
error_protocol ("reduction: first parameter must be an array");
if (yyV2 != 0)
error_protocol ("reduction: dim is not a scalar");
if (yyV3 != yyV1)
error_protocol ("reduction: mask has not same rank as array");
}
* ResultRank = yyV1 - 1;
return;
}
}
}
}
}
# line 663 "SemExp.puma"
{
# line 664 "SemExp.puma"
error_protocol ("reduction: has not one - three Parameters");
}
* ResultRank = 0;
return;
;
}
static bool IsCurrentLoopVar
# if defined __STDC__ | defined __cplusplus
(register tTree t)
# else
(t)
register tTree t;
# endif
{
if (t == NoTree) return false;
if (t->Kind == kUSED_VAR) {
# line 676 "SemExp.puma"
{
bool found;
int i;
tTree lv;
{
# line 678 "SemExp.puma"
# line 679 "SemExp.puma"
# line 680 "SemExp.puma"
# line 682 "SemExp.puma"
found = false;
i = 0;
while ((!found) && (i < Nesting))
{ if (Nest[i]->Kind == kACF_DOALL)
lv = Nest[i]->ACF_DOALL.DOALL_ID;
else if (Nest[i]->Kind == kACF_FORALL)
lv = Nest[i]->ACF_FORALL.FORALL_ID;
else if (Nest[i]->Kind == kACF_DOLOCAL)
lv = Nest[i]->ACF_DOLOCAL.DOLOCAL_ID;
else
lv = Nest[i]->ACF_DO.DO_ID;
lv = lv->LOOP_VAR.LOOP_VARNAME;
found = EqualExpression (t->USED_VAR.VARNAME, lv);
i += 1;
}
# line 699 "SemExp.puma"
if (! (found)) goto yyL1;
}
return true;
}
yyL1:;
}
if (t->Kind == kLOOP_VAR) {
# line 702 "SemExp.puma"
return true;
}
return false;
}
static tTree CheckNamedParameters
# if defined __STDC__ | defined __cplusplus
(register tTree t)
# else
(t)
register tTree t;
# endif
{
# line 721 "SemExp.puma"
{
# line 722 "SemExp.puma"
DefineNamedParameters (t);
}
return GetUnnamedParameters (t);
}
static void DefineNamedParameters
# if defined __STDC__ | defined __cplusplus
(register tTree t)
# else
(t)
register tTree t;
# endif
{
if (t == NoTree) return;
if (t->Kind == kBTP_LIST) {
if (t->BTP_LIST.Elem->Kind == kNAMED_PARAM) {
# line 728 "SemExp.puma"
{
# line 729 "SemExp.puma"
DefineNamedParameters (t->BTP_LIST.Next);
}
return;
}
# line 732 "SemExp.puma"
{
# line 734 "SemExp.puma"
DefineNamedParameters (t->BTP_LIST.Next);
}
return;
}
if (t->Kind == kBTP_EMPTY) {
# line 737 "SemExp.puma"
return;
}
# line 740 "SemExp.puma"
{
# line 741 "SemExp.puma"
printf ("Illegal Call of DefineNamedParameters\n");
# line 742 "SemExp.puma"
WriteTree (stdout, t);
# line 743 "SemExp.puma"
kill_in_protocol ();
}
return;
;
}
static tTree GetUnnamedParameters
# if defined __STDC__ | defined __cplusplus
(register tTree t)
# else
(t)
register tTree t;
# endif
{
if (t->Kind == kBTP_LIST) {
if (t->BTP_LIST.Elem->Kind == kNAMED_PARAM) {
# line 748 "SemExp.puma"
{
# line 749 "SemExp.puma"
t->BTP_LIST.Elem = t->BTP_LIST.Elem->NAMED_PARAM.VAL;
t->BTP_LIST.Next = GetUnnamedParameters (t->BTP_LIST.Next);
}
return t;
}
# line 755 "SemExp.puma"
{
# line 757 "SemExp.puma"
t->BTP_LIST.Next = GetUnnamedParameters (t->BTP_LIST.Next);
}
return t;
}
if (t->Kind == kBTP_EMPTY) {
# line 761 "SemExp.puma"
return t;
}
yyAbort ("GetUnnamedParameters");
}
void BeginSemExp ()
{
}
void CloseSemExp ()
{
}