Ir ao conteúdo
  • Cadastre-se

Pilha c++


Pereira16

Posts recomendados

Estou fazendo um programa em pilha para analise lexica.
 
O programa recebe entrada na variavel r.entrada e só termina quando recebe !.
 
Tenho que fazer uma busca nas palavras reservadas que eu coloquei na pilha, porém esta dando erro.
 
Ex: na pilha tem a palavra 'div' ai eu digito div !, como na tabela tem apenas o 'div' e não tem div ! eu não consigo fazer a busca.
 
Tenho que terminar  com '!' porque se o que eu estiver procurando não estiver procurando não estiver na tabela o programa tem que reconhecer o que tem nos cases ou se eu digitar uma coisa que estiver na tabela e em seguida tiver no case.
 
O programa é esse:
 

#include <iostream>#include <cstdlib>#define MAX 50#define identificador 256#define mulop 257#define addop 258#define relop 259using namespace std;typedef struct {int cod;char entrada[50];}registro;typedef struct {registro item[MAX];int topo;}pilha;void inicializa(pilha *p){p->topo = 0;}int vazia(pilha p){return (p.topo == 0);}void empilha(pilha *p, registro r){if (p->topo == MAX)cout << " Erro pilha esta cheia\n";else{p->item[p->topo++]=r;}}int tamanho(pilha p){return (p.topo);}char lexeme[41];int i = 0, j = 0;void imprime(pilha p){cout << "\n------------\n";cout << "\n TABELA: \n\n";for(int i=0; i<p.topo; i++)cout << p.item[i].cod << " - " << p.item[i].entrada << "\n";cout << "\n------------\n";}int main(){int estado=1, i=0, j=0;pilha p;registro r;cout << "-----------------------------------------------\n";cout << "\n255 - SINAL DE ATRIBUICAO\n";cout << "\n256 - IDENTIFICADOR: | letra(letra|numero)* | \n";cout << "\n257 - MULOP: | / | * | div | mod | and \n";cout << "\n258 - ADDOP: | + | - | or \n";cout << "\n259 - RELOP: | == | < | > | <= | >= | <>\n\n";cout << "-----------------------------------------------\n";inicializa(&p);r.cod=255;strcpy(r.entrada,":=");empilha(&p,r);r.cod=257;strcpy(r.entrada,"/");empilha(&p,r);r.cod=257;strcpy(r.entrada,"*");empilha(&p,r);r.cod=257;strcpy(r.entrada,"div");empilha(&p,r);r.cod=257;strcpy(r.entrada,"mod");empilha(&p,r);r.cod=257;strcpy(r.entrada,"and");empilha(&p,r);r.cod=258;strcpy(r.entrada,"+");empilha(&p,r);r.cod=258;strcpy(r.entrada,"-");empilha(&p,r);r.cod=258;strcpy(r.entrada,"or");empilha(&p,r);r.cod=259;strcpy(r.entrada,"==");empilha(&p,r);r.cod=259;strcpy(r.entrada,"<");empilha(&p,r);r.cod=259;strcpy(r.entrada,">");empilha(&p,r);r.cod=259;strcpy(r.entrada,"<=");empilha(&p,r);r.cod=259;strcpy(r.entrada,">=");empilha(&p,r);r.cod=259;strcpy(r.entrada,"<>");empilha(&p,r);imprime(p);cout << endl << endl << endl;cout << "\nDigite a entrada sem !: " << endl;gets(r.entrada);while (r.entrada[i] != '!'){//Aqui eu faço a busca onde esta errado.for(int k=0; k<p.topo; k++){if (strcmp (r.entrada, p.item[k].entrada) == 0){cout << "\n\nTabela: ";cout << p.item[k].entrada;cout << endl << endl;}}switch (estado){case 1:if((r.entrada[i]==' ')||(r.entrada[i]=='\n'))i++;else if(isalpha(r.entrada[i])){lexeme[j] = r.entrada[i];i++;j++;estado=2;}else estado = 4;break;case 2:if((isalpha(r.entrada[i]))||(isdigit(r.entrada[i]))){lexeme[j] = r.entrada[i];i++;j++;}else{i++;lexeme[j] = '\0';j++;estado = 3;}break;case 3:r.cod = 255;cout<<"\n identificador";cout<<"\n lexeme = " <<lexeme<<"\n\n";i--;//volta 1j=0;estado = 1;break;case 4:if((r.entrada[i] == '+') || (r.entrada[i] == '-')){lexeme[j] = r.entrada[i];i++;j++;estado = 5;}else{i++;estado = 8;}break;case 5:if(isdigit(r.entrada[i])){while(isdigit(r.entrada[i])){lexeme[j] = r.entrada[i];i++;j++;estado = 7;}estado = 7;}if(r.entrada[i] == '.'){lexeme[j] = r.entrada[i];i++;j++;estado = 6;}else{i++;lexeme[j] = '\0';j++;estado = 7;}break;case 6:while(isdigit(r.entrada[i])){lexeme[j] = r.entrada[i];i++;j++;estado = 7;}case 7:cout<<"\n Constante";cout<<"\n lexeme = " <<lexeme<<"\n\n";i--;j=0;estado = 1;break;case 8:cout<<"\n Elemento ";cout<<"\n Outro elemento\n\n";i++;estado = 1;break;}//fim switch} //fim whilesystem("PAUSE");return 0;}

A parte que esta errada não estou conseguindo arrumar.

Ficarei muito agradecido de quem me ajuda.

Link para o comentário
Compartilhar em outros sites

Cara acho melhor você separar os comandos do seu parser em uma LISTA e deixar a PILHA apenas para entrada.

 

Esse estado também me parece gambiarra, tem lógica melhor. Se você separar as coisas a lógica aparece.

 

A questão do !, que é o seu pedido de ajuda. Não tem muito o que fazer champ, você vai ter que escrever uma função que analisa cada entrada procurando por ele, isso claro sem perder o comando.

 

O que você fez está incompleto, por isso não está funcionando. STRCMP não faz milagre, alias C é o mais difícil de se usar, vai fazer muito trabalho manual ainda.

 

E mais, não tem como te ajudar, porque você documentou muito mal o que quer fazer, tenha mais atenção ao descrever seu programa, eu mal consegui entender o que você escreveu.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...