Implementao em C
#include <stdio.h>
#include <string.h>
typedef struct
{
int COD;
char VALOR[50];
} TOKEN;
int delta (int q, char ch)
{
int M[19][15] =
{ { 12, 13, 14, 15,
1, -2, -2,
4, 10,
0, -2 },
1, -1,
{ -1, -1, -1, -1, 10, 11, -1, 10, 10, 10, 10, 10, 10, -1, -2 },
{ -1, -1, -1, -1, 10, 11, -1, 10, 10, 10,
{ -1, -1, -1, -1, 10, 11, -1, 10, 10, 10, 10,
9, 10, -1, -2 },
{ -1, -1, -1, -1, 10, 11, -1, 10, 10, 10, 10, 10, 10, -1, -2 },
{ -1, -1, -1, -1, 10, 11, -1, 10, 10, 10, 10, 10, 10, -1, -2 },
{ -3, -3, -3, -3, 10, -3, -3, 10, 10, 10, 10, 10, 10, -3, -3 },
{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2 },
{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2 },
{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2 },
{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2 },
{
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0 },
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0 },
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0 }
};
switch (ch)
{
case '+' : return M[q][0]; break;
case '-' : return M[q][1]; break;
case '*' : return M[q][2]; break;
case '/' : return M[q][3]; break;
case '_' : return M[q][5]; break;
case '.' : return M[q][6]; break;
case 'm' : return M[q][7]; break;
case 'o' : return M[q][8]; break;
1
Implementao em C
// digitos
return M[q][4];
else if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
// outras letras
return M[q][12];
else
return M[q][14];
// outros caracteres
}
} // delta
int AnalisadorLexico (TOKEN *TOK, int *tam_TOK)
{
char ch, st[50];
int
FILE *f;
f = fopen("ENT_1.txt", "r"); if (f == NULL)
return 0;
*tam_TOK = 0;
ch = fgetc(f);
while (ch != EOF)
{
for (k = 0; k < 50; k++)
st[k] = '\0';
tam_st = 0; q_act = 0;
do {
q_ant = q_act; q_act = delta(q_ant, ch);
if (q_act > 0)
{
st[tam_st] = ch;
tam_st++;
ch = fgetc(f);
}
} while (q_act > 0 && ch != EOF);
Implementao em C
case -3 : printf("ERRO: caracter invalido ou fora do contexto. Retirar ultimo caracter do padrao!!\n ");
}
} // while
fclose(f);
return 1;
}
3
Implementao em C
int
{ 3, 4, 2, 2, 2, 2, 2, 2, -1},
TOK[tam].COD = 8;
TOK[tam].VALOR[0] = '$';
tam++;
printf("Topo(Z) -- lookhead -- accao \n");
Z[0] = 8;
// Push(Z, $)
Z[1] = 9;
// Push(Z, S)
topo = 1;
k = 0;
lookhead = TOK[k].COD;
do
{
accao = Oraculo[Z[topo]][lookhead];
printf(" %d
--
%d
switch (accao)
{
case -2 : break;
// Aceitacao
case -1 : break;
// ERRO
case 0 :
// Pop(Z)
topo--;
lookhead = TOK[++k].COD;
// Da_Simbolo
break;
default:
topo--;
// Pop(Z);
// Push(Z, Yi)
break;
}
} while (accao >= 0);
return accao;
}
4
Implementao em C
int main ()
{
int
k, tam_TOK;
TOKEN TOK[100];
if (AnalisadorLexico(TOK, &tam_TOK) != 1)
return(0);
printf("\n\nLISTA DE TOKEN (%d) : \n\n", tam_TOK);
for (k = 0; k < tam_TOK; k++)
{
switch (TOK[k].COD)
{
case 0 : printf("NUM -> "); break;
case 1 : printf(" ID -> "); break;
case 2 : printf(" +
case 3 : printf(" -
case 4 : printf(" *
case 5 : printf(" /