Advertisement
bokunda

yacc.c

May 24th, 2024
670
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.69 KB | None | 0 0
  1. %{
  2.     #include <stdio.h>
  3.     #include <stdlib.h>
  4.     #include <string.h>
  5.  
  6.     extern int yyline;
  7.     int yylex();
  8.     //int yydebug = 1;
  9.  
  10.     typedef struct proizvodMetaItem {
  11.         char naziv[100];
  12.         float vrednost;
  13.     } PROIZVOD_META_ITEM;
  14.  
  15.     typedef struct ocenaMetaItem {
  16.         char nazivProizvoda[100];
  17.         char kriterijum[100];
  18.         float ocena;
  19.     } OCENA_META;
  20.  
  21.     typedef struct proizvodMeta {
  22.         char naziv[100];
  23.         PROIZVOD_META_ITEM items[100];
  24.         int totalItems;
  25.     } PROIZVOD_META;
  26.  
  27.     PROIZVOD_META proizvodi[100];
  28.     OCENA_META ocene[100];
  29.  
  30.     int rbProizvoda = 0;
  31.     int rbKriterijuma = 0;
  32.     int rbOcene = 0;    
  33.     int globalIndexProizvoda = 0;
  34.  
  35.     void handleProizvod(char *naziv)
  36.     {
  37.         strcpy(proizvodi[rbProizvoda].naziv, naziv);
  38.         rbProizvoda++;
  39.         rbKriterijuma = 0;
  40.     }
  41.  
  42.     void handleDetaljiProizvoda(char *nazivKriterijuma, float vrednostKriterijuma)
  43.     {
  44.         strcpy(proizvodi[rbProizvoda].items[rbKriterijuma].naziv, nazivKriterijuma);
  45.         proizvodi[rbProizvoda].items[rbKriterijuma].vrednost = vrednostKriterijuma;
  46.  
  47.         rbKriterijuma++;
  48.         proizvodi[rbProizvoda].totalItems = rbKriterijuma;
  49.     }
  50.  
  51.     void handleKomentar(char *s)
  52.     {
  53.         for(int i = 0; i < rbProizvoda; i++)
  54.         {
  55.             if (strcmp(proizvodi[i].naziv, s) == 0)
  56.             {
  57.                 globalIndexProizvoda = i;
  58.             }
  59.         }
  60.     }
  61.  
  62.     void handleOcena(char *kriterijum, float ocena)
  63.     {
  64.         strcpy(ocene[rbOcene].nazivProizvoda, proizvodi[globalIndexProizvoda].naziv);
  65.         strcpy(ocene[rbOcene].kriterijum, kriterijum);
  66.         ocene[rbOcene].ocena = ocena;
  67.  
  68.         rbOcene++;
  69.     }
  70.  
  71.     float getProsecnaOcena(char *nazivProizvoda, char *nazivKriterijuma, float vaznostKriterijuma)
  72.     {
  73.         float brOcena = 0;
  74.         float sumaOcena = 0;
  75.         for (int i = 0; i < rbOcene; i++)
  76.         {
  77.             if (strcmp(nazivProizvoda, ocene[i].nazivProizvoda) == 0 && strcmp(nazivKriterijuma, ocene[i].kriterijum) == 0)
  78.             {
  79.                 sumaOcena += ocene[i].ocena;
  80.                 brOcena++;
  81.             }
  82.         }
  83.  
  84.         return vaznostKriterijuma / brOcena * sumaOcena;
  85.     }
  86. %}
  87.  
  88. %union {
  89.     int cocena;
  90.     char ctekst[100];
  91.     float ckriterijum;
  92. }
  93.  
  94. %token <cocena> OCENA <ctekst> TEKST <ckriterijum> KRITERIJUM TARABE PR
  95. %start program
  96.  
  97. %%
  98.  
  99. program : proizvodi TARABE komentari
  100. proizvodi : proizvod proizvodi | proizvod
  101. proizvod : TEKST ':' '(' detaljiproizvoda ')' { handleProizvod($1); }
  102. detaljiproizvoda
  103.     : TEKST ':' KRITERIJUM ',' detaljiproizvoda { handleDetaljiProizvoda($1, $3); }
  104.     | TEKST ':' KRITERIJUM { handleDetaljiProizvoda($1, $3); }
  105. komentari : komentar komentari | komentar
  106. komentar: PR TEKST ',' TEKST ':' TEKST ':' detaljiKomentara { handleKomentar($6); }
  107. detaljiKomentara
  108.     : TEKST OCENA ',' detaljiKomentara { handleOcena($1, $2); }
  109.     | TEKST OCENA { handleOcena($1, $2); }
  110.  
  111. %%
  112.  
  113.  
  114.  
  115. int yyerror(char *s) {
  116.     printf("Greska %s na liniji %d\n", s, yyline + 1);
  117. }
  118.  
  119. int main(void) {
  120.  
  121.     if (yyparse() == 0) {
  122.         printf("Parsiranje uspesno!\n");
  123.     }
  124.     else {
  125.         printf("Parsiranje nije uspesno!\n");
  126.     }
  127.  
  128.     for (int i = 0; i < rbProizvoda; i++)
  129.     {
  130.         printf("Tip proizvoda %s kriterijumi:\n", proizvodi[i].naziv);
  131.         for (int j = 0; j < proizvodi[i].totalItems; j++)
  132.         {
  133.             printf("kriterijum: %s, prosecna ocena %f\n",
  134.                 proizvodi[i].items[j].naziv,
  135.                 getProsecnaOcena(proizvodi[i].naziv, proizvodi[i].items[j].naziv, proizvodi[i].items[j].vrednost));
  136.         }
  137.     }
  138.  
  139.     return 0;
  140. }
Tags: YACC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement