Subject: Re: your mail

From: Cheng Xu <[email-masked]>
Date: Mon, 20 Nov 1995 21:59:25 +0800 (EAT)

Hi, Prof. Li,

Message received, I have forwarded it to Prof. Ding. 

> HIT is going to go ahead with an experiemental syntax tree construction
> effort, based on their initial understanding of Sage and the 
> preliminary version you provided at the beginning of Oct. 

We will send you and HIT 4 modified header files(bif.h,ll.h,symb.h and 
tag) attached with this mail. For we have to use Sage++ to build the
executable file, we have not deleted some useless data structures (specified
by comments, e.g. for PCF or FORTRAN M etc.) from above files. If you
have some suggestions about the definition of AST & ST, please tell us.
And, 2 of us will continue our efforts on improving our definitions and
studying how to build the AST & ST, we will inform you as early as possible
if any modification about our definition has been done.

> By the way, after struggled with Sage for a few months, do you
> have any opinion/comment about it ?

General speaking, we think Sage++ is great. But the whole system can 
never be said clear in programming and easy to understand. For example, 
in sage++'s parser part, they did too many modifications to original 
grammar rules, so some programs with bugs can pass the parser, and 
Sage++'s semantic checker is not able to find the bugs; in addition, too 
many global variables are used in yacc's actions and low level functions, 
so it is difficult to read and improve the program.  Thirds, in general, 
some actions to build the AST are out of order, e.g. set_blobs, which is  
used to link instructions of program, should be performed at high level, but 
to some instructions, it is performed just after the bif_node has been
built and has not be induced to upper level. At last,  there are some 
bugs to process the TYPE in sage, e.g. the parser can't accept the type 
with parameters. 

According to our purpose and the ability of Sage, we think it is worth to 
build the compiler based on Sage, but we should improve its function in
FORTRAN but cut other languages' processing parts off sage to make our
program clear and easy to use and modify.

> I wonder if there is any one in your group who now is considering 
> the "semantics routines". Can we somehow reach a consensus on

Now, four of us are thinking about the "semantics routines". At first,
we are analyzing the FORTRAN 90 and HPF extensions to make clear the 
binding and requirements within FORTRAN sentence and between them one 
by one; then, we will discuss which of them should be include in our 
semantic routines and how to implement the routines(may be it's better to 
finish some of them in Yacc's action parts). We will tell you our results 
in next week. How do you think about above plan?

Regards

Cheng Xu
/* don't modify this file directly, it is made by a clever 'sed'
script using "tag".  Run make tag.h to regenerate this file */
/*********************************************************************/
/*                  pC++/Sage++  Copyright (C) 1993                  */
/*  Indiana University  University of Oregon  University of Rennes   */
/*********************************************************************/
 
/******************* variant tags for bif nodes **********************/

  tag [ GLOBAL ] = "GLOBAL";
  tag [ PROG_HEDR ] = "PROG_HEDR";
  tag [ PROC_HEDR ] = "PROC_HEDR";
  tag [ BASIC_BLOCK ] = "BASIC_BLOCK";
  tag [ CONTROL_END ] = "CONTROL_END";
  tag [ IF_NODE ] = "IF_NODE";
  tag [ LOOP_NODE ] = "LOOP_NODE";
  tag [ FOR_NODE ] = "FOR_NODE";
  tag [ FORALL_NODE ] = "FORALL_NODE";
  tag [ WHILE_NODE ] = "WHILE_NODE";
  tag [ EXIT_NODE ] = "EXIT_NODE";
  tag [ ASSIGN_STAT ] = "ASSIGN_STAT";
  tag [ M_ASSIGN_STAT ] = "M_ASSIGN_STAT";
  tag [ PROC_STAT ] = "PROC_STAT";
  tag [ SUM_ACC ] = "SUM_ACC";
  tag [ MULT_ACC ] = "MULT_ACC";
  tag [ MAX_ACC ] = "MAX_ACC";
  tag [ MIN_ACC ] = "MIN_ACC";
  tag [ CAT_ACC ] = "CAT_ACC";
  tag [ OR_ACC ] = "OR_ACC";
  tag [ AND_ACC ] = "AND_ACC";
  tag [ READ_STAT ] = "READ_STAT";
  tag [ WRITE_STAT ] = "WRITE_STAT";
  tag [ OTHERIO_STAT ] = "OTHERIO_STAT";
  tag [ CDOALL_NODE ] = "CDOALL_NODE";
  tag [ SDOALL_NODE ] = "SDOALL_NODE";
  tag [ DOACROSS_NODE ] = "DOACROSS_NODE";
  tag [ CDOACROSS_NODE ] = "CDOACROSS_NODE";
  tag [ FUNC_HEDR ] = "FUNC_HEDR";
  tag [ WHERE_NODE ] = "WHERE_NODE";
  tag [ ALLDO_NODE ] = "ALLDO_NODE";
  tag [ IDENTIFY ] = "IDENTIFY";
  tag [ FORMAT_STAT ] = "FORMAT_STAT";
  tag [ STOP_STAT ] = "STOP_STAT";
  tag [ RETURN_STAT ] = "RETURN_STAT";
  tag [ ELSEIF_NODE ] = "ELSEIF_NODE";
  tag [ ARITHIF_NODE ] = "ARITHIF_NODE";
  tag [ GOTO_NODE ] = "GOTO_NODE";
  tag [ ASSGOTO_NODE ] = "ASSGOTO_NODE";
  tag [ COMGOTO_NODE ] = "COMGOTO_NODE";
  tag [ PAUSE_NODE ] = "PAUSE_NODE";
  tag [ STOP_NODE ] = "STOP_NODE";
  tag [ LOGIF_NODE ] = "LOGIF_NODE";
  tag [ ASSLAB_STAT ] = "ASSLAB_STAT";
  tag [ BLOB ] = "BLOB";
  tag [ SIZES ] = "SIZES";
  tag [ COMMENT_STAT ] = "COMMENT_STAT";
  tag [ CONT_STAT ] = "CONT_STAT";
  tag [ VAR_DECL ] = "VAR_DECL";
  tag [ PARAM_DECL ] = "PARAM_DECL";
  tag [ COMM_STAT ] = "COMM_STAT";
  tag [ EQUI_STAT ] = "EQUI_STAT";
  tag [ IMPL_DECL ] = "IMPL_DECL";
  tag [ DATA_DECL ] = "DATA_DECL";
  tag [ SAVE_DECL ] = "SAVE_DECL";
  tag [ ENTRY_STAT ] = "ENTRY_STAT";
  tag [ STMTFN_STAT ] = "STMTFN_STAT";
  tag [ DIM_STAT ] = "DIM_STAT";
  tag [ BLOCK_DATA ] = "BLOCK_DATA";
  tag [ EXTERN_STAT ] = "EXTERN_STAT";
  tag [ INTRIN_STAT ] = "INTRIN_STAT";
  tag [ ENUM_DECL ] = "ENUM_DECL";
  tag [ CLASS_DECL ] = "CLASS_DECL";
  tag [ UNION_DECL ] = "UNION_DECL";
  tag [ STRUCT_DECL ] = "STRUCT_DECL";
  tag [ DERIVED_CLASS_DECL ] = "DERIVED_CLASS_DECL";
  tag [ EXPR_STMT_NODE ] = "EXPR_STMT_NODE";
  tag [ DO_WHILE_NODE ] = "DO_WHILE_NODE";
  tag [ SWITCH_NODE ] = "SWITCH_NODE";
  tag [ CASE_NODE ] = "CASE_NODE";
  tag [ DEFAULT_NODE ] = "DEFAULT_NODE";
  tag [ BREAK_NODE ] = "BREAK_NODE";
  tag [ CONTINUE_NODE ] = "CONTINUE_NODE";
  tag [ RETURN_NODE ] = "RETURN_NODE";
  tag [ ASM_NODE ] = "ASM_NODE";
  tag [ SPAWN_NODE ] = "SPAWN_NODE";
  tag [ PARFOR_NODE ] = "PARFOR_NODE";
  tag [ PAR_NODE ] = "PAR_NODE";
  tag [ LABEL_STAT ] = "LABEL_STAT";
  tag [ PROS_COMM ] = "PROS_COMM";
  tag [ ATTR_DECL ] = "ATTR_DECL";
  tag [ NAMELIST_STAT ] = "NAMELIST_STAT";
  tag [ FUTURE_STMT ] = "FUTURE_STMT";
  tag [ COLLECTION_DECL ] = "COLLECTION_DECL";
  tag [ TEMPLATE_DECL ] = "TEMPLATE_DECL";
  tag [ TEMPLATE_FUNDECL ] = "TEMPLATE_FUNDECL";
  tag [ TECLASS_DECL ] = "TECLASS_DECL";
  tag [ PRINT_STAT ] = "PRINT_STAT";
  tag [ BACKSPACE_STAT ] = "BACKSPACE_STAT";
  tag [ REWIND_STAT ] = "REWIND_STAT";
  tag [ ENDFILE_STAT ] = "ENDFILE_STAT";
  tag [ INQUIRE_STAT ] = "INQUIRE_STAT";
  tag [ OPEN_STAT ] = "OPEN_STAT";
  tag [ CLOSE_STAT ] = "CLOSE_STAT";
  tag [ EXTERN_C_STAT ] = "EXTERN_C_STAT";
  tag [ INCLUDE_STAT ] = "INCLUDE_STAT";
  tag [ TRY_STAT ] = "TRY_STAT";
  tag [ CATCH_STAT ] = "CATCH_STAT";
  tag [ PARDO_NODE ] = "PARDO_NODE";
  tag [ PARSECTIONS_NODE ] = "PARSECTIONS_NODE";
  tag [ SECTION_NODE ] = "SECTION_NODE";
  tag [ GUARDS_NODE ] = "GUARDS_NODE";
  tag [ LOCK_NODE ] = "LOCK_NODE";
  tag [ UNLOCK_NODE ] = "UNLOCK_NODE";
  tag [ CRITSECTION_NODE ] = "CRITSECTION_NODE";
  tag [ POST_NODE ] = "POST_NODE";
  tag [ WAIT_NODE ] = "WAIT_NODE";
  tag [ CLEAR_NODE ] = "CLEAR_NODE";
  tag [ POSTSEQ_NODE ] = "POSTSEQ_NODE";
  tag [ WAITSEQ_NODE ] = "WAITSEQ_NODE";
  tag [ SETSEQ_NODE ] = "SETSEQ_NODE";
  tag [ ASSIGN_NODE ] = "ASSIGN_NODE";
  tag [ RELEASE_NODE ] = "RELEASE_NODE";
  tag [ PRIVATE_NODE ] = "PRIVATE_NODE";
  tag [ SCOMMON_NODE ] = "SCOMMON_NODE";
  tag [ PARREGION_NODE ] = "PARREGION_NODE";
  tag [ PDO_NODE ] = "PDO_NODE";
  tag [ PSECTIONS_NODE ] = "PSECTIONS_NODE";
  tag [ SINGLEPROCESS_NODE ] = "SINGLEPROCESS_NODE";
  tag [ SKIPPASTEOF_NODE ] = "SKIPPASTEOF_NODE";
  tag [ INTENT_STMT ] = "INTENT_STMT";
  tag [ OPTIONAL_STMT ] = "OPTIONAL_STMT";
  tag [ PUBLIC_STMT ] = "PUBLIC_STMT";
  tag [ PRIVATE_STMT ] = "PRIVATE_STMT";
  tag [ ALLOCATABLE_STMT ] = "ALLOCATABLE_STMT";
  tag [ POINTER_STMT ] = "POINTER_STMT";
  tag [ TARGET_STMT ] = "TARGET_STMT";
  tag [ ALLOCATE_STMT ] = "ALLOCATE_STMT";
  tag [ NULLIFY_STMT ] = "NULLIFY_STMT";
  tag [ DEALLOCATE_STMT ] = "DEALLOCATE_STMT";
  tag [ SEQUENCE_STMT ] = "SEQUENCE_STMT";
  tag [ CYCLE_STMT ] = "CYCLE_STMT";
  tag [ EXIT_STMT ] = "EXIT_STMT";
  tag [ CONTAINS_STMT ] = "CONTAINS_STMT";
  tag [ WHERE_BLOCK_STMT ] = "WHERE_BLOCK_STMT";
  tag [ MODULE_STMT ] = "MODULE_STMT";
  tag [ USE_STMT ] = "USE_STMT";
  tag [ INTERFACE_STMT ] = "INTERFACE_STMT";
  tag [ MODULE_PROC_STMT ] = "MODULE_PROC_STMT";
  tag [ OVERLOADED_ASSIGN_STAT ] = "OVERLOADED_ASSIGN_STAT";
  tag [ POINTER_ASSIGN_STAT ] = "POINTER_ASSIGN_STAT";
  tag [ OVERLOADED_PROC_STAT ] = "OVERLOADED_PROC_STAT";
  tag [ DECOMPOSITION_STMT ] = "DECOMPOSITION_STMT";
  tag [ ALIGN_STMT ] = "ALIGN_STMT";
  tag [ DISTRIBUTE_STMT ] = "DISTRIBUTE_STMT";
  tag [ REDUCE_STMT ] = "REDUCE_STMT";
  tag [ PROS_HEDR ] = "PROS_HEDR";
  tag [ PROS_STAT ] = "PROS_STAT";
  tag [ PROS_STAT_LCTN ] = "PROS_STAT_LCTN";
  tag [ PROS_STAT_SUBM ] = "PROS_STAT_SUBM";
  tag [ PROCESSES_STAT ] = "PROCESSES_STAT";
  tag [ PROCESSES_END ] = "PROCESSES_END";
  tag [ PROCESS_DO_STAT ] = "PROCESS_DO_STAT";
  tag [ PROCESSORS_STAT ] = "PROCESSORS_STAT";
  tag [ CHANNEL_STAT ] = "CHANNEL_STAT";
  tag [ MERGER_STAT ] = "MERGER_STAT";
  tag [ MOVE_PORT ] = "MOVE_PORT";
  tag [ SEND_STAT ] = "SEND_STAT";
  tag [ RECEIVE_STAT ] = "RECEIVE_STAT";
  tag [ ENDCHANNEL_STAT ] = "ENDCHANNEL_STAT";
  tag [ PROBE_STAT ] = "PROBE_STAT";
  tag [ INPORT_DECL ] = "INPORT_DECL";
  tag [ OUTPORT_DECL ] = "OUTPORT_DECL";

/***************** variant tags for low level nodes ********************/

  tag [ INT_VAL ] = "INT_VAL";
  tag [ FLOAT_VAL ] = "FLOAT_VAL";
  tag [ DOUBLE_VAL ] = "DOUBLE_VAL";
  tag [ BOOL_VAL ] = "BOOL_VAL";
  tag [ CHAR_VAL ] = "CHAR_VAL";
  tag [ STRING_VAL ] = "STRING_VAL";
  tag [ CONST_REF ] = "CONST_REF";
  tag [ VAR_REF ] = "VAR_REF";
  tag [ ARRAY_REF ] = "ARRAY_REF";
  tag [ RECORD_REF ] = "RECORD_REF";
  tag [ ENUM_REF ] = "ENUM_REF";
  tag [ VAR_LIST ] = "VAR_LIST";
  tag [ EXPR_LIST ] = "EXPR_LIST";
  tag [ RANGE_LIST ] = "RANGE_LIST";
  tag [ CASE_CHOICE ] = "CASE_CHOICE";
  tag [ DEF_CHOICE ] = "DEF_CHOICE";
  tag [ VARIANT_CHOICE ] = "VARIANT_CHOICE";
  tag [ COMPLEX_VAL ] = "COMPLEX_VAL";
  tag [ LABEL_REF ] = "LABEL_REF";
  tag [ KEYWORD_VAL ] = "KEYWORD_VAL";
  tag [ DDOT ] = "DDOT";
  tag [ RANGE_OP ] = "RANGE_OP";
  tag [ UPPER_OP ] = "UPPER_OP";
  tag [ LOWER_OP ] = "LOWER_OP";
  tag [ EQ_OP ] = "EQ_OP";
  tag [ LT_OP ] = "LT_OP";
  tag [ GT_OP ] = "GT_OP";
  tag [ NOTEQL_OP ] = "NOTEQL_OP";
  tag [ LTEQL_OP ] = "LTEQL_OP";
  tag [ GTEQL_OP ] = "GTEQL_OP";
  tag [ ADD_OP ] = "ADD_OP";
  tag [ SUBT_OP ] = "SUBT_OP";
  tag [ OR_OP ] = "OR_OP";
  tag [ MULT_OP ] = "MULT_OP";
  tag [ DIV_OP ] = "DIV_OP";
  tag [ MOD_OP ] = "MOD_OP";
  tag [ AND_OP ] = "AND_OP";
  tag [ EXP_OP ] = "EXP_OP";
  tag [ ARRAY_MULT ] = "ARRAY_MULT";
  tag [ CONCAT_OP ] = "CONCAT_OP";
  tag [ XOR_OP ] = "XOR_OP";
  tag [ EQV_OP ] = "EQV_OP";
  tag [ NEQV_OP ] = "NEQV_OP";
  tag [ MINUS_OP ] = "MINUS_OP";
  tag [ NOT_OP ] = "NOT_OP";
  tag [ ASSGN_OP ] = "ASSGN_OP";
  tag [ DEREF_OP ] = "DEREF_OP";
  tag [ POINTST_OP ] = "POINTST_OP";
  tag [ FUNCTION_OP ] = "FUNCTION_OP";
  tag [ MINUSMINUS_OP ] = "MINUSMINUS_OP";
  tag [ PLUSPLUS_OP ] = "PLUSPLUS_OP";
  tag [ BITAND_OP ] = "BITAND_OP";
  tag [ BITOR_OP ] = "BITOR_OP";
  tag [ STAR_RANGE ] = "STAR_RANGE";
  tag [ INDEX_OP ] = "INDEX_OP";
  tag [ PROC_CALL ] = "PROC_CALL";
  tag [ FUNC_CALL ] = "FUNC_CALL";
  tag [ CONSTRUCTOR_REF ] = "CONSTRUCTOR_REF";
  tag [ ACCESS_REF ] = "ACCESS_REF";
  tag [ CONS ] = "CONS";
  tag [ ACCESS ] = "ACCESS";
  tag [ IOACCESS ] = "IOACCESS";
  tag [ CONTROL_LIST ] = "CONTROL_LIST";
  tag [ SEQ ] = "SEQ";
  tag [ SPEC_PAIR ] = "SPEC_PAIR";
  tag [ COMM_LIST ] = "COMM_LIST";
  tag [ STMT_STR ] = "STMT_STR";
  tag [ EQUI_LIST ] = "EQUI_LIST";
  tag [ IMPL_TYPE ] = "IMPL_TYPE";
  tag [ STMTFN_DECL ] = "STMTFN_DECL";
  tag [ BIT_COMPLEMENT_OP ] = "BIT_COMPLEMENT_OP";
  tag [ EXPR_IF ] = "EXPR_IF";
  tag [ EXPR_IF_BODY ] = "EXPR_IF_BODY";
  tag [ FUNCTION_REF ] = "FUNCTION_REF";
  tag [ LSHIFT_OP ] = "LSHIFT_OP";
  tag [ RSHIFT_OP ] = "RSHIFT_OP";
  tag [ UNARY_ADD_OP ] = "UNARY_ADD_OP";
  tag [ SIZE_OP ] = "SIZE_OP";
  tag [ INTEGER_DIV_OP ] = "INTEGER_DIV_OP";
  tag [ SUB_OP ] = "SUB_OP";
  tag [ LE_OP ] = "LE_OP";
  tag [ GE_OP ] = "GE_OP";
  tag [ NE_OP ] = "NE_OP";
  tag [ CLASSINIT_OP ] = "CLASSINIT_OP";
  tag [ CAST_OP ] = "CAST_OP";
  tag [ ADDRESS_OP ] = "ADDRESS_OP";
  tag [ POINSTAT_OP ] = "POINSTAT_OP";
  tag [ COPY_NODE ] = "COPY_NODE";
  tag [ INIT_LIST ] = "INIT_LIST";
  tag [ VECTOR_CONST ] = "VECTOR_CONST";
  tag [ BIT_NUMBER ] = "BIT_NUMBER";
  tag [ ARITH_ASSGN_OP ] = "ARITH_ASSGN_OP";
  tag [ ARRAY_OP ] = "ARRAY_OP";
  tag [ NEW_OP ] = "NEW_OP";
  tag [ DELETE_OP ] = "DELETE_OP";
  tag [ NAMELIST_LIST ] = "NAMELIST_LIST";
  tag [ THIS_NODE ] = "THIS_NODE";
  tag [ SCOPE_OP ] = "SCOPE_OP";
  tag [ PLUS_ASSGN_OP ] = "PLUS_ASSGN_OP";
  tag [ MINUS_ASSGN_OP ] = "MINUS_ASSGN_OP";
  tag [ AND_ASSGN_OP ] = "AND_ASSGN_OP";
  tag [ IOR_ASSGN_OP ] = "IOR_ASSGN_OP";
  tag [ MULT_ASSGN_OP ] = "MULT_ASSGN_OP";
  tag [ DIV_ASSGN_OP ] = "DIV_ASSGN_OP";
  tag [ MOD_ASSGN_OP ] = "MOD_ASSGN_OP";
  tag [ XOR_ASSGN_OP ] = "XOR_ASSGN_OP";
  tag [ LSHIFT_ASSGN_OP ] = "LSHIFT_ASSGN_OP";
  tag [ RSHIFT_ASSGN_OP ] = "RSHIFT_ASSGN_OP";
  tag [ ORDERED_OP ] = "ORDERED_OP";
  tag [ EXTEND_OP ] = "EXTEND_OP";
  tag [ MAXPARALLEL_OP ] = "MAXPARALLEL_OP";
  tag [ SAMETYPE_OP ] = "SAMETYPE_OP";
  tag [ TYPE_REF ] = "TYPE_REF";
  tag [ STRUCTURE_CONSTRUCTOR ] = "STRUCTURE_CONSTRUCTOR";
  tag [ ARRAY_CONSTRUCTOR ] = "ARRAY_CONSTRUCTOR";
  tag [ SECTION_REF ] = "SECTION_REF";
  tag [ VECTOR_SUBSCRIPT ] = "VECTOR_SUBSCRIPT";
  tag [ SECTION_OPERANDS ] = "SECTION_OPERANDS";
  tag [ KEYWORD_ARG ] = "KEYWORD_ARG";
  tag [ OVERLOADED_CALL ] = "OVERLOADED_CALL";
  tag [ INTERFACE_REF ] = "INTERFACE_REF";
  tag [ RENAME_NODE ] = "RENAME_NODE";
  tag [ TYPE_NODE ] = "TYPE_NODE";
  tag [ PAREN_OP ] = "PAREN_OP";
  tag [ PARAMETER_OP ] = "PARAMETER_OP";
  tag [ PUBLIC_OP ] = "PUBLIC_OP";
  tag [ PRIVATE_OP ] = "PRIVATE_OP";
  tag [ ALLOCATABLE_OP ] = "ALLOCATABLE_OP";
  tag [ DIMENSION_OP ] = "DIMENSION_OP";
  tag [ EXTERNAL_OP ] = "EXTERNAL_OP";
  tag [ IN_OP ] = "IN_OP";
  tag [ OUT_OP ] = "OUT_OP";
  tag [ INOUT_OP ] = "INOUT_OP";
  tag [ INTRINSIC_OP ] = "INTRINSIC_OP";
  tag [ POINTER_OP ] = "POINTER_OP";
  tag [ OPTIONAL_OP ] = "OPTIONAL_OP";
  tag [ SAVE_OP ] = "SAVE_OP";
  tag [ TARGET_OP ] = "TARGET_OP";
  tag [ ONLY_NODE ] = "ONLY_NODE";
  tag [ LEN_OP ] = "LEN_OP";
  tag [ TYPE_OP ] = "TYPE_OP";
  tag [ DOTSTAR_OP ] = "DOTSTAR_OP";
  tag [ ARROWSTAR_OP ] = "ARROWSTAR_OP";
  tag [ FORDECL_OP ] = "FORDECL_OP";
  tag [ THROW_OP ] = "THROW_OP";
  tag [ PROCESSORS_REF ] = "PROCESSORS_REF";
  tag [ PORT_TYPE_OP ] = "PORT_TYPE_OP";
  tag [ INPORT_TYPE_OP ] = "INPORT_TYPE_OP";
  tag [ OUTPORT_TYPE_OP ] = "OUTPORT_TYPE_OP";
  tag [ INPORT_NAME ] = "INPORT_NAME";
  tag [ OUTPORT_NAME ] = "OUTPORT_NAME";
  tag [ FROMPORT_NAME ] = "FROMPORT_NAME";
  tag [ TOPORT_NAME ] = "TOPORT_NAME";
  tag [ IOSTAT_STORE ] = "IOSTAT_STORE";
  tag [ EMPTY_STORE ] = "EMPTY_STORE";
  tag [ ERR_LABEL ] = "ERR_LABEL";
  tag [ END_LABEL ] = "END_LABEL";
  tag [ PROS_CALL ] = "PROS_CALL";
  tag [ DATA_IMPL_DO ] = "DATA_IMPL_DO";
  tag [ DATA_ELT ] = "DATA_ELT";
  tag [ DATA_SUBS ] = "DATA_SUBS";
  tag [ DATA_RANGE ] = "DATA_RANGE";
  tag [ ICON_EXPR ] = "ICON_EXPR";

/***************** variant tags for symbol table entries ********************/

  tag [ CONST_NAME ] = "CONST_NAME";
  tag [ ENUM_NAME ] = "ENUM_NAME";
  tag [ FIELD_NAME ] = "FIELD_NAME";
  tag [ VARIABLE_NAME ] = "VARIABLE_NAME";
  tag [ TYPE_NAME ] = "TYPE_NAME";
  tag [ PROGRAM_NAME ] = "PROGRAM_NAME";
  tag [ PROCEDURE_NAME ] = "PROCEDURE_NAME";
  tag [ VAR_FIELD ] = "VAR_FIELD";
  tag [ LABEL_VAR ] = "LABEL_VAR";
  tag [ FUNCTION_NAME ] = "FUNCTION_NAME";
  tag [ MEMBER_FUNC ] = "MEMBER_FUNC";
  tag [ CLASS_NAME ] = "CLASS_NAME";
  tag [ UNION_NAME ] = "UNION_NAME";
  tag [ STRUCT_NAME ] = "STRUCT_NAME";
  tag [ LABEL_NAME ] = "LABEL_NAME";
  tag [ COLLECTION_NAME ] = "COLLECTION_NAME";
  tag [ ROUTINE_NAME ] = "ROUTINE_NAME";
  tag [ CONSTRUCT_NAME ] = "CONSTRUCT_NAME";
  tag [ INTERFACE_NAME ] = "INTERFACE_NAME";
  tag [ MODULE_NAME ] = "MODULE_NAME";
  tag [ TEMPLATE_CL_NAME ] = "TEMPLATE_CL_NAME";
  tag [ TEMPLATE_FN_NAME ] = "TEMPLATE_FN_NAME";
  tag [ TECLASS_NAME ] = "TECLASS_NAME";

  tag [ DEFAULT ] = "DEFAULT";
  tag [ T_INT ] = "T_INT";
  tag [ T_FLOAT ] = "T_FLOAT";
  tag [ T_DOUBLE ] = "T_DOUBLE";
  tag [ T_CHAR ] = "T_CHAR";
  tag [ T_BOOL ] = "T_BOOL";
  tag [ T_STRING ] = "T_STRING";
  tag [ T_ENUM ] = "T_ENUM";
  tag [ T_SUBRANGE ] = "T_SUBRANGE";
  tag [ T_LIST ] = "T_LIST";
  tag [ T_ARRAY ] = "T_ARRAY";
  tag [ T_RECORD ] = "T_RECORD";
  tag [ T_ENUM_FIELD ] = "T_ENUM_FIELD";
  tag [ T_UNKNOWN ] = "T_UNKNOWN";
  tag [ T_COMPLEX ] = "T_COMPLEX";
  tag [ T_VOID ] = "T_VOID";
  tag [ T_DESCRIPT ] = "T_DESCRIPT";
  tag [ T_FUNCTION ] = "T_FUNCTION";
  tag [ T_POINTER ] = "T_POINTER";
  tag [ T_UNION ] = "T_UNION";
  tag [ T_STRUCT ] = "T_STRUCT";
  tag [ T_CLASS ] = "T_CLASS";
  tag [ T_DERIVED_CLASS ] = "T_DERIVED_CLASS";
  tag [ T_DERIVED_TYPE ] = "T_DERIVED_TYPE";
  tag [ T_COLLECTION ] = "T_COLLECTION";
  tag [ T_DERIVED_COLLECTION ] = "T_DERIVED_COLLECTION";
  tag [ T_REFERENCE ] = "T_REFERENCE";
  tag [ T_DERIVED_TEMPLATE ] = "T_DERIVED_TEMPLATE";
  tag [ T_MEMBER_POINTER ] = "T_MEMBER_POINTER";
  tag [ T_TECLASS ] = "T_TECLASS";
  tag [ T_GATE ] = "T_GATE";
  tag [ T_EVENT ] = "T_EVENT";
  tag [ T_SEQUENCE ] = "T_SEQUENCE";
  tag [ T_DCOMPLEX ] = "T_DCOMPLEX";
  tag [ LOCAL ] = "LOCAL";
  tag [ INPUT ] = "INPUT";
  tag [ OUTPUT ] = "OUTPUT";
  tag [ IO ] = "IO";
  tag [ PROCESS_NAME ] = "PROCESS_NAME";

/************************************************************************
 *                                                                      *
 *                    hash and symbol table entries                     *
 *           ( Notes: Please set tabstop=4 when use vi to edit)         *
 *                                                                      *
 ************************************************************************/

struct hash_entry {
	char                *ident;	    
						/* Pointer to character string of  the symbol */
	struct hash_entry *next_entry;    
						/* Pointer to the next hast-entry with the same hash    
						value */
	PTR_SYMB            id_attr;        
						/* Point the hash entry to the symbol table entry */
};

struct symb {
		int         variant;        /* variant tag of the symbol */
		int         id;             /* unique identification tag */
		char        *ident;         /* charater string of  the symbol */
		struct hash_entry *parent;        
					/* point the symbol table entry to the hash_entry 
					see hast_entry */
		PTR_SYMB    outer;      
					/* pointer to symbol in enclosing block; The enclosing block    
					begin with the control parent of the declaration statement. */
		PTR_SYMB    next_symb;  /* pointer to next symbol in same block */
		PTR_SYMB    id_list;        /* be used to make lists of ids 
					For example, the parser may want to set up a type for variables
					and parameters; In the case, these varables and parameters are
					chained by this pointer*/
		PTR_SYMB    thread;     /* list of all allocated symbol pointers, which points the  
					Symbol Table entry allocated just after this symbol */
		PTR_TYPE    type;       /* data type of this identifier */
		PTR_BFND    scope;      /* level at which ident is declared, i.e. the control parent of the 
					declaration statement. In FORTRAN, this is the Program  
					Header or the Subroutine Header or the Function Header  
					where the symbol is defined behind them */ 
		PTR_BLOB    ud_chain;   /* use_definition chain, used for flow analysis */
		int         attr;       /* attributes of the variable. see Attribute Bit*/
		int         dovar;      /* set if used as loop's control variable */
		int         decl;       /* field that the parser use in keeping track
								of declarations If the variable has not been 
								declared, is SOFT else HARD */

		union symb_union_u {
		PTR_LLND  const_value;      /* for constants;  
									variant=CONSTANT_NAME*/

		struct {                    /* for enum-field and record field */
			int         tag;        /* used to distinguish the type of the field*/  
			int         offset;         
						/* the field offset of the enum or record structure */
			PTR_SYMB    next;       /* point to the next field */
			PTR_SYMB    base_name;  /* name of record or enumerated type */
		} field;

		struct {                /* for program */
						/* variant == PROGRAM_NAME */
			PTR_SYMB    symb_list;  
			PTR_LABEL   label_list; /* Label list occur in this subroutine */
			PTR_BFND    prog_hedr;  /* Program Header statement */
		} prog_decl;

		struct {                /* for PROC; 
						variant==PROCEDURE_NAME | ROUTINE_NAME */
			int     seen;       /* If the procedure has not been declared   
							   formally, set it to be "NO" , else  "YES" */ 
			int     num_input;  /* the number of input arguments */
			int     num_output; /* the number of output arguments */
			int     num_io;     /* the number of input and output
								arguments*/
			PTR_SYMB    in_list;        /* input arguments' symbol list */
			PTR_SYMB    out_list;       /* output arguments' symbol list */
			PTR_SYMB    symb_list;      /* arguments' symbol list */
                int        local_size;

			PTR_LABEL   label_list; /* Label list occur in this subroutine */
			PTR_BFND    proc_hedr;  /* Subroutine Header statement */
			PTR_LLND    call_list;      /* point to the last procedure-call's  llnd
							in this procedure. This procedure-call llnd's
							next-call( which should be the last-call indeed
							according to "match_parameters( )" in Sage++'s
							stat.c file) points to the last-call(the 2nd call
							from the end occurs in this procedure), and so 
							on,  to form the call_list. */
		} proc_decl;    /* for FORTRAN, procedure means subroutine and function,
				but here only subroutine*/

		struct {                /* for FUNC; variant=FUNCTION_NAME*/
			int     seen;       /* If the function has not been declared    
								formally, set it to be "NO" , else  "YES" */
			int     num_input;  /* the number of input arguments */
			int     num_output; /* the number of output arguments */
			int     num_io;     /* the number of input and output
								arguments*/
			PTR_SYMB    in_list;        /* input arguments' symbol list */
			PTR_SYMB    out_list;       /* output arguments' symbol list */
			PTR_SYMB    symb_list;  /* arguments' symbol list */
                int        local_size;

			PTR_LABEL   label_list; /* Label list occur in this subroutine */
			PTR_BFND    func_hedr;  /* Function Header statement */
			PTR_LLND    call_list;  
							/* point to the first procedure-call's  llnd
							in this function. The procedure-call llnd's
							next-call points to the next-call(the 2nd call  
							occurs in this procedure), and so on,  to 
							form the call_list. */
		} func_decl;

		struct {                    /* for variable declaration. 
							variant=VARIABLE_NAME */
			 int        local;          /* local or input or output or both param*/
			 PTR_SYMB   next_in;    /* for list of input parameters*/
			 PTR_SYMB   next_out;   /* for list of output parameters*/
			 int        offset;     
			 int        dovar;          /* set if being used as DO control var */
		} var_decl;

           	struct {
			int seen;
			int  num_input,num_ouput,num_io;
			PTR_SYMB	in_list;
			PTR_SYMB	out_list;
			PTR_SYMB	symb_list;
			int			local_size;
			PTR_LABEL	label_list;
			PTR_BFND	func_hedr;
			PTR_LLND	call_list;
				/* the following information for field */
			int	tag;
			int	offset;
			PTR_SYMB	decalred_name;
			PTR_SYMB	next;
		       PTR_SYMB		base_anme;
		} Template;

	struct {
		int	   seen ;
		int	   num_input,  num_output, num_io ;
		PTR_SYMB   in_list ;
		PTR_SYMB   out_list ;
		PTR_SYMB   symb_list;
		int	   local_size;
		PTR_LABEL  label_list ;
		PTR_BFND   func_hedr ;
		PTR_LLND   call_list ;
				      /* the following information for field */
		int	   tag ;
		int	   offset ;
		PTR_SYMB   declared_name; /* used for friend construct */
		PTR_SYMB   next ;
		PTR_SYMB   base_name ;
				      /* the following is newly added */

	} member_func	    ;	      /* New  one for VPC */

	} entry;
};

/************************************************************
*                                                           *
*            The Data Type of the Symbol                    *
*                                                           *
*************************************************************/
struct data_type {
		int         variant;  /* the type of the data, such as T_INT, T_ARRAY  and T_* etc. */
		int         id;     /* unique indentification tag */
		int         length;     /* length of the type */
		PTR_TYPE    thread;     /* list of all allocated type pointers */
		PTR_SYMB    name;       /* type name */
		PTR_BLOB    ud_chain;   /* use_definition chain */
	
	union type_union_u {
	/* no entry needed for T_INT, T_CHAR, T_FLOAT, T_DOUBLE,  T_BOOL */

		struct {        /* for T_ARRAY */
				PTR_TYPE    base_type;  /* New order   */
				int         num_dimensions;
				PTR_LLND    ranges;
		} ar_decl;

		struct {        /* for T_KIND, F90 extensions */
				PTR_TYPE    base_type;  /* New order   */
				PTR_LLND    kindexp;        /* Points to a llnd with variant= SgKindExp */
		} kind_decl;

		struct {
				PTR_TYPE    base_type ; /* Type specification */
				int     dummy1;
				PTR_LLND    ranges    ; /* lengspec */
				int     dummy2 ;
				int     dummy3;
				int     dummy4;
				int     dummy5;
		}  Template ;   /* for T_ARRAY,T_FUNCTION,T_POINTER */

		struct {        /* for T_RECORD or T_ENUM */
				int         num_fields;
				int         recordize;
				PTR_SYMB    first;
		} re_decl;

	} entry;
}; 

#define __SYMB_DEF__

/************************  ll.h ***********************/

struct EXPR_LIST_S {      /* for SgExprListExp  */
	PTR_SYMB    null;     /* not used */

	PTR_LLND    item;    /* a element expr in the expr_list */
	PTR_LLND    next;    /* next node in the expr_list */
};
					
struct KIND_VAL_S {	   
	   PTR_SYMB    null;
	   PTR_LLND    value;          /* to a SgValueExp */
	   PTR_LLND    kind;           /* to a SgKindExp */
};                 
             
struct COMPLEX_S {    /* for SgValueExp. variant==COMPLEX_VAL */
	   PTR_SYMB    null;
	   PTR_LLND    real_part;
	   PTR_LLND    imag_part;
};

struct STRUCTURE_CONSTRUCTOR_S {    /* for SgStructureConstExp */
	   PTR_SYMB    null;
	   PTR_LLND    type;            /* to a SgTypeExp */
	   PTR_LLND    values;          /* to a SgExprListExp */
};
					   
struct CONSTRUCTOR_REF_S { /* for SgConstExp */
	   PTR_SYMB    null_1;
	   PTR_LLND    values;          /* to a SgExprListExp */
	   PTR_LLND    null_2;
};

struct IMPLIED_DO_S { /* for SgImpliedDoExp */
	   PTR_SYMB    symbol;           /* to a SgVarSymbol of do_varible */

	   PTR_LLND    objects;        /* to a SgExprListExp */
	   PTR_LLND    range_stride;   /* to a SgExprListExp. Only the first 
										three are useful */
};

struct TYPE_OP_S { /* for SgTypeExp */
	   PTR_SYMB    null_1;
			
	   PTR_LLND    selector;   /* added by us:
									   to a SgKindSelectorExp or a
									   SgCharSlectorExp */ 
	   PTR_LLND    null_2;
};

struct KIND_OP_S{ /* for SgKindExp */
	   PTR_SYMB    null_1;
			
	   PTR_LLND    exp;            /* to a SgExpression */
	   PTR_LLND    null_2;
};

struct ARRAY_REF_S { /* for SgArrayRefExp */
			PTR_SYMB    symbol;     /* to a SgSymbol for part_name */

			PTR_LLND    subscripts; /* to a SgExprListExp of SgSubscriptexp 
										or SgVectorSubExp */
			PTR_LLND    null;
		};

struct LEN_OP_S { /* for SgStringLengthExp */
	   PTR_SYMB    null_1;
			
	   PTR_LLND    len;            /* to a SgExpression */
	   PTR_LLND    null_2;
};

struct ATTRIBUTE_EXP_S { /* for SgAttributeExp */
	   PTR_SYMB    null_1;

	   PTR_LLND    subscripts; /* used for DIMENSION_OP */
	   PTR_LLND    null_3;
};

struct DDOT_S { /* for SgSubscriptExp */
	   PTR_SYMB    null;
			
	   PTR_LLND    range;          /* to a SgRangeExp */
	   PTR_LLND    stride;          /* to a SgExpression */
};

struct RANGE_VAL_S { /* for SgRangeExp */
	   PTR_SYMB    null;

	   PTR_LLND    lower;     /* lower bound of range */ 
	   PTR_LLND    upper;     /* upper bound of range */
};

struct DATA_STMT_SET_S { /* for SgDataStmtSetExp */
	   PTR_SYMB    null;
			
	   PTR_LLND    objects;    /* to a SgExprListExp  */
	   PTR_LLND    values;     /* to a SgExprListExp of SgDataValueExp */
};

struct DATA_VALUE_S { /* for SgDataValueExp */
	   PTR_SYMB    null;
			
	   PTR_LLND    repeat;    /* for data_stmt_repeat */
	   PTR_LLND    value;     /* for data_stmt_constant */
};

struct IMPL_TYPE_S { /* for SgImplicitTypExp */
	   PTR_SYMB    null_1;

	   PTR_LLND    list;       /* to a SgExprListExp of RANGE_VAL */
	   PTR_LLND    type_spec;  /* to a SgTypeExp for type_spec */
};

struct OBJECT_LIST_S { /* for SgObjectListExp */
			PTR_SYMB    symbol;     /* to SgSymbol of namelist_group_name or 
										common_block_name */
			PTR_LLND    list;       /* to a SgExprListExp of objects */
			PTR_LLND    null;
		};

struct VAR_REF_S {  /* for SgVarRefExp */
		   PTR_SYMB  symbol;    /* to a SgVarSymbol */

		   PTR_LLND  null_1;
		   PTR_LLND  null_2;
		};
struct SUB_STRING_S { /* for SgSubString */
		PTR_SYMB    null;
		
		PTR_LLND    parent;    /* to a parent_string SgExpression */
		PTR_LLND    range;     /* to a SgRangeExp */  
	};

struct RECORD_REF_S { /* for SgRecordRefExp */
			PTR_SYMB    null;

			PTR_LLND    rec;        /* to a SgExpression for part_ref[%part_ref]... 
*/
			PTR_LLND    field;      /* to a SgVarRefExp for field */
		};
struct VECTOR_SUB_S { /* for SgVectorSubExp */
			PTR_SYMB    null_1;

			PTR_LLND    vector; /* to a SgExpression for vector_subscript */
			PTR_LLND    null_2;
		};

struct UNARY_OP_S { /* for SgUnaryExp */
			PTR_SYMB    null_1;

			PTR_LLND    operand;  
			PTR_LLND    null_2;
		};
struct BINARY_OP_S { /* for SgExpression */
			PTR_SYMB  null_1;

			PTR_LLND  l_operand;    /* to the left operand */
			PTR_LLND  r_operand;    /* to the right operand */
		};
struct DEFINED_BINARY_OP_S { /* for SgDefinedBinaryOpExp */
			PTR_SYMB    symbol;     /* for operator string */

			PTR_LLND    l_operand;   /* to the left operand */
			PTR_LLND    r_operand;   /* to the right operand */
		};

struct DEFINED_UNARY_OP_S { /* for SgDefinedUnaryOpExp */
			PTR_SYMB    symbol;     /* for operator string */

			PTR_LLND    operand;
			PTR_LLND    null_1;
		};
struct LABEL_LIST_S {  /* for SgLabelListExp */
		  PTR_LABEL lab_ptr;     /* to a label */

		  PTR_LLND  null_1;
		  PTR_LLND  next;        /* next label_list node */
		};
struct  USENAME_NODE{
	PTR_SYMB null_1;

	PTR_LLND lname; /*local name or generic,...*/
	PTR_LLND uname; /*use name*/
	};
struct RENAME_NODE_S { /* for SgUseRenameExp */ 
	PTR_SYMB null_1;

	PTR_LLND lname; /*local name */
	PTR_LLND uname; /*use name*/
	};
struct REF_EXP_S {  /* for SgRefExp */
		PTR_SYMB    symbol;  /* to the symbel */

		PTR_LLND    null_1;
		PTR_LLND    null_2;
	   };
struct LABEL_REF_S { /* for SgLabelRefExp */
	PTR_LABEL   lab_ptr;  /* to a SgLabel */

	PTR_LLND    null_1;
	PTR_LLND    null_2;
		};

struct FUNC_CALL_S { /* for SgFunctionCallExp */
			PTR_SYMB    symbol;     /* for fuction name */

			PTR_LLND    param_list; /* for paramter list */
			PTR_LLND    next_call;
		};

struct   KEYWORD_ARG_S  {
	PTR_SYMB    null;

	PTR_LLND    expr;  /* for the arg expression */
	PTR_LLND    keyword;   /* for the keyword string */
	};

 struct  DISTRIBUTE_S  {
		  PTR_SYMB null_1;

		  PTR_LLND dist_format; /*point to distribute format*/
		  PTR_LLND dist_target; /*point to distribute target*/
 };

struct  DATADIST_S {
	PTR_SYMB  null_1;
        PTR_LLND   int_expa ; /*point to a int_exp(can be nil), STAR_OP
				 or  COLON_OP*/
	PTR_LLND   null_2;
};

struct  ALIGN_ATTR_S {
		  PTR_SYMB null_1;

		  PTR_LLND align_source; /*point to align source list*/
		  PTR_LLND align_with; /*point to align_with clause*/
		 };

/* added for HPF*/
struct llnd{
	int         variant, id;    /* variant and identification tags */
	PTR_LLND    thread;      /* connects nodes together by allocation order */
	PTR_TYPE    type;       /* to be modified */

	union llnd_union_u {
		char*   string_val;     /* for integers, floats, doubles, strings*/
		int     ival;       /* fot integers */
		double  dval;               /* for floats and doubles */
		char    cval;               /* for chars */
		int     bval;               /* for booleans */
		/* fields above are all for SgValueExp */
		
		struct {
			PTR_SYMB    symbol;

			PTR_LLND    ll_ptr1;
			PTR_LLND    ll_ptr2;
		}    Template;

	struct {			/* for range, upper, and lower */
		PTR_SYMB  symbol;
		int	  dim;
	       }					array_op;

	struct {	    /* for complexes and double complexes */
		PTR_SYMB  null;

		PTR_LLND  real_part;
		PTR_LLND  imag_part;
	       }					complex;

	struct {
		PTR_LABEL lab_ptr;

		PTR_LLND  null_1;
		PTR_LLND  next;
	       }					label_list;

	struct {
		PTR_SYMB  null_1;

		PTR_LLND  item; 
		PTR_LLND  next;
	       }					list;

	struct {
		PTR_SYMB  null_1;

		PTR_LLND  size;
		PTR_LLND  list;
	       }					cons;
	
	struct {
		PTR_SYMB  control_var;
		   
		PTR_LLND  array;
		PTR_LLND  range;
	       }					access;

	struct {
		PTR_SYMB  control_var;

		PTR_LLND  array;
		PTR_LLND  range;
	       }					ioaccess;

	struct {
		PTR_SYMB  symbol;

		PTR_LLND  null_1;
		PTR_LLND  null_2;
	       }					const_ref;

	struct {
		PTR_SYMB  symbol;

		PTR_LLND  null_1;
		PTR_LLND  null_2;
	       }					var_ref;

	struct {
		PTR_SYMB  symbol;

		PTR_LLND  index;
		PTR_LLND  array_elt;
	       }					array_ref;

	struct {
		PTR_SYMB  null_1;

		PTR_LLND  access;
		PTR_LLND  index;
	       }					access_ref;

	struct {
		PTR_SYMB  null_1;

		PTR_LLND  cons;
		PTR_LLND  index;
	       }					cons_ref;

	struct {
		PTR_SYMB  symbol;

		PTR_LLND  null_1;
		PTR_LLND  rec_field;  /* for record fields */
	       }					record_ref; 

	struct {
		PTR_SYMB  symbol;

		PTR_LLND  param_list;
		PTR_LLND  next_call;
	       }					proc;

	struct {
		PTR_SYMB  null_1;

		PTR_LLND  operand;  
		PTR_LLND  null_2;
	       }					unary_op; 

	struct {
		PTR_SYMB  null_1;

		PTR_LLND  l_operand;
		PTR_LLND  r_operand;
	       }					binary_op;

	struct {
		PTR_SYMB  null_1;

		PTR_LLND  ddot;
		PTR_LLND  stride;
	       }					seq;

	struct {
		PTR_SYMB  null_1;

		PTR_LLND  sp_label;
		PTR_LLND  sp_value;
	       }					spec_pair;

		struct EXPR_LIST_S          list_s;           /* SgExprListExp */
	        struct KIND_VAL_S           literal;        /* SgValueExp */
		struct COMPLEX_S            complex_s;        /* SgValueExp */
		struct STRUCTURE_CONSTRUCTOR_S  struct_const;   /* SgStructConstExp */
		struct CONSTRUCTOR_REF_S    constructor;    /* SgConstExp */
		struct IMPLIED_DO_S         implied_do;     /* SgImpliedDoExp */
		struct TYPE_OP_S            type_op;        /* SgTypeExp */
		struct KIND_OP_S            kind_op;        /* SgKindExp */
		struct LEN_OP_S             string_length;  /* SgStringLengthExp */
		struct ATTRIBUTE_EXP_S      atribute;       /* SgAttributeExp */
		struct DDOT_S               subscript;      /* SgSubscriptExp */
		struct RANGE_VAL_S          range;          /* SgRangeExp */
		struct DATA_STMT_SET_S      data_stmt_set;  /* SgDataStmtSetExp */
		struct DATA_VALUE_S         data_value;     /* SgDataValueExp */
		struct IMPL_TYPE_S          implicit_type;  /* SgImplicitTypExp */
		struct OBJECT_LIST_S        object_list;        /* SgObjcetListExp */
		struct VAR_REF_S            var_ref_s;            /* SgVarRefExp */
		struct SUB_STRING_S         substring;          /* SgSubstringExp */
		struct ARRAY_REF_S          array_ref_s;      /* SgArrayRefExp */
		struct RECORD_REF_S         record_ref_s;     /* SgRecordRefExp */
		struct VECTOR_SUB_S         vector_sub;     /* SgVectorSubExp */
		struct UNARY_OP_S           unary_op_s;       /* SgUnaryExp */
		struct BINARY_OP_S          binary_op_s;      /* SgExpression */
		struct DEFINED_BINARY_OP_S  def_binary_op;  /* SgDefinedBinaryOpExp */
		struct DEFINED_UNARY_OP_S   def_unary_op;   /* SgDefinedUnaryOpExp */
		struct LABEL_LIST_S         label_list_s;     /* SgLabelListExp */
		struct RENAME_NODE_S        rename_node;    /* SgUseRenameExp */
		struct REF_EXP_S            symbol_ref;     /* SgRefExp */
		struct LABEL_REF_S          label_ref;      /* SgLabelRefExp */
		struct FUNC_CALL_S          func_call;      /* SgFuctionCallExp */
		struct KEYWORD_ARG_S        keyword;        /* SgKeywordArgExp */
                struct  DISTRIBUTE_S	    distribute_exp;  /*SgDistributeAttrExp*/
                struct	DATADIST_S          datadist_exp;    /*SgDataDistExp*/
		struct  ALIGN_ATTR_S       alignattr_exp;   /*SgAlignAttrExp*/
	} entry;        
};

# define __LL_DEF__  

/**********************************************************************
						       BIF.H
				Please set tabstop=4 if edit using vi
**********************************************************************/

struct STRUCT_DECL_S { /* for SgStructureDeclStmt */
			PTR_BFND    type_end;   /* to a SgStatement after
									   end_type_stmt */
			PTR_CMNT    cmnt_ptr;   /* to the comment */
			
			PTR_SYMB     symbol;     /* to a SgTypeSymel of type_name */
			
			PTR_LLND    attribute; /* changed. in sage++ it is attributs
									  for access_spec  */
			PTR_LLND    null_1;
			PTR_LLND    null_2;
			
			PTR_LABEL   null_3;
			
			PTR_BLOB    control;   /* to statements betwean derived_type_stmt
									  and end_type_stmt */
			PTR_BLOB    null_4;

			PTR_DEP     dep_from;
			PTR_DEP     dep_to;

			PTR_SETS    sets;
		};

struct MISCELL_STMT_S { /* for SgMiscellStmt */
			PTR_BFND    next_stat;   
			PTR_CMNT    cmnt_ptr;
			
			PTR_SYMB     null_1;
			
			PTR_LLND    null_2;
			PTR_LLND    null_3;
			PTR_LLND    null_4;
			
			PTR_LABEL   null_5;
			
			PTR_BLOB    null_6;
			PTR_BLOB    null_7;

			PTR_DEP     dep_from;
			PTR_DEP     dep_to;

			PTR_SETS    sets;
		};

struct VAR_DECL_STMT_S { /* for SgVarDeclStmt */
			PTR_BFND    next_stat;  /* to next statement */
			PTR_CMNT    cmnt_ptr;   /* to comments */
			
			PTR_SYMB     null_1;
																											   
			PTR_LLND    entities; /* to a SgExprListExp of entity_decl_list */
			PTR_LLND    type;       /* to a SgTypeExp.changed */           
			PTR_LLND    attributes; /* to a SgExprListExp of attribute_list */
			
			PTR_LABEL   null_2;

			PTR_BLOB    null_3;
			PTR_BLOB    null_4;

			PTR_DEP     dep_from;
			PTR_DEP     dep_to;

			PTR_SETS    sets;
		};

struct INTENT_STMT_S { /* for SgIntentStmt */
			PTR_BFND    last_stat;  /* for last statement */
			PTR_CMNT    cmnt_ptr;   /* for comments */
			
			PTR_SYMB     null_1;
			
			PTR_LLND    list;       /* to a SgExprListExp for objects */
			PTR_LLND    attr_expr;  /* to a SgAtributExp */
			PTR_LLND    null_2;
			
			PTR_LABEL   null_3;
			
			PTR_BLOB    null_4;
			PTR_BLOB    null_5;

			PTR_DEP     dep_from;
			PTR_DEP     dep_to;

			PTR_SETS    sets;
		}    ;

struct VAR_LIST_DECL_STMT_S { /* for SgVarListDeclStmt */
			PTR_BFND    next_stat;
			PTR_CMNT    cmnt_ptr;
			
			PTR_SYMB     null_1;
			
			PTR_LLND    list;       /* to a SgExprListExp for objects */
			PTR_LLND    null_2;
			PTR_LLND    null_3;
			
			PTR_LABEL   null_4;
			
			PTR_BLOB    null_5;
			PTR_BLOB    null_6;

			PTR_DEP     dep_from;
			PTR_DEP     dep_to;

			PTR_SETS    sets;
		};

struct IMPL_DECL_STMT_S { /* for SgImplicitStmt */
			PTR_BFND    next_stat;      /* for next statement */
			PTR_CMNT    cmnt_ptr;       /* for comments */
			
			PTR_SYMB     null_1;
																											   
			PTR_LLND    list;           /* to a SgExprListExp of RANGE_VAL */
			PTR_LLND    null_2;
			PTR_LLND    null_3;
			
			PTR_LABEL   null_4;

			PTR_BLOB    null_5;
			PTR_BLOB    null_6;

			PTR_DEP     dep_from;
			PTR_DEP     dep_to;

			PTR_SETS    sets;
		};

struct NEST_VAR_LIST_DECL_S { /* for SgNestVarListDeclStmt */
			PTR_BFND   next_stat;   /* for next statment*/
			PTR_CMNT   cmnt_ptr;    /* for comments*/ 
			
			PTR_SYMB    null_1;
			
			PTR_LLND   list;        /*to a SgExprListExp of SgObjectListExp */
			PTR_LLND   null_2; 
			PTR_LLND   null_3;
			
			PTR_LABEL  null_4;
			
			PTR_BLOB   null_5;
			PTR_BLOB   null_6;

			PTR_DEP    dep_from;
			PTR_DEP    dep_to;

			PTR_SETS   sets;
		};

struct HEAP_STMT_S { /* for SgHeapStmt */
			PTR_BFND    next_stat;  /* for next statement */
			PTR_CMNT    cmnt_ptr;   /* for comments */
			
			PTR_SYMB     null_1;
																											   
			PTR_LLND    list;       /* objects list */
			PTR_LLND    stat;       /* stat_variable */
			PTR_LLND    null_2;
			
			PTR_LABEL   null_3;
			
			PTR_BLOB    null_4;
			PTR_BLOB    null_5;

			PTR_DEP     dep_from;
			PTR_DEP     dep_to;

			PTR_SETS    sets;
	   };

struct NULLIFY_STMT_S { /* for SgNullifyStmt */
			PTR_BFND    next_stat;
			PTR_CMNT    cmnt_ptr;
			
			PTR_SYMB     null_1;
																											   
			PTR_LLND    list;       /* objects list */
			PTR_LLND    null_2;
			PTR_LLND    null_3;
			
			PTR_LABEL   null_4;
			
			PTR_BLOB    null_5;
			PTR_BLOB    null_6;

			PTR_DEP     dep_from;
			PTR_DEP     dep_to;

			PTR_SETS    sets;
		};

struct DO_STMT_S { /* for SgForStmt */
		  PTR_BFND  do_end;      /* next statement after do construct */
		  PTR_CMNT  cmnt_ptr;    /* comments    */

		  PTR_SYMB   control_var; /* do variable */

		  PTR_LLND  range;       /* point to a LLND object contain
									start and end expressions       */  
		  PTR_LLND  increment;   /* step */
		  PTR_LLND  construct_name;/* point to LLND object which store
									  do construct_name at SYMB field */

		  PTR_LABEL do_label;

		  PTR_BLOB  control;
		  PTR_BLOB  null_1;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		};

struct DO_WHILE_STMT_S { /* for SgWhileStmt */
		  PTR_BFND  do_end;    /* next statement after do while statement  */
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   null_1;

		  PTR_LLND  conditional; /* while logical expression */  
		  PTR_LLND  null_2;
		  PTR_LLND  construct_name;/* point to LLND object which store
									  do construct_name at SYMB field */

		  PTR_LABEL do_label;

		  PTR_BLOB  control;
		  PTR_BLOB  null_4;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		};

struct IF_STMT_S { /* for SgLogIfStmt */
		  PTR_BFND  true_branch ;/* next statement after logic if statement */
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   null_1;

		  PTR_LLND  condition;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control_true;
		  PTR_BLOB  null_5;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		};

struct  IF_THEN_ELSE_S { /* for SgIfStmt */
		  PTR_BFND  true_branch;/* next statement after if then else statement */
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   construct_name;

		  PTR_LLND  condition;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control_true;
		  PTR_BLOB  control_false;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
	}       ;

struct IF_ELSE_IF_STMT_S { /* for SgIfElseIfStmt */
		  PTR_BFND  true_branch;/* next statement after if construct */
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   construct_name;

		  PTR_LLND  condition;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control_true;
		  PTR_BLOB  control_false;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		};

struct  ARITH_IF_STMT_S {
		  PTR_BFND  true_branch;/* next statement after arithmetic if statement */
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   null_1;

		  PTR_LLND  condition;
		  PTR_LLND  label_list;/* point to a label_list expression */
		  PTR_LLND  null_2;

		  PTR_LABEL null_3;

		  PTR_BLOB  null_4;
		  PTR_BLOB  null_5;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		 };

struct WHERE_STMT_S { /* for SgWhereStmt */
		  PTR_BFND  true_branch ;/* next statement after where statement */

		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   null_1;

		  PTR_LLND  condition; /* mask expr */
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control_true;/* point to an assignment statement */
		  PTR_BLOB  null_5;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		};

struct WHERE_BLOCK_STMT_S { /* for SgWhereBlockStmt */
		  PTR_BFND  true_branch;/* next statement after where construct */
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   null_1;

		  PTR_LLND  condition; /* mask expr */
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control_true;
		  PTR_BLOB  control_false;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		};

struct CASE_STMT_S { /* for SgSwitchStmt */
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   construct_name;/* case construct name */ 

		  PTR_LLND  selector;     /* case selector  */
		  PTR_LLND  null_1;
		  PTR_LLND  null_2;

		  PTR_LABEL null_3;

		  PTR_BLOB  case_option_stmt_list;/* used for  case 
										option statment list */
		  PTR_BLOB  null_4;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		};

struct CASE_OPTION_STMT_S { /* for SgCaseOptionStmt */
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   construct_name;/* case construct name */ 

		  PTR_LLND  case_option_expr_list; /* used for case option 
												expression list  */
		  PTR_LLND  null_1;
		  PTR_LLND  null_2;

		  PTR_LABEL null_3;

		  PTR_BLOB  control;
		  PTR_BLOB  null_4;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
};

struct   CONTINUE_STMT_S  {
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   null_1;

		  PTR_LLND  null_2;
		  PTR_LLND  null_3;
		  PTR_LLND  null_4;

		  PTR_LABEL null_5;

		  PTR_BLOB  null_6;
		  PTR_BLOB  null_7;

		  PTR_DEP   null_8;
		  PTR_DEP   null_9;

		  PTR_SETS  sets;
		};

struct GOTO_STMT_S { /* for SgGotoStmt */
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   null_1;

		  PTR_LLND  null_2;
		  PTR_LLND  null_3;
		  PTR_LLND  target_label;  /* label */

		  PTR_LABEL null_4;

		  PTR_BLOB  null_5;
		  PTR_BLOB  null_6;

		  PTR_DEP   null_7;
		  PTR_DEP   null_8;

		  PTR_SETS  sets;
		};

struct  ASSIGN_STMT_S { /* for SgAssignStmt */
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB   null_1;

		  PTR_LLND  l_value;    /* variable or pointer_object */
		  PTR_LLND  r_value;    /* exor or target */
		  PTR_LLND  null_2;

		  PTR_LABEL null_3;

		  PTR_BLOB  null_4;
		  PTR_BLOB  null_5;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		};

struct ASSLAB_STAT_S { /* for SgAssignLabelStmt */
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB   null_1;

		  PTR_LLND  l_value;   /* label */
		  PTR_LLND  r_value;   /* scalar_int_variable */
		  PTR_LLND  null_2;

		  PTR_LABEL null_3;

		  PTR_BLOB  null_4;
		  PTR_BLOB  null_5;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		};

struct  ASSGOTO_NODE_S { /* for SgAssignGotoStmt */
		  PTR_BFND  next_stat;       
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB   goto_variable;

		  PTR_LLND  label_list;/* point to a label_list expression list */
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  null_5;
		  PTR_BLOB  null_6;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;
		  
		  PTR_SETS  sets;
		};

struct  COMPGOTO_NODE_S { /* for SgComputedGotoStmt */
		  PTR_BFND  next_stat;       
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB   null_2;

		  PTR_LLND  label_list;/* point to a label_list expression list */
		  PTR_LLND  goto_expr;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  null_5;
		  PTR_BLOB  null_6;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;
		  
		  PTR_SETS  sets;
		};

struct STOP_STAT_S { /* for SgStopOrPauseStmt */
		  PTR_BFND  next_stat;       
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB   null_1;

		  PTR_LLND  stop_code;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  null_5;
		  PTR_BLOB  null_6;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;
		  
		  PTR_SETS  sets;
		};

struct CYCLE_STMT_S { /* for SgCycleStmt */
		  PTR_BFND  next_stat;       
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB   construct_name;

		  PTR_LLND  null_1;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  null_5;
		  PTR_BLOB  null_6;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;
		  
		  PTR_SETS  sets;
		};

struct EXIT_STMT_S { /* for SgExitStmt */
		  PTR_BFND  next_stat;       
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB   construct_name;

		  PTR_LLND  null_1;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  null_5;
		  PTR_BLOB  null_6;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;
		  
		  PTR_SETS  sets;
		};

struct CONTROL_END_STMT_S { /* for SgControlEndStmt  */
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB   control_name;  

		  PTR_LLND  null_2;
		  PTR_LLND  null_3;
		  PTR_LLND  null_4;

		  PTR_LABEL null_5;

		  PTR_BLOB  null_6;
		  PTR_BLOB  null_7;

		  PTR_DEP   null_8;
		  PTR_DEP   null_9;

		  PTR_SETS  sets;
		};

struct FUNCTION_STMT_S { /* for SgFuncHedrStmt */
	PTR_BFND next_func;
	PTR_CMNT cmnt_ptr; /*attach to coments*/

	PTR_SYMB  func_symb; /*point to function symbol*/

	PTR_LLND ftype; /*returned result */
	PTR_LLND null_1;
	PTR_LLND null_2;

	PTR_LABEL null_3;

	PTR_BLOB  control;  /*point to the body of function*/
	PTR_BLOB  format_group; /*internal subprogram part */

	PTR_DEP   null_4;
	PTR_DEP   null_5;

	PTR_SETS  null_6;
	 };

struct  PROG_HEDR_STMT_S { /* for SgProgHedrStmt */
	PTR_BFND next_prog;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  prog_symb; /*program name*/

	PTR_LLND null_1;
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB control;    /*point to body of the program*/
	PTR_BLOB format_group;

	PTR_DEP  null_5;
	PTR_DEP  null_6;

	PTR_SETS null_7;
	 };

struct  SUBROUTINE_STMT_S {/* for SgProcHedrStmt */
	PTR_BFND next_proc;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  proc_symb; /*procedure name*/

	PTR_LLND prefix;
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB control; /*potint to body of the subrutine*/
	PTR_BLOB format_group;

	PTR_DEP  null_5;
	PTR_DEP  null_6;

	PTR_SETS null_7;
	 };

struct  BLOCK_DATA_STMT_S {/* for SgBlockDataStmt */
	PTR_BFND blockdata_end;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  blockdata_symb; /*block_dsta_name*/

	PTR_LLND null_1;
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB control;      /*specification_part*/
	PTR_BLOB null_5;

	PTR_DEP  null_6;
	PTR_DEP  null_7;

	PTR_SETS null_8;
	 };

struct  MODULE_STMT_S { /* for SgModuleStmt */
	PTR_BFND module_end;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  module_symb;   /*MODULE_NAME*/

	PTR_LLND null_1;
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB control; /*specification patr*/
	PTR_BLOB format_group;  /*module subprogram part*/

	PTR_DEP  null_5;
	PTR_DEP  null_6;

	PTR_SETS null_7;
	 };

struct  INTERFACE_STMT_S {/* for SgInterfaceStmt */
	PTR_BFND interface_end;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  interface_symb; /*point to gene_spec*/

	PTR_LLND null_1;
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB control; /*interface body*/
	PTR_BLOB null_5;

	PTR_DEP  null_7;
	PTR_DEP  null_8;

	PTR_SETS null_9;
	 };

struct  ENTRY_STMT_S {/* for SgStatement */
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  entry_name;/*ENTRY_NAME*/

	PTR_LLND result; /*result name*/
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB null_5;
	PTR_BLOB null_6;

	PTR_DEP  null_7;
	PTR_DEP  null_8;
	PTR_SETS null_9;
	 };

struct  STMT_FUNCTION_STMT_S  {
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  func_symb; /*function name*/

	PTR_LLND return_value;  /* for scalar_expr after the "=" */
	PTR_LLND null_1;
	PTR_LLND null_2;

	PTR_LABEL null_3;

	PTR_BLOB null_4;
	PTR_BLOB null_5;

	PTR_DEP  null_6;
	PTR_DEP  null_7;

	PTR_SETS null_8;
	 };

struct RETURN_STMT_S {/* for SgReturnStmt */
	PTR_BFND next_bif;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND expr;  /*return  expression*/
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB null_5;
	PTR_BLOB null_6;

	PTR_DEP null_7;
	PTR_DEP null_8;
	PTR_SETS null_9;

	};

struct  USE_STMT_S {  /* for SgUseStmt */
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  module_symb; /*PTR_SYMB.variant==MODULE_NAME*/

	PTR_LLND useonly_expr;  /* PTR_LLND.variant==ONLY_NODE,
				   ONLY name list */
	PTR_LLND userename_expr; /*PTR_LLND.variant==RENAME_NODE,
				   RENAME name list */
	PTR_LLND null_2;

	PTR_LABEL null_3;

	PTR_BLOB null_4;
	PTR_BLOB null_5;

	PTR_DEP  null_6;
	PTR_DEP  null_7;

	PTR_SETS null_8;
	 };

struct CALL_STMT_S {/* for SgCallStmt */
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND call_exp;  /*procedure call expression*/
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB null_5;
	PTR_BLOB null_6;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 };

struct  READ_STMT_S {/* for variant==READ_STAT*/        
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND format;    /*only used by no control
				  specification list*/
	PTR_LLND expr_list; /*read item list*/
	PTR_LLND control_list; /*only used by control spectification*/

	PTR_LABEL fomt_label;/* format label*/

	PTR_BLOB null_3;
	PTR_BLOB null_4;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 };

/*WriteStmt*/
struct  WRITE_STMT_S {  /*variant==WRITE_STAT*/
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND null_2;
	PTR_LLND expr_list; /*output item list*/
	PTR_LLND control_list;  /*control specification*/

	PTR_LABEL null_3;

	PTR_BLOB null_4;
	PTR_BLOB null_5;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 }                write_stat;

/*PrintStmt*/
struct  PRINT_STMT_S {      /*variant==PRINT_STAT*/
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND format; /*only used by no control specification list*/
	PTR_LLND expr_list; /*output item list*/
	PTR_LLND null_2;

	PTR_LABEL fomt_label;/* format label*/

	PTR_BLOB null_4;
	PTR_BLOB null_5;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 };

/*OpenStmt*/
struct  OPEN_STMT_S { /*variant=OPEN_STAT*/
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND control;/*open specifiation list*/
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB null_5;
	PTR_BLOB null_6;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 };

/*CloseStmt*/
struct  CLOSE_STMT_S { /*variant=CLOSE_STAT*/
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND control; /*close specification list*/
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB null_5;
	PTR_BLOB null_6;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 };

/*FormatStmt*/
struct  FORMAT_STMT_S {/*variant==FORMAT_STAT*/
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND format; /*format specification item list */
	PTR_LLND null_2;
	PTR_LLND null_3;

	PTR_LABEL null_4;

	PTR_BLOB null_5;
	PTR_BLOB null_6;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 };
/*InquireStmt*/
struct  INQUIRE_STMT_S {    /*variant==INQUIRE_STAT*/
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND spec_list; /*specification list*/
	PTR_LLND length; /*IOLENGTH  value*/
	PTR_LLND output_item; /*output item list*/

	PTR_LABEL null_2;

	PTR_BLOB null_3;
	PTR_BLOB null_4;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
 };

/*BackspaceStmt*/
struct  BACKSPACE_STMT_S {  /*variant==BACKSPACE_STAT*/
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND file_expr; /*external file unit*/
	PTR_LLND posit_list; /*position specification list */
	PTR_LLND null_2;

	PTR_LABEL null_3;

	PTR_BLOB null_4;
	PTR_BLOB null_5;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 };

/*RewindStmt*/
struct  REWIND_STMT_S { /*variant==REWIND_STAT*/
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND file_expr; /*external file unit*/
	PTR_LLND posit_list; /*position specification list */
	PTR_LLND null_2;

	PTR_LABEL null_3;

	PTR_BLOB null_4;
	PTR_BLOB null_5;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 };

/*EndfileStmt*/
struct  END_FILE_STMT_S {   /*variant==ENDFILE_STAT*/
	PTR_BFND next_stat;
	PTR_CMNT cmnt_ptr;

	PTR_SYMB  null_1;

	PTR_LLND file_expr; /*external file unit*/
	PTR_LLND posit_list; /*position specification list */
	PTR_LLND null_2;

	PTR_LABEL null_3;

	PTR_BLOB null_4;
	PTR_BLOB null_5;

	PTR_DEP  dep_from;
	PTR_DEP  dep_to;

	PTR_SETS sets;
	 };

 struct  REDISTRIBUTE_STMT_S  { 
		PTR_BFND next_stat; /*??*/
		PTR_CMNT cmnt_ptr;  /*comment*/

		PTR_SYMB   null_0;

		PTR_LLND  distributees; /*pointer to distributee or distributees*/
		PTR_LLND  attr_node;    /*point to SgAttributeExp node*/
		PTR_LLND  null_1;

		PTR_LABEL  null_2;

		PTR_BLOB   null_3;
		PTR_BLOB   null_4;

		PTR_DEP    dep_from;
		PTR_DEP    def_to;

		PTR_SETS    sets; 
	 };

struct  REALIGN_STMT_S  {
		PTR_BFND next_stat; /*??*/
		PTR_CMNT cmnt_ptr;  /*comment*/
		
		PTR_SYMB   null_0;

		PTR_LLND  alignees; /*pointer to alignee or alignees*/
		PTR_LLND  attr_node;    /*point to SgAttributeExp node*/
		PTR_LLND  null_1;

		PTR_LABEL  null_2;

		PTR_BLOB   null_3;
		PTR_BLOB   null_4;

		PTR_DEP    dep_from;
		PTR_DEP    def_to;

		PTR_SETS    sets; 
	 } ;

struct  FORALL_STMT_S  {
		PTR_BFND for_end;   /*pointer to next statement of END FORALL or 
							 the next stmt after forall_asignment*/
		PTR_CMNT cmnt_ptr;  /*comment*/

		PTR_SYMB null_1;    

		PTR_LLND  head_exp_list; /*point to forall header*/
		PTR_LLND  scalar_mask_expr;/*point to scalar_mask expression*/
		PTR_LLND  null_2;

		PTR_LABEL  null_3;

		PTR_BLOB   control;
		PTR_BLOB   null_4;

		PTR_DEP    dep_from;
		PTR_DEP    def_to;

		PTR_SETS    sets; 
	 } ;

 struct  INDEPDENT_STMT_S {
		PTR_BFND do_stmt;   /*point to related FORALL or DO statement*/
		PTR_CMNT cmnt_ptr;  /*comment*/

		PTR_SYMB   null_1;    

		PTR_LLND  new_varible_list; /*point to new varible list*/
		PTR_LLND  null_2;
		PTR_LLND  null_3;

		PTR_LABEL  null_4;

		PTR_BLOB   control;
		PTR_BLOB   null_5;

		PTR_DEP    dep_from;
		PTR_DEP    def_to;

		PTR_SETS    sets; 
	  }  ;
 #define __BIF_DEF__

/* designed for HPF*/
struct bfnd {

	 int    variant, id;        /* variant and identification tags */
	 int    index;              /* used in the strongly con. comp. routines */
	 int    g_line, l_line;     /* global & local line numbers */
	 int        decl_specs;     /* declaration specifiers stored with
								bif nodes: static, extern, friend, and inline */

	 PTR_LABEL  label;
	 PTR_BFND   thread;

	 PTR_FNAME  filename;       /* point to the source filename */

	 PTR_BFND   control_parent;     /* current bif node in on the control blob list
							of control_parent */
	 PTR_PLNK   prop_list;      /* property list */
	
	 union bfnd_union_u {
	 
	 struct {
		  PTR_BFND  bf_ptr1;        /* used by the parser and should */
		  PTR_CMNT  cmnt_ptr;       /* to attach comments */

		  PTR_SYMB   symbol;     /* a symbol table entry */

		  PTR_LLND  ll_ptr1;        /* an L-value expr tree */
		  PTR_LLND  ll_ptr2;        /* an R-value expr tree */
		  PTR_LLND  ll_ptr3;        /* a spare expr tree (see below) */

		  PTR_LABEL lbl_ptr;        /* used by do */

		  PTR_BLOB  bl_ptr1;        /* a list of control dep subnodes */
		  PTR_BLOB  bl_ptr2;        /* another such list (for if stmt) */

		  PTR_DEP   dep_ptr1;       /* a list of dependences nodes */
		  PTR_DEP   dep_ptr2;       /* another list of dep nodes */

		  PTR_SETS  sets;       /* a list of sets like GEN, KILL etc */
		}               Template;

	 struct {
		  PTR_BFND  proc_list;	/* a list of procedures in this file */
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  list;	/* list of global const and type */

		  PTR_LLND  null_2;
		  PTR_LLND  null_3;
		  PTR_LLND  null_4;
		  
		  PTR_LABEL null_5;

		  PTR_BLOB  control;	/* used for list of procedures */
		  PTR_BLOB  null_6;

		  PTR_DEP   null_7;
		  PTR_DEP   null_8;
		  
		  PTR_SETS  null_9;
		}				Global;

	 struct {
		  PTR_BFND  next_prog;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  prog_symb;

		  PTR_LLND  null_1;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control;
		  PTR_BLOB  format_group;

		  PTR_DEP   null_5;
		  PTR_DEP   null_6;

		  PTR_SETS  null_7;
		}				program;

	 struct {
		  PTR_BFND  next_proc;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  proc_symb;

		  PTR_LLND  null_1;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control;
		  PTR_BLOB  format_group;

		  PTR_DEP   null_5;
		  PTR_DEP   null_6;
		  
		  PTR_SETS  null_7;
		}				procedure;

	 struct {
		  PTR_BFND  next_func;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  func_symb;

		  PTR_LLND  ftype;
		  PTR_LLND  null_1;
		  PTR_LLND  null_2;

		  PTR_LABEL null_3;

		  PTR_BLOB  control;
		  PTR_BLOB  format_group;

		  PTR_DEP   null_4;
		  PTR_DEP   null_5;

		  PTR_SETS  null_6;
		}				function;

	 struct {
		  PTR_BFND  next_bif;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  null_1;

		  PTR_LLND  null_2;
		  PTR_LLND  null_3;
		  PTR_LLND  null_4;

		  PTR_LABEL null_5;

		  PTR_BLOB  control;
		  PTR_BLOB  null_6;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				basic_block;

	 struct {
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  null_1;

		  PTR_LLND  null_2;
		  PTR_LLND  null_3;
		  PTR_LLND  null_4;

		  PTR_LABEL null_5;

		  PTR_BLOB  null_6;
		  PTR_BLOB  null_7;

		  PTR_DEP   null_8;
		  PTR_DEP   null_9;

		  PTR_SETS  sets;
		}				control_end;

	 struct {
		  PTR_BFND  true_branch;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  null_1;

		  PTR_LLND  condition;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control_true;
		  PTR_BLOB  control_false;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				if_node;

	 struct {
		  PTR_BFND  true_branch;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  null_1;

		  PTR_LLND  condition;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control_true;
		  PTR_BLOB  control_false;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				where_node;

	 struct {
		  PTR_BFND  loop_end;
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB  null_1;

		  PTR_LLND  null_2;
		  PTR_LLND  null_3;
		  PTR_LLND  null_4;

		  PTR_LABEL null_5;

		  PTR_BLOB  control;
		  PTR_BLOB  null_6;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				loop_node;

	 struct {
		  PTR_BFND  for_end;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  control_var;

		  PTR_LLND  range;
		  PTR_LLND  increment;
		  PTR_LLND  where_cond;

		  PTR_LABEL doend;

		  PTR_BLOB  control;
		  PTR_BLOB  null_1;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				for_node;

	 struct {
		  PTR_BFND  forall_end;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  control_var;

		  PTR_LLND  range;
		  PTR_LLND  increment;
		  PTR_LLND  where_cond;

		  PTR_LABEL null_1;

		  PTR_BLOB  control;
		  PTR_BLOB  null_2;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				forall_nd;

	 struct {
		  PTR_BFND  alldo_end;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  control_var;

		  PTR_LLND  range;
		  PTR_LLND  increment;
		  PTR_LLND  null_0;

		  PTR_LABEL null_1;

		  PTR_BLOB  control;
		  PTR_BLOB  null_2;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				alldo_nd;

	 struct {
		  PTR_BFND  while_end;
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB  null_1;

		  PTR_LLND  condition;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control;
		  PTR_BLOB  null_5;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				while_node;

	 struct {
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB  null_1;

		  PTR_LLND  condition;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  control_true;
		  PTR_BLOB  control_false;

		  PTR_DEP   null_5;
		  PTR_DEP   null_6;

		  PTR_SETS  sets;
		}				exit_node;

	 struct {
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB  null_1;

		  PTR_LLND  l_value;
		  PTR_LLND  r_value;
		  PTR_LLND  null_2;

		  PTR_LABEL null_3;

		  PTR_BLOB  null_4;
		  PTR_BLOB  null_5;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				assign;

	 struct {
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  null_1;

		  PTR_LLND  l_value;
		  PTR_LLND  r_value;
		  PTR_LLND  null_2;

		  PTR_LABEL null_3;

		  PTR_BLOB  null_4;
		  PTR_BLOB  null_5;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				identify;

	 struct {
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;

		  PTR_SYMB  null_1;

		  PTR_LLND  spec_string;
		  PTR_LLND  null_2;
		  PTR_LLND  null_3;

		  PTR_LABEL null_4;

		  PTR_BLOB  null_5;
		  PTR_BLOB  null_6;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				format;

	 struct {
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB  null_1;

		  PTR_LLND  format;		/* used by blaze only */
		  PTR_LLND  expr_list;
		  PTR_LLND  control_list;	/* used by cedar fortan only */

		  PTR_LABEL null_2;

		  PTR_BLOB  null_3;
		  PTR_BLOB  null_4;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
		}				write_stat;

	 struct {
		  PTR_BFND  next_stat;
		  PTR_CMNT  cmnt_ptr;
		  
		  PTR_SYMB  null_1;

		  PTR_LLND  format;		/* used by blaze only */
		  PTR_LLND  var_list;
		  PTR_LLND  control_list;	/* used by cedar fortran */

		  PTR_LABEL null_2;

		  PTR_BLOB  null_3;
		  PTR_BLOB  null_4;

		  PTR_DEP   dep_from;
		  PTR_DEP   dep_to;

		  PTR_SETS  sets;
	     }					read_stat;
	  struct STRUCT_DECL_S      struct_decl;        /* SgStructDeclStmt */
	  struct MISCELL_STMT_S     miscell;            /* SgMiscellStmt */
	  struct VAR_DECL_STMT_S    var_decl;           /* SgVarDeclStmt */
	  struct INTENT_STMT_S      intent;             /* SgIntentStmt*/
	  struct VAR_LIST_DECL_STMT_S  var_list_decl;   /* SgVarListDeclStmt */
	  struct IMPL_DECL_STMT_S      implicit_decl;   /* SgImplicitStmt */
	  struct NEST_VAR_LIST_DECL_S  nest_decl;       /* SgNestVarListDeclStmt */
	  struct HEAP_STMT_S           heap;            /* SgHeapStmt */
	  struct NULLIFY_STMT_S        nullify;         /* SgNullifyStmt */
	  struct DO_STMT_S          do_stmt;            /* SgForStmt */
	  struct DO_WHILE_STMT_S    do_while;           /* SgWhileStmt */
	  struct IF_STMT_S          if_stmt;            /* SgLogIfStmt */
	  struct IF_THEN_ELSE_S     if_then_else;       /* SgIfStmt */
	  struct IF_ELSE_IF_STMT_S  if_else_if;         /* SgIfElseIfStmt */
	  struct ARITH_IF_STMT_S    arith_if;       /* SgArithIfStmt */
	  struct WHERE_STMT_S       where_stmt;         /* SgWhereStmt */
	  struct WHERE_BLOCK_STMT_S where_block;        /* SgWhereBlockStmt */
	  struct CASE_STMT_S        case_stmt;          /* SgSwitchStmt */
	  struct CASE_OPTION_STMT_S  case_option;       /* SgCaseOptionStmt */
	  struct CONTINUE_STMT_S     cntinue;           /* SgContinueStmt */
	  struct GOTO_STMT_S        goto_stmt;          /* SgGotoStmt */
	  struct ASSIGN_STMT_S      assign_s;             /* SgAssignStmt */
	  struct ASSLAB_STAT_S      assign_label;       /* SgAssignLabelStmt */
	  struct ASSGOTO_NODE_S     assign_goto;        /* SgAssignGotoStmt */
	  struct COMPGOTO_NODE_S    computed_goto;  /* SgComputedGotoStmt */
	  struct STOP_STAT_S        stop;               /* SgStopOrPauseStmt */
	  struct CYCLE_STMT_S       cycle;              /* SgCycleStmt */
	  struct EXIT_STMT_S        exit_stmt;          /* SgExitStmt */
	  struct CONTROL_END_STMT_S  contol_end;        /* SgControlEndStmt */
	  struct FUNCTION_STMT_S    func_stmt;      /* SgFuncHedrStmt */
	  struct PROG_HEDR_STMT_S   prog_stmt;      /* SgProgHedrStmt */
	  struct SUBROUTINE_STMT_S  subroutine_stmt;    /* SgProcHedrStmt */
	  struct BLOCK_DATA_STMT_S  block_data;         /* SgBlockDataStmt */
	  struct MODULE_STMT_S      module_stmt;        /* SgModuleStmt */
	  struct INTERFACE_STMT_S   interface;          /* SgInterfaceStmt */
	  struct ENTRY_STMT_S       entry;              /* SgEntryStmt */
	  struct STMT_FUNCTION_STMT_S  stmt_func;       /* SgStmtFunctionStmt */
	  struct RETURN_STMT_S         return_stmt;     /* SgReturnStmt */
	  struct USE_STMT_S         use_stmt;           /* SgUseStmt */
	  struct CALL_STMT_S        call;               /* SgCallStmt */
	  struct PRINT_STMT_S       print_stat;         /* SgInputOutPutStmt */
	  struct OPEN_STMT_S        open_stat;          /* SgIoControlStmt */
	  struct CLOSE_STMT_S       close_stat;         /* SgIoControlStmt */
	  struct FORMAT_STMT_S      format_stat;        /* SgIoControlStmt */
	  struct INQUIRE_STMT_S     inquire_stat;       /* SgIoControlStmt */
	  struct BACKSPACE_STMT_S   backspace_stat;     /* SgIoControlStmt */
	  struct REWIND_STMT_S      rewind_stat;        /* SgIoControlStmt */
	  struct END_FILE_STMT_S    end_file_stat;      /* SgIoControlStmt */
      struct REDISTRIBUTE_STMT_S  	redistribute_stat;  /*SgRedistributeStmt*/
      struct REALIGN_STMT_S    	realign_stat;   	/*SgRealignStmt*/
      struct FORALL_STMT_S      	forall_Stat;  		/*SgForallStmt*/
      struct INDEPDENT_STMT_S   	indepdent_stat;  	/*SgIndepdentStmt*/
     }  entry;
};

#define __BIF_DEF__