%{
#include <stdio.h>
extern double sqrt(double);
%}
%union {
   double real; 
   int    integer;
  }
%token  SQRT 
%token  <integer> INTEGER
%token  REAL

%type <integer> iexpr
%left '+' '-'
%left '*' '/'
%left UMINUS

%%
lines:
        | lines line
        ;

line: '\n'
     | iexpr '\n'
         { printf("\tinvokevirtual void java.io.PrintStream.println(int)\n return\n }\n}\n"); }

     ;
iexpr:  INTEGER { printf("\tldc\t%d\n",$1);}
      | iexpr '+' iexpr  
{ printf ("\tiadd\n"); }
      | iexpr '*' iexpr  
{ printf("\timul\n"); }
      | iexpr '-' iexpr  
{ printf("\tisub\n"); }
      | '-' iexpr %prec UMINUS
{printf("\tineg\n");}
      | iexpr '/' iexpr  
{if ($3 ==0) { fprintf(stderr, " divide by  0\n");}
     else printf("\tidiv\n");}
| '(' iexpr ')' { $$=$2;}
      ;

%%
int lineno;
main()
{  printf("class HelloWorld\n{ \n  method public static void main (java.lang.String[])\n    max_stack 2\n    max_locals 1\n  { \n	int i\n    getstatic java.io.PrintStream java.lang.System.out\n");

   yyparse();
 }
yyerror(s)
char *s;
{ fprintf(stderr, "line no. %d \n", lineno);
}
