Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- extern int yyline;
- int yylex();
- //int yydebug = 1;
- typedef struct proizvodMetaItem {
- char naziv[100];
- float vrednost;
- } PROIZVOD_META_ITEM;
- typedef struct ocenaMetaItem {
- char nazivProizvoda[100];
- char kriterijum[100];
- float ocena;
- } OCENA_META;
- typedef struct proizvodMeta {
- char naziv[100];
- PROIZVOD_META_ITEM items[100];
- int totalItems;
- } PROIZVOD_META;
- PROIZVOD_META proizvodi[100];
- OCENA_META ocene[100];
- int rbProizvoda = 0;
- int rbKriterijuma = 0;
- int rbOcene = 0;
- int globalIndexProizvoda = 0;
- void handleProizvod(char *naziv)
- {
- strcpy(proizvodi[rbProizvoda].naziv, naziv);
- rbProizvoda++;
- rbKriterijuma = 0;
- }
- void handleDetaljiProizvoda(char *nazivKriterijuma, float vrednostKriterijuma)
- {
- strcpy(proizvodi[rbProizvoda].items[rbKriterijuma].naziv, nazivKriterijuma);
- proizvodi[rbProizvoda].items[rbKriterijuma].vrednost = vrednostKriterijuma;
- rbKriterijuma++;
- proizvodi[rbProizvoda].totalItems = rbKriterijuma;
- }
- void handleKomentar(char *s)
- {
- for(int i = 0; i < rbProizvoda; i++)
- {
- if (strcmp(proizvodi[i].naziv, s) == 0)
- {
- globalIndexProizvoda = i;
- }
- }
- }
- void handleOcena(char *kriterijum, float ocena)
- {
- strcpy(ocene[rbOcene].nazivProizvoda, proizvodi[globalIndexProizvoda].naziv);
- strcpy(ocene[rbOcene].kriterijum, kriterijum);
- ocene[rbOcene].ocena = ocena;
- rbOcene++;
- }
- float getProsecnaOcena(char *nazivProizvoda, char *nazivKriterijuma, float vaznostKriterijuma)
- {
- float brOcena = 0;
- float sumaOcena = 0;
- for (int i = 0; i < rbOcene; i++)
- {
- if (strcmp(nazivProizvoda, ocene[i].nazivProizvoda) == 0 && strcmp(nazivKriterijuma, ocene[i].kriterijum) == 0)
- {
- sumaOcena += ocene[i].ocena;
- brOcena++;
- }
- }
- return vaznostKriterijuma / brOcena * sumaOcena;
- }
- %}
- %union {
- int cocena;
- char ctekst[100];
- float ckriterijum;
- }
- %token <cocena> OCENA <ctekst> TEKST <ckriterijum> KRITERIJUM TARABE PR
- %start program
- %%
- program : proizvodi TARABE komentari
- proizvodi : proizvod proizvodi | proizvod
- proizvod : TEKST ':' '(' detaljiproizvoda ')' { handleProizvod($1); }
- detaljiproizvoda
- : TEKST ':' KRITERIJUM ',' detaljiproizvoda { handleDetaljiProizvoda($1, $3); }
- | TEKST ':' KRITERIJUM { handleDetaljiProizvoda($1, $3); }
- komentari : komentar komentari | komentar
- komentar: PR TEKST ',' TEKST ':' TEKST ':' detaljiKomentara { handleKomentar($6); }
- detaljiKomentara
- : TEKST OCENA ',' detaljiKomentara { handleOcena($1, $2); }
- | TEKST OCENA { handleOcena($1, $2); }
- %%
- int yyerror(char *s) {
- printf("Greska %s na liniji %d\n", s, yyline + 1);
- }
- int main(void) {
- if (yyparse() == 0) {
- printf("Parsiranje uspesno!\n");
- }
- else {
- printf("Parsiranje nije uspesno!\n");
- }
- for (int i = 0; i < rbProizvoda; i++)
- {
- printf("Tip proizvoda %s kriterijumi:\n", proizvodi[i].naziv);
- for (int j = 0; j < proizvodi[i].totalItems; j++)
- {
- printf("kriterijum: %s, prosecna ocena %f\n",
- proizvodi[i].items[j].naziv,
- getProsecnaOcena(proizvodi[i].naziv, proizvodi[i].items[j].naziv, proizvodi[i].items[j].vrednost));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement