%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int yyline;
int yylex();
int yydebug=1;
struct kriterijum
	{
	char naziv[100];
	float tezina;
	float suma_ocena;
	int num_ocena;
	};
struct proizvod
	{
	char naziv[100];
	int br_kriterijuma;
	struct kriterijum kriterijumi[100];
	};

int br_proizvoda=0;
struct proizvod proizvodi[100];
struct kriterijum pom_krit[100];
int br_pom_krit=0;

%}
%union 
	{
	char string[100];
	float broj;
	}
%token<string> SEP STR BR OZN PR TIP TZN
%type<broj> ocena
%%
program: spisak SEP ocene

spisak : spisak opis | opis
opis : STR ':' '(' lista ')'
	{
		strcpy(proizvodi[br_proizvoda].naziv,$1);
		
		br_proizvoda++;
	}
lista: kriterijum ',' lista| kriterijum
kriterijum: STR ':' TZN
			{
				int br = proizvodi[br_proizvoda].br_kriterijuma;
				strcpy(proizvodi[br_proizvoda].kriterijumi[br].naziv,$1);
				proizvodi[br_proizvoda].kriterijumi[br].tezina = atof($3);
				proizvodi[br_proizvoda].br_kriterijuma+=1;
			}

ocene: ocena ocene | ocena
ocena: PR ':' STR ',' TIP ':' STR ':' lista_ocena
	{	
			int i,j,k;
			for (i=0; i<br_proizvoda;i++)
				if (strcmp(proizvodi[i].naziv,$7)==0) break;
			for (j=0;j<br_pom_krit;j++)
				for (k=0;k<proizvodi[i].br_kriterijuma;k++)
				{
					
					if (strcmp(pom_krit[j].naziv,proizvodi[i].kriterijumi[k].naziv)==0)
						{
						//printf("Dodajem tezinu  %f\n",pom_krit[j].tezina);
						proizvodi[i].kriterijumi[k].suma_ocena+=pom_krit[j].tezina;
						
						proizvodi[i].kriterijumi[k].num_ocena++;
						}
				}
			br_pom_krit=0;
	
	}
lista_ocena: korsnik_ocena ',' lista_ocena | korsnik_ocena
korsnik_ocena: STR OZN
	{
		
		strcpy(pom_krit[br_pom_krit].naziv,$1);
		float tez;
		if ($2[0]=='*') tez=3;
		if ($2[0]=='+') tez=2;
		if ($2[0]=='-') tez=1;
		if ($2[0]=='?') tez=0;
		
		pom_krit[br_pom_krit].tezina = tez;
		br_pom_krit++;
	}

%%



int yyerror(char *message){
	if(strcmp(message,"syntax error")==0) printf("sintaksna greska na liniji %d\n",yyline);
	else printf("greska"); 

}
int main(int argc, char *argv[]){
	yyline=1;
	extern FILE *yyin;
	int i,j;
	yyin=fopen("proizvodi.txt","r");
	if(yyparse()==0) 
	{
		printf("parsiranje uspesno\n");
		for (i=0;i<br_proizvoda;i++)
			{
			printf("Tip proizvoda %s kriterijumi : \n",proizvodi[i].naziv);
			for(j=0;j<proizvodi[i].br_kriterijuma;j++)
			printf("kriterijum: %s, prosecna ocena %f \n",proizvodi[i].kriterijumi[j].naziv,proizvodi[i].kriterijumi[j].suma_ocena*proizvodi[i].kriterijumi[j].tezina/proizvodi[i].kriterijumi[j].num_ocena);
			}
	}
			
	else printf("parsiranje neuspesno\n");

}
