%{ char temp[40]; int i, j; int var_counter=0; void reset_var_table(); void extract_agent_name(char *yytext); int lookup_term(char *yytext); int lookup_var(char *yytext); %} S [ ]* A [a-z][A-Za-z0-9_]*[@]*[A-Za-z0-9_]* V [A-Z][A-Za-z0-9_]* D [0-9]+ %% \%[^\n]*\n ; "\n" ; "\t" ; {S} ; agent_name"(" {yyless(yyleng -1); return(P_MODULE);} abducible"(" {yyless(yyleng -1); return(P_ABDUCIBLE);} recursive"(" {yyless(yyleng -1); return(P_RECURSIVE);} "-"> return(P_FORWARD); "-": return(P_D_FORWARD); \<{S}"-" return(P_BACKWARD); :"-" return(P_DIRECT); {V} { yylval.ival = lookup_var(yytext); return(P_VARIABLE); } {A} { yylval.ival = lookup_term(yytext); return(P_ATOM); } \, return(P_COMMA); \. { yylval.ival = var_counter; reset_var_table(); return(P_PERIOD); } '[^']*' { j = 0; for(i=1; iname,string)!=0) i++; if (i= max_sym_size -1){ /* Increase the size of the symbole table.*/ temp = realloc((void *)sym_table, sizeof(functor *)* (max_sym_size + BLOCK_SIZE)); if(temp == NULL) {printf("Unable to increase the symbol table.\n"); exit(1);} max_sym_size += BLOCK_SIZE; sym_table = (functor **)temp; } sym_table[term_counter] = (functor *) my_alloc(sizeof(functor)); strcpy(sym_table[term_counter]->name, yytext); sym_table[term_counter]->type = 'N'; sym_table[term_counter]->agent_ref = NULL; i = term_counter++; } return(i); } /***************************************************/ /* Look for the string in the table. */ /* Insert if not found */ /***************************************************/ int lookup_var(char *yytext) { int i=0; int found =0; while((i< var_counter) && !found) if(strcmp(var_table[i], yytext) == 0) found = 1; else i++; if(!found){ var_table[var_counter] = (char *)my_alloc(20*sizeof(char)); strcpy(var_table[var_counter], yytext); i = var_counter++; } return(i); }