/* Zamiana wyrazen z liczbami trojkowymi na notacje odwrotna polska.
 * Kolejnosc przetwarzania:
 *  (1) bison odwrotna_polska.y
 *  (2) gcc -Wall -o odwrotna_polska odwrotna_polska.tab.c
 * Wywolanie:
 *      ./odwrotna_polska
 */
     
%{

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


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


  int  yylex (void) {
    int zn;
    do {
      zn = getchar();
    }  while (isspace(zn));
    if (zn == '0' ||
        zn == '1' ||
        zn == '2' ||
        zn == '3' ||
        zn == '4' ||
        zn == '5' ||
        zn == '6' ||
        zn == '7' ||
        zn == '8' ||
        zn == '9' ||
        zn == '+' ||
        zn == '*' ||
        zn == '(' ||
        zn == ')' ||
        zn == ';'
       )
      return zn;
    else {
      yyerror("dopuszczalne znaki: cyfry, '+', '*', '(, ')' oraz ';'");
      return -1;
    }
  }

%}

%%

    /* Gramatyka: */

Calosc  :  Wyrazenie ';'      { printf("\n\n");  exit(0); }
;

Wyrazenie  :  Liczba                           { printf(" %i", $1); }
           |  '(' Wyrazenie '+' Wyrazenie ')'  { printf(" +"); }
           |  '(' Wyrazenie '*' Wyrazenie ')'  { printf(" *"); }
;

Liczba  :  Cyfra           { $$ = $1; }
        |  Liczba Cyfra    { $$ = $1*10 + $2; }
;

Cyfra  :  '0'              { $$ = 0; }
       |  '1'              { $$ = 1; }
       |  '2'              { $$ = 2; }
       |  '3'              { $$ = 3; }
       |  '4'              { $$ = 4; }
       |  '5'              { $$ = 5; }
       |  '6'              { $$ = 6; }
       |  '7'              { $$ = 7; }
       |  '8'              { $$ = 8; }
       |  '9'              { $$ = 9; }
;

%%

/****************************************************/

int  main () {

  printf("\n wyrazenie: ");
  return  yyparse();

}
