/* SPRAWDZANIE TYPU KOMENDY PRZYPISANIA
 * Kolejnosc przetwarzania:
 *  (1) bison 2-typy.y
 *  (2) gcc -Wall 2-typy.tab.c
 * Wywolanie:
 *      ./a.out
 */
     
%{
//==============================================
// DEKLARACJE:

 #include <stdio.h>
 #include <stdlib.h>
 #include <ctype.h>

 void  yyerror (char s[]) {
   // wywolywane przez  yyparse  w razie bledu
   printf ("\n!!! %s\n\n", s);
 }

 int  yylex (void) {
   int zn;
   do  { zn = getchar(); }  while (isspace(zn));
   return  zn;
 }

%}

%%

//==============================================
// GRAMATYKA:

assign:  var ':''=' expr ';'
  { if ($1 == $4) {
      printf("\n PRZYPISANIE TYPU '%c'\n\n", $1);
      exit(0);
    }
    else {
      printf("\n  BLAD TYPU:  %c:=%c;\n\n", $1, $4);
      exit(1);
    }
  } ;

expr:  var          { $$ = $1; }
    |  var '+' var  { if ($1 == 'i' && $3 == 'i')  $$ = 'i';
                      else  $$ = 'r';
		    } ;

var:  'a'  { $$ = 'r'; }
   |  'b'  { $$ = 'i'; }
   |  'c'  { $$ = 'i'; } ;

%%

//==============================================
// INICJALIZACJE I WYWOLANIE:

int main (void) {
  printf("\n  TYPOWANIE PRZYPISANIA.  NAPISZ PRZYPISANIE W POSTACI");
  printf("\n    <zmienna> := <zmienna> ;   LUB");
  printf("\n    <zmienna> := <zmienna> + <zmienna> ;");
  printf("\n  DOSTEPNE ZMIENNE:");
  printf("\n    a TYPU 'r'");
  printf("\n    b TYPU 'i'");
  printf("\n    c TYPU 'i'\n\n");
  return yyparse ();
}
