Programa em c++ nao funciona corretamente no Linux

1. Programa em c++ nao funciona corretamente no Linux

Murilo Eduardo de Carvalho Marchiori
murilomarchiori

(usa Ubuntu)

Enviado em 06/03/2011 - 13:33h

Olá, senhores, boa noite. desde ja aviso a administracao de que nao tenho certeza se estou postando no lugar certo; se errei, ficam minhas sinceras desculpas.

o que acontece eh que tenho que fazer para a faculdade um programa que, no futuro, se tornara um pequeno compilador. por enquanto, se refere somente a analise lexica, ou seja, depois da leitura de um arquivo cpp qualquer (no caso do meu exemplo simulado em um txt com um programa [*****] qualquer):

if(x==45)
{
z=10;
x="maria";
}

o programa, depois de ler outros arquivos com as palavras reservadas suportadas, os delimitadores, os operadores, etc, e fazer as devidas comparacaoes, deve mostrar o seguinte:

if --> palavra reservada
( --> delimitador
x --> variavel
== -> operador condicional

e assim por diante, até o fim. no windows, utilizando o visual studio, funciona direitinho, mas no linux, utilizando o g++, nao funciona, o programa entra logo no começo da sua execucao num laço infinito. gostaria de saber se os senhores poderiam analisar meu codigo e me ajudar a descobrir o erro, nao sei existe alguma coisa no codigo que deveria funcionar so no windows... enfim, segue o codigo. muito obrigado.

er, a identação ficou um pouco atrapalhada, nao sei como arrumar, de qualquer forma, acho que isso nao deve interferir, ja que minha duvida é somente se fiz alguma coisa que nao pode ser executada no linux...


#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <ctype.h>
using namespace std;

const int NUM=200;

void carrega_txt(string vetor_operadores[NUM], string vetor_delimitadores[NUM], string vetor_reservadas[NUM]);
void guarda_operadores(string palavra, string vetor_operadores[NUM]);
void guarda_delimitadores(string palavra, string vetor_delimitadores[NUM]);
void guarda_reservadas(string palavra, string vetor_reservadas[NUM]);
int fhash(string palavra);
int testa_numero(string line, int x);
int testa_operador(string line, int x, string vetor_operadores[NUM]);
int testa_delimitador(string line, int x, string vetor_delimitadores[NUM]);
int testa_reservada(string line, string vetor_reservadas[NUM]);


int main()
{
string teste, palavra, palavra2, line, concatena, vetor_operadores[NUM], vetor_delimitadores[NUM], vetor_reservadas[NUM], recebe, recebe2, testando, auxiliar;
int x=0; //usado para varrer a linha toda
int i=0; //usado para "zerar" os vetores de string
int testa_funcao=0, testa_tamanho=0, z=0;

//zerando vetores

for(i=0; i<NUM; i++)
{
vetor_operadores[i] = "";
vetor_delimitadores[i] = "";
}

carrega_txt(vetor_operadores, vetor_delimitadores, vetor_reservadas);

ifstream entrada;
entrada.open("programa_user.txt"); //Abre o arquivo;

if(entrada.is_open()) //Se o arquivo for aberto com sucesso...
{
while(!entrada.eof()) //Enquanto o arquivo não chegar no fim...
{
getline(entrada,line); //Copia uma linha inteira do arquivo para a string line;

x=0;

while (x < line.size()) //x percorre a string caractere por caractere;
{
while((line.at(x) == '\t' || line.at(x) == ' ') && x < line.size())
x++;

testa_funcao = testa_numero(line, x);

if(testa_funcao == 0) //ja sei que não é numero. testo, entao, se é outra coisa...
{
testa_funcao = testa_operador(line, x, vetor_operadores);

if(testa_funcao == 0)
{
//ja sei que tb nao é operador numerico...

testa_funcao = testa_delimitador(line, x, vetor_delimitadores);

if(testa_funcao == 0)
{
palavra = line.at(x);

while(isalpha(line.at(x)) && x < line.size()-1)
{
palavra = palavra + line.at(x+1);
x++;
}

testa_tamanho = palavra.size();

if(isalpha(palavra.at(testa_tamanho-1)) == 0)
{
x--;
//preciso agora fazer palavra receber ela mesma menos o ultimo caractere

z=0;
palavra2="";
while(isalpha(palavra.at(z)))
{
palavra2 = palavra2 + palavra.at(z);
z++;
teste = palavra.at(z);
}

palavra = palavra2;
}

testa_funcao = testa_reservada(palavra, vetor_reservadas);

if(testa_funcao == 0)
{
if(teste == "\"" || teste == "\'")
cout << "\n" << palavra << " ---- string.\n";
else
cout << "\n" << palavra << " ---- variavel.\n";
}
}
}
else
x=testa_funcao;
}
else
x=testa_funcao;

x++;
}
}

entrada.close();
}
else
cout << "Erro na leitura do arquivo\n\n";

cout << "\n\n";
}

void carrega_txt(string vetor_operadores[NUM], string vetor_delimitadores[NUM], string vetor_reservadas[NUM])
{
ifstream entrada;
string line;

entrada.open("operadores_num.txt"); //Abre o arquivo;

if(entrada.is_open()) //Se o arquivo for aberto com sucesso...
{
while(!entrada.eof()) //Enquanto o arquivo não chegar no fim...
{
getline(entrada,line);

//jogo line no vetor_operadores
guarda_operadores(line, vetor_operadores);
}
}
else
cout << "\n\nErro durante a leitura do 'arquivo operadores_num.txt'";

entrada.close();

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

entrada.open("delimitadores.txt"); //Abre o arquivo;

if(entrada.is_open()) //Se o arquivo for aberto com sucesso...
{
while(!entrada.eof()) //Enquanto o arquivo não chegar no fim...
{
getline(entrada,line);

//jogo line no vetor_operadores
guarda_delimitadores(line, vetor_delimitadores);
}
}
else
cout << "\n\nErro durante a leitura do arquivo 'delimitadores.txt'";

entrada.close();

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

entrada.open("reservadas.txt"); //Abre o arquivo;

if(entrada.is_open()) //Se o arquivo for aberto com sucesso...
{
while(!entrada.eof()) //Enquanto o arquivo não chegar no fim...
{
getline(entrada,line);

//jogo line no vetor_operadores
guarda_reservadas(line, vetor_reservadas);
}
}
else
cout << "\n\nErro durante a leitura do arquivo 'reservadas.txt'";

entrada.close();
}

void guarda_operadores(string palavra, string vetor_operadores[NUM])
{
int posicao = fhash(palavra);

//se a posição do vetor está vazia, simplesmente insiro o número;
//senão, concateno o que já está lá, através do ".", com a nova palavra.

if(vetor_operadores[posicao]=="")
vetor_operadores[posicao] = palavra+".";
else
vetor_operadores[posicao] = vetor_operadores[posicao]+"."+palavra;
}

void guarda_delimitadores(string palavra, string vetor_delimitadores[NUM])
{
int posicao = fhash(palavra);

//se a posição do vetor está vazia, simplesmente insiro o número;
//senão, concateno o que já está lá, através do ".", com a nova palavra.

if(vetor_delimitadores[posicao]=="")
vetor_delimitadores[posicao] = palavra+".";
else
vetor_delimitadores[posicao] = vetor_delimitadores[posicao]+"."+palavra;
}

void guarda_reservadas(string palavra, string vetor_reservadas[NUM])
{
int posicao = fhash(palavra);

//se a posição do vetor está vazia, simplesmente insiro o número;
//senão, concateno o que já está lá, através do ".", com a nova palavra.

if(vetor_reservadas[posicao]=="")
vetor_reservadas[posicao] = palavra+".";
else
vetor_reservadas[posicao] = vetor_reservadas[posicao]+"."+palavra;
}

int fhash(string palavra)
{
int sum, i;

sum=i=0;

while (i < palavra.size())
{
sum = sum + int(palavra.at(i));
i++;
}

return (sum%NUM);
}

int testa_numero(string line, int x)
{
string concatena;

if(isdigit(line.at(x)))
{
concatena = line.at(x);

//significa que "line.at(x)" é um numero.
if(line.at(x+1) == ',' || isdigit(line.at(x+1)))
{
//significa que line.at(x+1) é um número também, portanto line.at(x) e line.at(x+1) são parte do mesmo número.
while(line.at(x+1) == ',' || isdigit(line.at(x+1)))
{
concatena += line.at(x+1);
x++;
}
cout << "\n" << concatena << " ---- dado numerico.\n";
}
else
cout << "\n" << line.at(x) << " ---- dado numerico.\n";

return x; //retorno para a main o valor de x, ou seja, a posição de onde ele deve continuar.
}
else
return 0;

}

int testa_operador(string line, int x, string vetor_operadores[NUM])
{
string recebe, testando, auxiliar, recebe2;
int verifica, flag=0, y=0;

//calculo o hash do simbolo e armazeno em "recebe"
recebe = line.at(x);
verifica = fhash(recebe);

//testando recebe o que está no vetor, na posição determinada pelo cálculo do hash
testando = vetor_operadores[verifica];

y=0;

if(testando != "")
{
while (y < testando.size() && flag==0)
{
auxiliar="";

while(testando.at(y) != '.')
{
auxiliar += testando.at(y);
y++;
}

if(auxiliar == recebe)
{
flag=1;

y=0;

recebe2 = line.at(x+1);
verifica = fhash(recebe2);
testando = vetor_operadores[verifica];

if(testando != "")
{
while (y < testando.size() && flag==1)
{
auxiliar="";

while(testando.at(y) != '.')
{
auxiliar += testando.at(y);
y++;
}

if(auxiliar == recebe2)
flag = 2;
else
y++;
}
}

if(flag == 2)
{
cout << "\n" << recebe+recebe2 << " ---- operador aritmetico.\n";
x++;
}

else
cout << "\n" << recebe << " ---- operador aritmetico.\n";
}
else
y++;
}
}

if(flag == 0)
return 0;
else
return x;
}

int testa_delimitador(string line, int x, string vetor_delimitadores[NUM])
{
string recebe, testando, auxiliar, recebe2;
int verifica, flag=0, y=0;

//calculo o hash do simbolo e armazeno em "recebe"
recebe = line.at(x);
verifica = fhash(recebe);

//testando recebe o que está no vetor, na posição determinada pelo cálculo do hash
testando = vetor_delimitadores[verifica];

y=0;

if(testando != "")
{
while (y < testando.size() && flag==0)
{
auxiliar="";

while(testando.at(y) != '.')
{
auxiliar += testando.at(y);
y++;
}

if(auxiliar == recebe)
{
cout << "\n" << recebe << " ---- delimitador.\n";
flag=1;
}

else
y++;
}
}

if(flag == 0)
return 0;
else
{
x=x+1;
return x;
}
}

int testa_reservada(string line, string vetor_reservadas[NUM])
{
string recebe, testando, auxiliar, recebe2;
int verifica, flag=0, y=0;

//calculo o hash do simbolo e armazeno em "recebe"
recebe = line;
verifica = fhash(recebe);

//testando recebe o que está no vetor, na posição determinada pelo cálculo do hash
testando = vetor_reservadas[verifica];

y=0;

if(testando != "")
{
while (y < testando.size() && flag==0)
{
auxiliar="";

while(testando.at(y) != '.')
{
auxiliar += testando.at(y);
y++;
}

if(auxiliar == recebe)
{
cout << "\n" << recebe << " ---- palavra reservada.\n";
flag=1;
}

else
y++;
}
}

if(flag == 0)
return 0;
else
return 1;
}




  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts