	/* YACC - GERADOR DE ANALISE SINTATICA */

%{

#include "lex.yy.c" 
#include <stdio.h>
struct pilha *nova_pilha=NULL;
struct pilha *pl=NULL, *aux; /*struct list_regras *list=NULL;  */

%}

%token se senao para ate faca enquanto variavel constante entao e ou maior que 
       igual menor diferente recebe mais menos vezes a null vazio de nao existe

%start comando
%%
comando	:
            se condicao acao acao_se { pl=(struct pilha *)ins_acoes(pl,cabeca); puts("acabei!!! - if"); }  	
          | se condicao acao acao_se senao acao_senao { puts("if/else"); pl=(struct pilha *)ins_acoes(pl,cabeca); puts("acabei!!! - if / else"); }
          | para condicao ate condicao acao acao_se { pl=(struct pilha *)ins_acoes(pl,cabeca); }     
          | enquanto condicao acao acao_se { pl=(struct pilha *)ins_acoes(pl,cabeca);  puts("while");} 	      
	  ;
/*          | acao acao_se enquanto condicao { pl=(struct pilha *)ins_acoes(pl,cabeca); } 	                               
         ;
*/

condicao :
	   expressao{  printf("estou na expressao\n"); }
         ;

expressao :
	    operando {  printf("estou no operando_1\n"); }
	  | operando op_comp expressao {  printf("estou no operando_2\n");}
	  | operando operador expressao {}
	  ;

operando :
	   variavel {  aux=pl; while(aux) { printf("aux %d\n",aux->i); aux=aux->prox; /*getchar();*/} pl=(struct pilha *)push(pl,yytext,1); }
	 | constante { pl=(struct pilha *)push(pl,yytext,1); }
	 ;

acao :
       entao { aux=pl; while(aux) { printf("aux %d\n",aux->i); aux=aux->prox; } pl=(struct pilha *)ins_lista(pl); conteudo(cabeca); /*getchar();*/ }
     | faca { aux=pl; while(aux) { printf("aux %d\n",aux->i); aux=aux->prox; } pl=(struct pilha *) ins_lista(pl); conteudo(cabeca); /*getchar();*/ }
     ;

acao_se :
	  comando { printf("estou na acao_se/comando\n"); }
	| comando_atribuicao { printf("estou na acao_se/comando_atribuicao\n"); }
        ;

acao_senao :
	     comando { printf("estou na acao_senao/comando\n"); }
	   | comando_atribuicao { printf("estou na acao_senao/comando_atribuicao\n"); }
	   ;

op_comp :
	 op_relacional { printf("estou no operador relacional\n"); } 
       | op_logico { printf("estou no operador logico\n"); }	  
    	;

op_relacional:
    	       maior que  { pl=(struct pilha *)push(pl,"maiorque",2); }
	     | maior ou igual { pl=(struct pilha *)push(pl,"maiorouigual",2); }
	     | menor que { pl=(struct pilha *)push(pl,"menorque",2); }
	     | menor ou igual { pl=(struct pilha *)push(pl,"menorouigual",2); }
	     | igual { pl=(struct pilha *)push(pl,"igual",2); } 
             | igual a { pl=(struct pilha *)push(pl,"iguala",2); }
	     | igual a null { pl=(struct pilha *)push(pl,"igualanull",2); }           
             | igual a vazio { pl=(struct pilha *)push(pl,"igualavazio",2); } 
             | diferente de { pl=(struct pilha *)push(pl,"diferentede",2); } 
	     | diferente de null { pl=(struct pilha *)push(pl,"diferentedenull",2); }
             | diferente de vazio { pl=(struct pilha *)push(pl,"diferentedevazio",2); }
              ;

op_logico:
	   e { pl=(struct pilha *)push(pl,"e",2); }
	 | ou { pl=(struct pilha *)push(pl,"ou",2); }
	 | nao { printf("estou no nao\n"); }
	 | nao existe { printf("estou no nao existe\n"); }
         ;
	
comando_atribuicao :
	             operando recebe operacao { printf("estou no operando recebe operando\n"); } 
	           ;


operacao :
	   operando { printf("estou no operando/operacao\n"); }
	 | operando operador operacao { printf("estou no operando operador operacao\n"); }
         ;

operador :
 	  mais { pl=(struct pilha *)push(pl,"mais",2); }
 	| menos { pl=(struct pilha *)push(pl,"menos",2); }
	| vezes { pl=(struct pilha *)push(pl,"vezes",2); }
	/*| divide { printf("estou no divide\n");*/
	;            
%%

/* As funcoes push(), ins_acoes() e ins_lista() estao definidas separadamente */

void yyerror(char *msg)
 {
 }	

