%{ #include #include #include #include "data.h" extern int yyline, yycolumn; extern TAO gloTao; LINK *ptrLink; char *tmp; %} /* %union { int intg; char * str; } */ %token BTAO ETAO BTNAME ETNAME BTTYPE ETTYPE IMAGE TEXT AUDIO MOTION VIDEO MIXED BTTPL ETTPL BTLINK ETLINK EQUAL LNAME LTYPE LOBJ SPATIAL TEMPORAL STRUCTURAL BTIC ETIC BTSENS ETSENS LOCATION CONTENT TIME QUOTES COMMA BTREL ETREL NORMAL OLD NEW FLAG ICTYPE ICIDLIST MSGTYPE QMARK ICINPUT CGI BTDB ETDB DBHERE BTTPLIN ETTPLIN INPBOXPAR RADIOPAR CHKBOXPAR SKIPPAR %token STRING %type taotype sensi linktype flag_value %% /* yacc specifications */ taodef : BTAO { ptrLink = NULL; gloTao.TName = NULL; gloTao.TType = 0; gloTao.TTpl = NULL; gloTao.TTpl_in = NULL; gloTao.TLink = NULL; gloTao.TIC = NULL; gloTao.TSens = 0; } taglist ETAO ; taglist : tag | taglist tag ; tag : BTNAME STRING { if ($2) { gloTao.TName = (char *) malloc((strlen($2)+1)*sizeof(char)); strcpy(gloTao.TName, $2); } } ETNAME | BTTYPE taotype ETTYPE { gloTao.TType = $2; } | BTTPL STRING { if ($2) { gloTao.TTpl = (char *)malloc((strlen($2)+1)*sizeof(char)); strcpy(gloTao.TTpl, $2); } } ETTPL | BTTPLIN STRING { if ($2) { gloTao.TTpl_in = (char *)malloc((strlen($2)+1)*sizeof(char)); strcpy(gloTao.TTpl_in, $2); } } ETTPLIN | BTLINK { ptrLink = (LINK *)malloc(sizeof(LINK)); } linkdef ETLINK { ptrLink->next = gloTao.TLink; gloTao.TLink = ptrLink; ptrLink = NULL; } | BTDB STRING { if ($2) { gloTao.DB_access = strdup($2); } } ETDB | BTIC { gloTao.TIC = (IC *)malloc(sizeof(IC)); } icspec ETIC | BTSENS sensi ETSENS { gloTao.TSens = $2; } ; icspec : specify | icspec specify | icspec COMMA specify ; specify : FLAG EQUAL flag_value { gloTao.TIC->Flag = $3; gloTao.TIC->flag = NULL; /* printf("flag=%d\n", gloTao.TIC->Flag); */ } | FLAG EQUAL qm_str { gloTao.TIC->Flag = EMPTY_FLAG; gloTao.TIC->flag = tmp; /* printf("flag=%d\n", gloTao.TIC->Flag); */ } | ICTYPE EQUAL STRING { gloTao.TIC->IC_type = (char *)malloc((strlen($3)+1)*sizeof(char)); strcpy(gloTao.TIC->IC_type, $3); /* printf("ic_type = %s\n", gloTao.TIC->IC_type); */ } | ICTYPE EQUAL qm_str { gloTao.TIC->IC_type = tmp; /* printf("ic_type = NULL\n"); */ } | ICIDLIST EQUAL STRING { gloTao.TIC->ID_list = (char *)malloc(sizeof(char)*(1+strlen($3))); strcpy(gloTao.TIC->ID_list, $3); /* printf("ic_id_list = %s\n", gloTao.TIC->ID_list); */ } | ICIDLIST EQUAL qm_str { gloTao.TIC->ID_list = tmp; /* printf("ic_id_list = NULL\n"); */ } | MSGTYPE EQUAL STRING { gloTao.TIC->Msg_type = (char *)malloc(sizeof(char)*(1+strlen($3))); strcpy(gloTao.TIC->Msg_type, $3); /* printf("msg_type=%s\n", gloTao.TIC->Msg_type); */ } | MSGTYPE EQUAL qm_str { gloTao.TIC->Msg_type = tmp; /* printf("msg_type=NULL\n"); */ } | CONTENT EQUAL STRING { gloTao.TIC->Content = (char *)malloc(sizeof(char)*(1+strlen($3))); strcpy(gloTao.TIC->Content, $3); /* printf("Content=%s\n", gloTao.TIC->Content); */ } | CONTENT EQUAL qm_str { gloTao.TIC->Content = tmp; /* printf("Content=NULL\n"); */ } | CGI EQUAL STRING { if (strlen($3) == 0) { gloTao.TIC->cgi = NULL; /* printf("cgi=NULL\n"); */ } else { gloTao.TIC->cgi = (char *)malloc(sizeof(char)*(1+strlen($3))); strcpy(gloTao.TIC->cgi, $3); /* printf("cgi = %s\n", gloTao.TIC->cgi); */ } } | CGI EQUAL qm_str { gloTao.TIC->cgi = tmp; /* printf("cgi=NULL\n"); */ } ; qm_str : QMARK STRING { tmp = (char *)malloc(sizeof(char)*(2+strlen($2))); strcpy(tmp, "?"); strcat(tmp, $2); } | QMARK { tmp = NULL; } ; flag_value : OLD { $$ = OLD_FLAG; } | NEW { $$ = NEW_FLAG; } ; taotype : IMAGE { $$ = IMAGE_TYPE; } | TEXT { $$ = TEXT_TYPE ; } | AUDIO { $$ = AUDIO_TYPE; } | MOTION { $$ = MOTION_TYPE; } | VIDEO { $$ = VIDEO_TYPE; } | MIXED { $$ = MIXED_TYPE; } ; sensi : LOCATION { $$ = LOCATION_SENSI; } | CONTENT { $$ = CONTENT_SENSI; } | TIME { $$ = TIME_SENSI; } ; linkdef : sdef | linkdef COMMA sdef ; sdef : LNAME EQUAL STRING { ptrLink->LName = (char *)malloc(sizeof(char)*(1+strlen($3))); strcpy(ptrLink->LName, $3); } | LTYPE EQUAL linktype { ptrLink->LType = $3; } | LOBJ EQUAL STRING { ptrLink->LObj = (char *)malloc(sizeof(char)*(1+strlen($3))); strcpy(ptrLink->LObj, $3); } ; linktype : SPATIAL { $$ = SPATIAL_LINK; } | TEMPORAL { $$ = TEMPORAL_LINK; } | STRUCTURAL { $$ = STRUCTURAL_LINK; } ; %% yyerror(str) char *str; { printf("Syntax Error -- Line:%d, Column:%d -- %s\n", yyline, yycolumn, str); }