/************************************************************************** GTA PROJECT AT division Copyright, 1989-93, The Regents of the University of California. Los Alamos National Laboratory parse.h,v 1.2 1995/06/27 15:25:50 wright Exp DESCRIPTION: Structures for parsing the state notation language. ENVIRONMENT: UNIX HISTORY: 18nov91,ajk Replaced lstLib stuff with in-line links. 28oct93,ajk Added support for assigning array elements to pv's. 28oct93,ajk Added support for pointer declarations (see VC_*) 5nov93,ajk Changed structures var & db_chan to handle array assignments. 5nov93,ajk changed malloc() to calloc() 3 places. ***************************************************************************/ /* Data for these blocks are generated by the parsing routines for each ** state set. The tables are then used to generate the run-time C code ** for the sequencer. This decouples the parsing implementation from ** the run-time code implementation. */ struct expression /* Expression block */ { struct expression *next; /* link to next expression */ struct expression *last; /* link to last in list */ struct expression *left; /* ptr to left expression */ struct expression *right; /* ptr to right expression */ int type; /* expression type (E_*) */ char *value; /* operator or value string */ int line_num; /* line number */ char *src_file; /* effective source file */ }; typedef struct expression Expr; struct var /* Variable or function definition */ { struct var *next; /* link to next item in list */ char *name; /* variable name */ char *value; /* initial value or NULL */ int type; /* var type */ int class; /* simple, array, or pointer */ int length1; /* 1st dim. array lth (default=1) */ int length2; /* 2nd dim. array lth (default=1) */ int ef_num; /* bit number if this is an event flag */ struct db_chan *chan; /* ptr to channel struct if assigned */ }; typedef struct var Var; struct db_chan /* DB channel assignment info */ { struct db_chan *next; /* link to next item in list */ char *db_name; /* database name (assign all to 1 pv) */ char **db_name_list; /* list of db names (assign each to a pv) */ int num_elem; /* number of elements assigned in db_name_list */ Var *var; /* ptr to variable definition */ int count; /* count for db access */ int mon_flag; /* TRUE if channel is "monitored" */ int *mon_flag_list; /* ptr to list of monitor flags */ Var *ef_var; /* ptr to event flag variable for sync */ Var **ef_var_list; /* ptr to list of event flag variables */ int ef_num; /* event flag number */ int *ef_num_list; /* list of event flag numbers */ int index; /* index in database channel array (seqChan) */ }; typedef struct db_chan Chan; /* Note: Only one of db_name or db_name_list can have a non-zero value */ Expr *expression(), *link_expr(); Var *findVar(); Chan *findChan(); /* Linked list allocation definitions */ #define allocExpr() (Expr *)calloc(1, sizeof(Expr)); #define allocVar() (Var *)calloc(1, sizeof(Var)); #define allocChan() (Chan *)calloc(1, sizeof(Chan)); /* Variable types */ #define V_NONE 0 /* not defined */ #define V_CHAR 1 /* char */ #define V_SHORT 2 /* short */ #define V_INT 3 /* int */ #define V_LONG 4 /* long */ #define V_FLOAT 5 /* float */ #define V_DOUBLE 6 /* double */ #define V_STRING 7 /* strings (array of char) */ #define V_EVFLAG 8 /* event flag */ #define V_FUNC 9 /* function (not a variable) */ #define V_UCHAR 11 /* unsigned char */ #define V_USHORT 12 /* unsigned short */ #define V_UINT 13 /* unsigned int */ #define V_ULONG 14 /* unsigned long */ /* Variable classes */ #define VC_SIMPLE 0 /* simple (un-dimentioned) variable */ #define VC_ARRAY1 1 /* single dim. array */ #define VC_ARRAY2 2 /* multiple dim. array */ #define VC_POINTER 3 /* pointer */ #define VC_ARRAYP 4 /* array of pointers */ /* Expression types */ #define E_EMPTY 0 /* empty expression */ #define E_CONST 1 /* numeric constant */ #define E_VAR 2 /* variable */ #define E_FUNC 3 /* function */ #define E_STRING 4 /* ptr to string consatant */ #define E_UNOP 5 /* unary operator: OP expr (-, +, or !) */ #define E_BINOP 6 /* binary operator: expr OP expr */ #define E_ASGNOP 7 /* assign operatro: (=, +=, *=, etc.) */ #define E_PAREN 8 /* parenthesis around an expression */ #define E_SUBSCR 9 /* subscript */ #define E_TEXT 10 /* C code or other text to be inserted */ #define E_STMT 11 /* simple statement */ #define E_CMPND 12 /* begin compound statement: {...} */ #define E_IF 13 /* if statement */ #define E_ELSE 14 /* if statement */ #define E_WHILE 15 /* while statement */ #define E_SS 16 /* state set statement */ #define E_STATE 17 /* state statement */ #define E_WHEN 18 /* when statement */ #define E_FOR 19 /* for statement */ #define E_X 20 /* eXpansion (e.g. for(;;) */ #define E_PRE 21 /* ++expr or --expr */ #define E_POST 22 /* expr++ or expr-- */ #define E_BREAK 23 /* break stmt */ #define E_COMMA 24 /* expr , expr */