void comando_repetitivo(void)
{
	//Verifica se o proximo token й um WHILE
	if((tk.cat == PR) && (tk.p_reservada == WHILE)){
		tk = analex();
		//Verifica se o proximo token й '('
		if((tk.cat == SN) && (tk.cod == OPP)){
			tk = analex();
			expressao();
			//Verifica se o proximo token й um ')'
			if((tk.cat == SN) && (tk.cod == CLP)){
				tk = analex();
				//Verifica se o proximo token й '{'
				if((tk.cat == SN) && (tk.cod == OPB)){
					tk = analex();
					comando();
					//Verifica se o proximo token й '}'
					if((tk.cat == SN) && (tk.cod == CLB)){
						tk = analex();
						comando();
					} else erro(lin, 5);//Chama erro caso nгo venha '}'
					
				} else erro(lin, 4); //chama erro caso nгo venha '{'
				
			} else erro(lin, 3); //Chama erro caso nгo venha ')'
			
		} else erro(lin, 2);//Chama erro caso nгo venha '('
	}
}
void comando(void)
{
        
	atribuicao();	    

	chamada_de_funcao2(); //Verificar a possibilidade de testar diretamente em comando...para evitar erros.
	 
	comando_condicional();
	 
	comando_repetitivo();
	

	
	//Verifica se o proximo token й GET
    if((tk.cat == PR) && (tk.p_reservada == GET)){
		tk = analex();
		//Verifica se o proximo token й '('
		if((tk.cat == SN) && (tk.cod == OPP)){
			tk = analex();
			if(tk.cat == ID){               
				tk = analex();
				
				if((tk.cat == SN) && (tk.cod == CLP)){
					tk = analex();
					
					if((tk.cat == SN) && (tk.cod == SMC)){               
   					tk = analex();
   					comando();
					} else erro(lin, 8); //Chama erro caso nгo venha ';'
					
				} else erro(lin, 3); //Chama erro caso nгo venha ')'
				
			} else erro(lin, 1);
			
		} else erro(lin, 2);		
	}
	
	else if((tk.cat == PR) && (tk.p_reservada == PUT)){
		tk = analex();
		if((tk.cat == SN) && (tk.cod == OPP)){
			tk = analex();
			literal();
			expressao_simples();
			//Verifica se o proximo token й um ')'
			if((tk.cat == SN) && (tk.cod == CLP)){
				tk = analex();
				if((tk.cat == SN) && (tk.cod == SMC)){
					tk = analex();
					comando();
				} else erro(lin, 8); //Chama erro caso nгo venha ';'
				
			} else erro(lin, 3); //Chama erro caso nгo venha ')'
			
		} else erro(lin, 2);//Chama erro caso nгo venha '('
		
	}else	if((tk.cat == SN) && (tk.cod == SMC)){
        tk = analex();
        comando();     
   }
}
void declaracao_funcao_principal(void)
{
     
	if ((tk.cat == PR) && (tk.p_reservada == MAIN)){
		tk = analex();
		
		novo.escopo = escopo;
        novo.classe = FUNC;
        strcpy(novo.lexema, "main");            
        insere_simbolo(novo); 
		
		
		
		escopo = LO; 
		//Verificando se o token й um '{'
		if((tk.cat == SN) && (tk.cod == OPB)){
			tk = analex();
			bloco_de_funcao();
			//verifica se o proximo tken й um '}'
			if((tk.cat == SN) && (tk.cod == CLB)){  
  	             printf("Tabela Declaracao Final \n\n");
	                              
				exit(0);//Finaliza a execuзгo do programa
			} else erro(lin, 5); //Chama mensagem de erro caso nгo venha '}'			
			
		} else erro(lin, 4); //Chama mesangem de erro caso nгo venha um '{' 		
		
	} else erro(lin, 6); // Chama uma mensagem de erro caso nгo venha o MAIN	
}
void literal(void)
{
   if(tk.cat == CTL){
       tk = analex();                
   }
   else if(tk.cat == CTS){
       tk = analex();     
   }
       
}
Example #5
0
int main(int argc, char **argv){
	LexemeTable *tab = new LexemeTable();
	Analex 		analex(tab);
	Anasin		anasin(tab);
	CuadrupleGenerator	cuadrupleGenerator(tab);

	if (argc != 2){
		std::cout << "Uso: " << argv[0] << " [file name]" << std::endl;
		return (-1);
	}
	// Run Analex
	analex.run(argv[1]);
	// Write Symbol Table
	std::cout << std::endl << "Tabla de simbolos escrita en symbolTable.txt" << std::endl;
	tab->writeToFile();
	/*	Run Anasin 	*/
	if(anasin.run(tab)){
		std::cout << "Gramática Aceptada" << std::endl;
		cuadrupleGenerator.run(tab);
		cuadrupleGenerator.writeToFile();
		cuadrupleGenerator.printCuadruples();
	}else{
		std::cout << "Gramática Denegada" << std::endl;
	}
	std::cout << std::endl;
	return (0);
}
Example #6
0
int main(){			/* Construction de l'AFD */
  int j;			/* jeton retourne par analex() */
  char *invite="Saisissez un mot reconnu par l'automate, suivi de EOF (CTRL-D) : ";
  creerAfd();			/* Construction de l'AFD a jeton */
  printf("%s",invite);		/* prompt */
  while((j=analex())){		/* analyser tq pas jeton 0 */
    printf("\nRésultat : Jeton = %d ; Lexeme = %s\n%s",j,lexeme,invite);
  }
  return 0;
}
void bloco(void)
{
	aux.sit = LIV;
	tk = analex();
	escopo = GL;
    func.sit = LIV;
   
	declaracao_variaveis(); // Como tratar se nгo houver variбvel?...	
	declaracao_funcao(); // ...Chamamos funзгo mesmo assim e tratamos lб dentro quando chamar o analex?	
	declaracao_funcao_principal();
}
void relacao(void)
{
	if(tk.cat == SN){
		if(tk.cod == GT){
			tk = analex();
			expressao();
		}
		
		else if(tk.cod == GE){
			tk = analex();
			expressao();
		} 
		
		else if(tk.cod == LT){
			tk = analex();
			expressao();
		} 
		
		else if(tk.cod == LE){
			tk = analex();
			expressao();
		} 
		
		else if(tk.cod == EQ){
			tk = analex();
			expressao();
		}

		else if(tk.cod == NE){
			tk = analex();
			expressao();
		}
	}
}
void atribuicao(void)
{
    int tipo1, tipo2;
    char id[50];
    tipo1 = tipo2 = 0;
     
	if(tk.cat == ID){
        
      strcpy(id, tk.lexema);       
		strcpy(aux.id, tk.lexema);
		tk = analex();
				
		//Verifica se o proximo token й um '='
		if((tk.cat == SN) && (tk.cod == ATB)){
                   
         tipo1 = verifica_tabela(id);      
			tk = analex();			
			tipo2 = expressao();
			
			if(tipo1 != tipo2){
                
              erro(lin, 12);           
            }
         			
			//Verifica se o proximo token й um ';'
			if((tk.cat == SN) && (tk.cod == SMC)){
				tk = analex();
			             			
				comando();
				
			} else erro(lin, 8); //Chama mensagem de erro caso nгo venha um ';'
			
		} else{
			aux.sit = PEN;
		}
	}
}
Example #10
0
int fator(void)
{
  int tipo1 = 0;
  int tipo2 = 0;
  	
  if(tk.cat == CTI){
    tk = analex();
    return INT;
  }
  	   
  else if(tk.cat == CTR){
    tk = analex();
    return FLOAT;
  }
  else if(tk.cat == ID){
     tipo1 = variavel();
             
     tipo2 = chamada_de_funcao2();
     if(tipo1 != tipo2){
        return tipo1;         
     }else return tipo2;  
       
  } 
  else if((tk.cat == SN) && (tk.cod == OPP)){
       tk = analex();
       
       tipo1 = expressao_simples();
      
       if((tk.cat == SN) && (tk.cod == CLP)){                 
           tk = analex();
           return tipo1;            
       } else erro(lin, 3);
                           
  }  

}
Example #11
0
void comando_condicional(void)
{
	//Verifica se o proximo token й um IF
	if((tk.cat == PR) && (tk.p_reservada == IF)){
		tk = analex();
		//Verifica se o proximo token й um '('
		if((tk.cat == SN) && (tk.cod == OPP)){
			tk = analex();
			expressao();
			//verifica se o proximo token й um ')'
			if((tk.cat == SN) && (tk.cod == CLP)){
				tk = analex();
				//Verifica se o proximo token й um '{'
				if((tk.cat == SN) && (tk.cod == OPB)){
					tk = analex();
					comando();
					//Verifica se o proximo token й um '}'
					if((tk.cat == SN) && (tk.cod == CLB)){
						tk = analex();
						comando();
					} else erro( lin, 5); //chama erro caso nгo venha '}'
					
				} else erro(lin, 4); // chama err caso nгo venha '{'
				
			} else erro(lin, 3); // chama erro caso nгo venha ')'
			
		} else erro(lin, 2); // chama o erro caso nгo venha um '('
	
	}
	
	//Verifica se o proximo token й um ELSE
	else if((tk.cat == PR) && (tk.p_reservada == ELSE)){
		tk = analex();
		//Verifica se o proximo token й um '{'
		if((tk.cat == SN) && (tk.cod == OPB)){
			tk = analex();
			comando();
			//Verifica se o proximo token й um '}'
			if((tk.cat == SN) && (tk.cod == CLB)){
				tk = analex();
				comando();
			} else erro(lin, 5); //chama erro caso nгo venha '}'
			
		} else erro(lin, 4); //chama erro caso nгo venha '{'
	}
}
Example #12
0
int termo(void)
{
   int tipo1, tipo2;
   tipo1 = tipo2 = 0;
	tipo1 = fator();

	while((tk.cod == MUL) || (tk.cod == DIV) || (tk.cod == MOD) || (tk.cod == AND)){
      tk = analex();          
		tipo2 = fator();
		
		if(tipo1 != tipo2){
            erro(lin, 12);      
        }
	}
	
	return tipo1;
}
Example #13
0
int expressao_simples(void)
{
	int tipo1, tipo2;
   tipo1 = tipo2 = 0;
    
   tipo1 = termo();

	while((tk.cod == SUM) || (tk.cod == SUB) || (tk.cod == OR)){
     tk = analex();
             
	  tipo2 = termo();
	  
      if(tipo1 != tipo2){
          
          erro(lin, 12);        
      }	
	}
   return tipo1;	
}
Example #14
0
int variavel(void)
{
    int tipo;
    char id[50];
     
	if(tk.cat == ID){
		strcpy(aux.id, tk.lexema);
		strcpy(id, tk.lexema);
		tk = analex();
		 tipo = verifica_tabela(id);
		 //printf("Variavel %s\n",aux.id);
		// printf("tipo %d\n", tipo);
		//Verifica se o proximo token й um ';'
		if((tk.cat == SN) && (tk.cod == SMC)){
      
           	
     	}
     aux.sit = PEN; 		
   }  
   return tipo;	 	
}
Example #15
0
void chamada_de_funcao1(void)
{
	if(aux.sit == PEN){
		if((tk.cat == SN) && (tk.cod == OPP)){
			tk = analex();
			lista_de_expressoes();
			//Verifica se o proximo token й um ')'
			if((tk.cat == SN) && (tk.cod == CLP)){
				tk = analex();
				//Verifica se o proximo token й um ';'
				if((tk.cat == SN) && (tk.cod == SMC)){
					tk = analex();
					aux.sit = LIV;
					comando();
				} else erro(lin, 8); // Chmama mensagem de erro caso nгo venha ';'
			} else erro(lin, 3); // Chama mensagem de erro caso nгo venha ')'
			
		} else 	erro(lin, 2);
		
	} else {	
		if(tk.cat == ID){
			tk = analex();
			//Verifica se o procximo token й um '('
			if((tk.cat == SN) && (tk.cod == OPP)){
				tk = analex();
				lista_de_expressoes();
				//Verifica se o proximo token й um ')'
				if((tk.cat == SN) && (tk.cod == CLP)){
					tk = analex();
					//Verifica se o proximo token й um ';'
					if((tk.cat == SN) && (tk.cod == SMC)){
						tk = analex();
						comando();
					} else erro(lin, 8); // Chmama mensagem de erro caso nгo venha ';'
					
				} else erro(lin, 3); // Chama mensagem de erro caso nгo venha ')'
			}
		}
	}
}
Example #16
0
void parametros_formais(void)
{
	//Apenas declaraзгo de parametros os parenteses sгo tratados fora
	
	//Verifica se o tipo й CHAR
	if((tk.cat == PR) && (tk.p_reservada == CHAR)){
		tk = analex();
		//verifica se o proximo token й um identificador
		if(tk.cat == ID){
            
            novo.escopo = escopo;
            novo.classe = PARAM;
            novo.tipo = CHAR;
            strcpy(novo.lexema, tk.lexema);            
            insere_simbolo(novo);            
                  
			tk = analex();
		} else erro(lin, 1); //Chama uma mensagem de erro caso nгo venha um ID
	}
	
	//Verifica se o Tipo й INT
	else if((tk.cat == PR) && (tk.p_reservada == INT)){
		tk = analex();
		//verifica se o proximo token й um identificador
		if(tk.cat == ID){
                  
            novo.escopo = escopo;
            novo.classe = PARAM;
            novo.tipo = INT;
            strcpy(novo.lexema, tk.lexema);            
            insere_simbolo(novo);                 
                  
			tk = analex();
		} else erro(lin, 1); //Chama uma mensagem de erro caso nгo venha um ID
	}
	
	//Verifica se o tipo й FLOAT
	else if((tk.cat == PR) && (tk.p_reservada == FLOAT)){
		tk = analex();
		//verifica se o proximo token й um identificador
		if(tk.cat == ID){
            
            novo.escopo = escopo;
            novo.classe = PARAM;
            novo.tipo = FLOAT;
            strcpy(novo.lexema, tk.lexema);            
            insere_simbolo(novo);                  
                  
			tk = analex();
		} else erro(lin, 1); //Chama uma mensagem de erro caso nгo venha um ID
	}
	
	//Caso o proximo token for ','
	while((tk.cat == SN) && (tk.cod == CMM)){
		tk = analex();
		//Verifica se o tipo й CHAR
		if((tk.cat == PR) && (tk.p_reservada == CHAR)){
			tk = analex();
			//verifica se o proximo token й um identificador
			if(tk.cat == ID){
                
               novo.escopo = escopo;
               novo.classe = PARAM;
               novo.tipo = CHAR;
               strcpy(novo.lexema, tk.lexema);            
               insere_simbolo(novo);                  
                      
				tk = analex();
			} else erro(lin, 1); //Chama uma mensagem de erro caso nгo venha um ID
		}
	
		//Verifica se o Tipo й INT
		else if((tk.cat == PR) && (tk.p_reservada == INT)){
			tk = analex();
			//verifica se o proximo token й um identificador
			if(tk.cat == ID){
                
                novo.escopo = escopo;
                novo.classe = PARAM;
                novo.tipo = INT;
                strcpy(novo.lexema, tk.lexema);            
                insere_simbolo(novo);                  
                      
				tk = analex();
			} else erro(lin, 1); //Chama uma mensagem de erro caso nгo venha um ID
		}
	
		//Verifica se o tipo й FLOAT
		else if((tk.cat == PR) && (tk.p_reservada == FLOAT)){
			tk = analex();
			//verifica se o proximo token й um identificador
			if(tk.cat == ID){
                 
                 novo.escopo = escopo;
                 novo.classe = PARAM;
                 novo.tipo = FLOAT;
                 strcpy(novo.lexema, tk.lexema);            
                 insere_simbolo(novo);                 
                      
				tk = analex();
			} else erro(lin, 1); //Chama uma mensagem de erro caso nгo venha um ID
		
		} else erro(lin, 7); //Chama mensagem de erro caso nгo seja feita nenhuma declaraзгo
	
	}
}
Example #17
0
void declaracao_funcao(void)
{
	//Verifica se existe alguma pendencia na variavel aux
	//Se existir pendencia siginfica que o tipo o identificador e o parentese jб foi chamado
	if(aux.sit == PEN){
	
		//Verifica se o tipo й CHAR
		if(aux.tipo == CHAR){
            
            novo.escopo = escopo;
            novo.classe = FUNC;
            novo.tipo = CHAR;
            strcpy(novo.lexema, aux.id);            
            insere_simbolo(novo);                
			
            if((tk.cat == SN) && (tk.cod == OPP)){
				tk = analex();
			    escopo = LO;
				parametros_formais();
				//Verifica se o proximo token й um ')'
				if((tk.cat == SN) && (tk.cod == CLP)){
					tk = analex();
					//Verifica se o proximo tokem й um '{'
					if((tk.cat == SN) && (tk.cod == OPB)){
						//Libreando aux
						aux.sit = LIV;	
						tk = analex();					
						bloco_de_funcao();
						//Verifica se o token й um '}'
						if((tk.cat == SN) && (tk.cod == CLB)){
                            escopo = GL;       
							tk = analex();
							
                     
							remove_simbolo();
                     zombie_simbolo();							
                     declaracao_funcao();
						} else erro(lin, 5); //Chama mensagem de erro Caso nгo venha '}' 
						
					} else erro(lin, 4); //Chama mensagem de erro caso nгo venh '{'
												
				} else erro(lin, 3); /*Chama mensagem de erro
									 caso nгo venha ')' */
			} else erro(lin, 2);						 
		}		
		//Verifica se o tipo й INT
		else if(aux.tipo == INT){
             
            novo.escopo = escopo;
            novo.classe = FUNC;
            novo.tipo = INT;
            strcpy(novo.lexema, aux.id);            
            insere_simbolo(novo);        
             
			if((tk.cat == SN) && (tk.cod == OPP)){
				tk = analex();
			    escopo = LO;
				parametros_formais();
				//Verifica se o proximo token й um ')'
				if((tk.cat == SN) && (tk.cod == CLP)){
					tk = analex();
					//Verifica se o proximo tokem й um '{'
					if((tk.cat == SN) && (tk.cod == OPB)){
						//Libreando aux
						aux.sit = LIV;	
						tk = analex();					
						bloco_de_funcao();
						//Verifica se o token й um '}'
						if((tk.cat == SN) && (tk.cod == CLB)){
							tk = analex();
							escopo = GL;
							
							
							remove_simbolo();
                     zombie_simbolo();	
							
							declaracao_funcao();
						} else erro(lin, 5); //Chama mensagem de erro Caso nгo venha '}' 
						
					} else erro(lin, 4); //Chama mensagem de erro caso nгo venh '{'
												
				} else erro(lin, 3); /*Chama mensagem de erro
									 caso nгo venha ')' */
			} else erro(lin, 2);						 
		}		
		//Verifica se o tipo й FLOAT
		else if(aux.tipo == FLOAT){
             
            novo.escopo = escopo;
            novo.classe = FUNC;
            novo.tipo = FLOAT;
            strcpy(novo.lexema, aux.id);            
            insere_simbolo(novo);        
             
			if((tk.cat == SN) && (tk.cod == OPP)){
				tk = analex();
	            
                escopo = LO;		
				parametros_formais();
				//Verifica se o proximo token й um ')'
				if((tk.cat == SN) && (tk.cod == CLP)){
					tk = analex();
					//Verifica se o proximo tokem й um '{'
					if((tk.cat == SN) && (tk.cod == OPB)){
						//Libreando aux
						aux.sit = LIV;	
						tk = analex();					
						bloco_de_funcao();
						//Verifica se o token й um '}'
						if((tk.cat == SN) && (tk.cod == CLB)){
							tk = analex();
							
							escopo = GL;
							
							
							remove_simbolo();
                     zombie_simbolo();	
                            
							declaracao_funcao();
						} else erro(lin, 5); //Chama mensagem de erro Caso nгo venha '}' 
						
					} else erro(lin, 4); //Chama mensagem de erro caso nгo venh '{'
												
				} else erro(lin, 3); /*Chama mensagem de erro
									 caso nгo venha ')' */
			} else erro(lin, 2);						 
		}		
		
	} else { 
	
		//Verifica se o tipo й char
		if((tk.cat == PR) && (tk.p_reservada == CHAR)){
			tk = analex();
			//Verifica se o proximo token й um identificador
			if(tk.cat == ID){
                 
                novo.escopo = escopo;
                novo.classe = FUNC;
                novo.tipo = CHAR;
                strcpy(novo.lexema, tk.lexema);            
                insere_simbolo(novo);              
                      
				tk = analex();
				//Verifica se o proximo token й um '('
				if((tk.cat == SN) && (tk.cod == OPP)){
					tk = analex();
					
					escopo = LO;
					parametros_formais();
					//Verifica se o proximo token й um ')'
					if((tk.cat == SN) && (tk.cod == CLP)){
						tk = analex();
						//Verifica se o proximo token й um '{'
						if((tk.cat == SN) && (tk.cod == OPB)){
							tk = analex();
							bloco_de_funcao();
							//Verifica se o proximo token й um '}'
							if((tk.cat == SN) && (tk.cod == CLB)){
								tk = analex();
								escopo = GL;
								
								
							   remove_simbolo();
                        zombie_simbolo();	
								
								declaracao_funcao();
							} else erro(lin, 5); //Chama mensage de erro caso nгo venha '}'
							
						} else erro(lin, 4); //Chama mensagem de erro caso nгo venha '{'
						
					} else erro(lin, 3); //Chama o erro quando nгo vem um )

				} else erro(lin, 2);//Chama mensagem de erro caso nгo venha um (
				
			} else erro(lin, 1);//Chama a mensage de erro
		}

		//Verifica se o tipo й INT
		if((tk.cat == PR) && (tk.p_reservada == INT)){
			tk = analex();
			//Verifica se o proximo token й um identificador
			if(tk.cat == ID){
                
                novo.escopo = escopo;
                novo.classe = FUNC;
                novo.tipo = INT;
                strcpy(novo.lexema, tk.lexema);            
                insere_simbolo(novo);                    
                      
				tk = analex();
				//Verifica se o proximo token й um '('
				if((tk.cat == SN) && (tk.cod == OPP)){
					tk = analex();
					escopo = LO;
					parametros_formais();
					//Verifica se o proximo token й um ')'
					if((tk.cat == SN) && (tk.cod == CLP)){
						tk = analex();
						//Verifica se o proximo token й um '{'
						if((tk.cat == SN) && (tk.cod == OPB)){
							tk = analex();
							bloco_de_funcao();
							//Verifica se o proximo token й um '}'
							if((tk.cat == SN) && (tk.cod == CLB)){
								tk = analex();
								
								escopo = GL;
								
								
							   remove_simbolo();
                        zombie_simbolo();	
								
								declaracao_funcao();
							} else erro(lin, 5); //Chama mensage de erro caso nгo venha '}'
							
						} else erro(lin, 4); //Chama mensagem de erro caso nгo venha '{'
						
					} else erro(lin, 3); //Chama o erro quando nгo vem um )

				} else erro(lin, 2);//Chama mensagem de erro caso nгo venha um (
				
			} else erro(lin, 1);//Chama a mensage de erro
		}

		//Verifica se o tipo й FLOAT
		if((tk.cat == PR) && (tk.p_reservada == FLOAT)){
			tk = analex();
			//Verifica se o proximo token й um identificador
			if(tk.cat == ID){
                 
                novo.escopo = escopo;
                novo.classe = FUNC;
                novo.tipo = FLOAT;
                strcpy(novo.lexema, tk.lexema);            
                insere_simbolo(novo);                    
                      
                      
				tk = analex();
				//Verifica se o proximo token й um '('
				if((tk.cat == SN) && (tk.cod == OPP)){
					tk = analex();
					escopo = LO;
					parametros_formais();
					//Verifica se o proximo token й um ')'
					if((tk.cat == SN) && (tk.cod == CLP)){
						tk = analex();
						//Verifica se o proximo token й um '{'
						if((tk.cat == SN) && (tk.cod == OPB)){
							tk = analex();
							bloco_de_funcao();
							//Verifica se o proximo token й um '}'
							if((tk.cat == SN) && (tk.cod == CLB)){
								tk = analex();
								escopo = GL;
								
								
							   remove_simbolo();
                        zombie_simbolo();	
								
								declaracao_funcao();
							} else erro(lin, 5); //Chama mensage de erro caso nгo venha '}'
							
						} else erro(lin, 4); //Chama mensagem de erro caso nгo venha '{'
						
					} else erro(lin, 3); //Chama o erro quando nгo vem um )

				} else erro(lin, 2);//Chama mensagem de erro caso nгo venha um (
				
			} else erro(lin, 1);//Chama a mensage de erro
		}

        //Verifica se o tipo й VOID
		if((tk.cat == PR) && (tk.p_reservada == VOID)){
			tk = analex();
			//Verifica se o proximo token й um identificador
			if(tk.cat == ID){
                novo.escopo = escopo;
                novo.classe = FUNC;
                novo.tipo = VOID;
                strcpy(novo.lexema, tk.lexema);            
                insere_simbolo(novo);                    
                      
				tk = analex();
				//Verifica se o proximo token й um '('
				if((tk.cat == SN) && (tk.cod == OPP)){
					tk = analex();
					escopo = LO;
					parametros_formais();
					//Verifica se o proximo token й um ')'
					if((tk.cat == SN) && (tk.cod == CLP)){
						tk = analex();
						//Verifica se o proximo token й um '{'
						if((tk.cat == SN) && (tk.cod == OPB)){
							tk = analex();
							bloco_de_funcao();
							//Verifica se o proximo token й um '}'
							if((tk.cat == SN) && (tk.cod == CLB)){
								tk = analex();
								
								
							   remove_simbolo();
                        zombie_simbolo();	
								
								escopo = GL;
								declaracao_funcao();
							} else erro(lin, 5); //Chama mensage de erro caso nгo venha '}'
							
						} else erro(lin, 4); //Chama mensagem de erro caso nгo venha '{'
						
					} else erro(lin, 3); //Chama o erro quando nгo vem um )

				} else erro(lin, 2);//Chama mensagem de erro caso nгo venha um (
				
			} else erro(lin, 1);//Chama a mensage de erro
		}			
	}
	
}
Example #18
0
void declaracao_variaveis(void)
{
	//Verifica se o proximo token й do tipo CHAR
	if((tk.cat == PR) && (tk.p_reservada == CHAR)){
		aux.tipo = CHAR;
	
		tk = analex();
		
		//Verifica se o proximo token й um identificador;
		if(tk.cat == ID){
			strcpy(aux.id, tk.lexema);
		    
			tk = analex();			
		   
		   if((tk.cat == SN) && (tk.cod == OPP)){
               aux.sit = PEN;           
           }else{
                  novo.escopo = escopo;
                  novo.classe = VAR;
                  novo.tipo = CHAR;
                  strcpy(novo.lexema, aux.id);            
                  insere_simbolo(novo);
       			//Verifica se o proximo token й ','
       			if((tk.cat == SN) && (tk.cod == CMM)){
                  
       				while(tk.cod == CMM){
                                 
       					tk = analex();
       					
       					//Verifica se o proximo token й um ID
       					if(tk.cat == ID){ 
                       
                                                     
                            strcpy(novo.lexema, tk.lexema);
                            insere_simbolo(novo);//
                                         
       						tk = analex();
       					} else erro(lin, 1); //Chama a mensagem de erro
       				}				
       			}			
       			//Verifica se o proximo token й um ';'
       			if((tk.cat == SN) && (tk.cod == SMC)){
                          
       				tk = analex();
       				declaracao_variaveis();//Chama a declaraзaх de variaveis novamente
       			} else {
       				//aux.sit = PEN;
                   erro(lin, 8);			
       			}
        }
				
		} else erro(lin, 1); //Chama a mesangem de erro
	}	
	
	//Verifica se o token й do tipo INT
	else if((tk.cat == PR) && (tk.p_reservada == INT)){
		aux.tipo = INT;
		tk = analex();
		
		//Verifica se o proximo token й um identificador;
		if(tk.cat == ID){
			strcpy(aux.id, tk.lexema);
			tk = analex();			
		
			
			if((tk.cat == SN) && (tk.cod == OPP)){
               aux.sit = PEN;           
            }else{
                novo.escopo = escopo;
                novo.classe = VAR;
                novo.tipo = INT;
                strcpy(novo.lexema, aux.id);            
                insere_simbolo(novo); 
       			//Verifica se o proximo token й ','
       			if((tk.cat == SN) && (tk.cod == CMM)){
                         
       				while(tk.cod == CMM){
       					tk = analex();
       					
       					//Verifica se o proximo token й um ID
       					if(tk.cat == ID){
                            strcpy(novo.lexema, tk.lexema);
                            insere_simbolo(novo);//      
       						tk = analex();
       					} else erro(lin, 1); //Chama a mensagem de erro
       				}				
       			}			
       			//Verifica se o proximo token й um ';'
       			if((tk.cat == SN) && (tk.cod == SMC)){
       				tk = analex();
       				declaracao_variaveis();//Chama a declaraзaх de variaveis novamente
       			} else {
       				//aux.sit = PEN;
                   erro(lin, 8);			
       			}
       }
				
		} else erro(lin, 1); //Chama a mesangem de erro
	}	
	
	//Verifica se o tokem й um tipo FLOAT	
	else if((tk.cat == PR) && (tk.p_reservada == FLOAT)){
		aux.tipo = FLOAT;
		tk = analex();
		
		//Verifica se o proximo token й um identificador;
		if(tk.cat == ID){
			strcpy(aux.id, tk.lexema);
			tk = analex();			
		
			
		if((tk.cat == SN) && (tk.cod == OPP)){
               aux.sit = PEN;           
         }else{
            novo.escopo = escopo;
            novo.classe = VAR;
            novo.tipo = FLOAT;
            strcpy(novo.lexema, aux.id);            
            insere_simbolo(novo);
   			//Verifica se o proximo token й ','
   			if((tk.cat == SN) && (tk.cod == CMM)){
             
   				while(tk.cod == CMM){
   					tk = analex();
   					
   					//Verifica se o proximo token й um ID
   					if(tk.cat == ID){
                        strcpy(novo.lexema, tk.lexema);
                        insere_simbolo(novo);    
   						tk = analex();
   					} else erro(lin, 1); //Chama a mensagem de erro
   				}				
   			}			
   			//Verifica se o proximo token й um ';'
   			if((tk.cat == SN) && (tk.cod == SMC)){
   				tk = analex();
   				declaracao_variaveis();//Chama a declaraзaх de variaveis novamente
   			} else {
   				//aux.sit = PEN;
               erro(lin, 8);			
   			}
       }
				
		} else erro(lin, 1); //Chama a mesangem de erro
	}	
	
}
Example #19
0
int chamada_de_funcao2(void)
{
    int tipo; 
    char id[50];
  
	if(aux.sit == PEN){
		if((tk.cat == SN) && (tk.cod == OPP)){
            strcpy(id, aux.id);
            strcpy(func.id, aux.id);
            
                   
            tipo = verifica_tabela(id);
          
            
			
			   do{
              
                  tk = analex(); 
                  func.sit = PEN;   
      			   lista_de_expressoes();
      			   
      			   if(func.sit == LIV){
                     if(tk.cod == CMM){
                            
                         erro(lin, 14);                 
                     }                     
                  }
			
            }while(tk.cod == CMM); 
            
            if(func.sit == PEN){
                erro(lin, 15);                    
            } 
			   
			//Verifica se o proximo token й um ')'
			if((tk.cat == SN) && (tk.cod == CLP)){
                  
				tk = analex();
			
				aux.sit = LIV;
				return tipo;
			
			} else erro(lin, 3); // Chama mensagem de erro caso nгo venha ')'
		} else {
         if(tk.cod == CLP){
             aux.sit = LIV; 
                
             return;               
         }    
			aux.sit = LIV;
		}
	} else {	
		if(tk.cat == ID){
			tk = analex();
			//Verifica se o procximo token й um '('
			if((tk.cat == SN) && (tk.cod == OPP)){
                strcpy(id, tk.lexema);
                strcpy(func.id, tk.lexema);  
                tipo = verifica_tabela(id);
                
                         
				
				
				do{
                  func.sit = PEN; 
                  
                  tk = analex();   
      			   lista_de_expressoes();
      			 
      			   if(func.sit == LIV){
                     if(tk.cod == CMM){
                              
                         erro(lin, 14);                 
                     }                     
                  }
			
            }while(tk.cod == CMM); 
            
            if(func.sit == PEN){
                erro(lin, 15);                    
            } 
			
				//Verifica se o proximo token й um ')'
				if((tk.cat == SN) && (tk.cod == CLP)){
					tk = analex();
					aux.sit = LIV;
					return tipo;
				} else erro(lin, 3); // Chama mensagem de erro caso nгo venha ')'
			}
		}
	}
}