Skip to content

Instantly share code, notes, and snippets.

@thiagofm
Created May 7, 2010 23:51
Show Gist options
  • Save thiagofm/394154 to your computer and use it in GitHub Desktop.
Save thiagofm/394154 to your computer and use it in GitHub Desktop.
#include <string>
#include <iostream>
#include <cstdlib>
using namespace std;
class AnalisadorLexico
{
public:
int atual;
int valorAtual;
string variavelAtual;
string s;
string sAtual;
int qtdVal;
int qtdVar;
int passado;
typedef struct {
string var;
int val;
} tabela[100];
tabela tab;
AnalisadorLexico::AnalisadorLexico(char x[])
{
qtdVal=0;
passado=0; //se passado = 1, a seq passada era valor, se passado = 2 a seq passada era variavel
qtdVar=0;
atual=0;
valorAtual=0;
variavelAtual="";
sAtual="";
s=x;
e0();
}
private:
int AnalisadorLexico::eNumero(char s)
{
if ( (((char)s)>=48) && (((char)s)<=57) ){return 1;}
return 0;
}
int AnalisadorLexico::eLetra(char s)
{
if ( (((char)s)>=65) && (((char)s)<=90) || (((char)s)>=97) && (((char)s)<=122) ){return 1;}
return 0;
}
int AnalisadorLexico::eEspaco(char s)
{
if ( (((char)s)==32) ){return 1;}
return 0;
}
int AnalisadorLexico::eIgual(char s)
{
if ( (((char)s)==61) ){return 1;}
return 0;
}
void AnalisadorLexico::sucesso()
{
for(int i=0;i<qtdVar;i++){
cout << tab[i].var << "=" << tab[i].val << endl;
}
system("PAUSE");
}
bool AnalisadorLexico::varExisteQ()
{
for(int i=0;i<=qtdVar;i++){
if( tab[i].var == variavelAtual ){return true;}
}
return false;
}
void AnalisadorLexico::adicionarVar()
{
if(!varExisteQ()){
tab[qtdVar].var=variavelAtual;
tab[qtdVar].val=0;
qtdVar++;
}
variavelAtual="";
}
void AnalisadorLexico::e0()
{
if (atual == s.size())
{
sucesso();
}
printf("e0\n");
if ( eNumero(s[atual]) )
{
atual++;
e1();
}
else if ( eEspaco(s[atual]) )
{
atual++;
e0();
}
else if ( eIgual(s[atual]) )
{
atual++;
e0();
}
else if ( eLetra(s[atual]) )
{
variavelAtual+=s[atual];
atual++;
e2();
}
else if ( !eLetra(s[atual]) && !eNumero(s[atual]) )
{
sAtual+=s[atual];
atual++;
e0();
}
}
int AnalisadorLexico::e1()
{
if (atual == s.size())
{
sucesso();
}
printf("e1\n");
if ( eNumero(s[atual]) )
{
atual++;
e1();
}
else if ( eLetra(s[atual]) )
{
//salva o numero atual
e0();
}
else if ( !eLetra(s[atual]) && !eNumero(s[atual]) )
{
//salva o conteudo
sAtual+=s[atual];
atual++;
e0();
}
}
int AnalisadorLexico::e2()
{
if (atual == s.size())
{
adicionarVar(); //caso seja o fim, adiciona var
sucesso();
}
printf("e2\n");
if ( eLetra(s[atual]) || eNumero(s[atual]) )
{
variavelAtual+=s[atual];
atual++;
e2();
}
else if ( eEspaco(s[atual]) )
{
adicionarVar();
atual++;
e0();
}
else if ( !eLetra(s[atual]) && !eNumero(s[atual]) )
{
variavelAtual+=s[atual];
e0();
}
}
};
int main(int argc, char** argv)
{
char s[100];
printf("Digite o codigo: ");
gets (s);
AnalisadorLexico AL(s);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment