#include <conio.h>
#include <stdio.h>
#include <ctype.h>
// ^ = ecepto
// a-z A-Z^ Hh D d Oo & X "a "c ( ) [ ] 0-7 8-9 . _ G-Z DEL EOF
int table[13][22] = {{ 1, 1, 1, 1, 1, 1, 10, 8, 9, -1, 11, -1, 12, -1, 4, 5, 6, -1, 1, 0, 1000},
{ 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 2, 1, 100, -1},
{ 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 3, 1, 100, -1},
{ 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, -1, -1, 1, 100, -1},
{ -1, -1, -1, 300, 300, 200, -1, -1, -1, -1, -1, -1, -1, -1, 4, 5, 6, -1, -1, 300, -1},
{ -1, -1, -1, 300, 300, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5, 6, -1, -1, 300, -1},
{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 7, -1, -1, -1, -1, -1},
{ -1, -1, -1, 400, 400, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 7, -1, -1, -1, 400, -1},
{ 1, 1, 500, 8, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 8, -1, -1, 8, -1, -1},
{ 9, 9, 9, 9, 9, 9, -1, 9, -1, 600, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1},
{ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, -1},
{ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 700, 11, 11, 11, 11, 11, 11, 11, -1, -1},
{ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 800, 12, 12, 12, 12, 12, -1, -1}};
// -1: Carter Invalido
int caracter(int ch)
{
if(ch>='a' && ch<='z') return 0;
else if(ch=='A' || ch=='B'|| ch=='C'|| ch=='D'|| ch=='E'|| ch=='F'|| ch=='G'|| ch=='H'|| ch=='I'|| ch=='J'|| ch=='K'|| ch=='L'|| ch=='M'|| ch=='N'|| ch=='O'|| ch=='P'|| ch=='Q'|| ch=='R'|| ch=='S'|| ch=='T'|| ch=='U'|| ch=='V'|| ch=='W'|| ch=='Y'|| ch=='Z') return 1;
else if(ch=='H' || ch=='h') return 2;
else if(ch=='D') return 3;
else if(ch=='d') return 4;
else if(ch=='&') return 5;
else if(ch=='X') return 6;
else if(ch=='"') return 7;
else if(ch=='"') return 8;
else if(ch=='(') return 9;
else if(ch==')') return 10;
else if(ch=='[') return 11;
else if(ch==']') return 12;
else if(ch=='0' || ch=='1' || ch=='2' || ch=='3' || ch=='4' || ch=='5' || ch=='6' || ch=='7') return 13;
else if(ch=='8' || ch=='9') return 13;
else if(ch=='.') return 14;
else if(ch=='_') return 15;
else if(ch=='G' || ch=='H'|| ch=='I'|| ch=='J'|| ch=='K'|| ch=='L'|| ch=='M'|| ch=='N'|| ch=='O'|| ch=='P'|| ch=='Q'|| ch=='R'|| ch=='S'|| ch=='T'|| ch=='U'|| ch=='V'|| ch=='W'|| ch=='X' || ch=='Y'|| ch=='Z') return 16;
else if(ch==' '|| ch=='\n' || ch=='\t' || ch==23) return 17;
else if(ch==27) return 18;
else return 19;
}
main()
{ char ch;
int edo=0,nedo;
clrscr();
while(edo!=1000)
{
if(edo>99)
{ printf(" Se genero el siguiente Token %d \n",edo);
edo =0;
}
ch=getche();
nedo=table[edo][caracter(ch)];
edo=nedo;
// printf("%d",ch);
}
printf(" Se genero el siguiente Token %d \n",edo);
getche();
}
:::::::INSTRUCCIONES:::::::
IDENTIFICADORES
1. Los identificadores pueden comenzar únicamente con letras.
2. después pueden venir letras, dígitos o el símbolo underline
3. no se puede terminar el identificador con un underline
ejemplos: Numero, uno_dos, _uno_123
NUMEROS ENTEROS
1. solo se aceptan dígitos del 0 al 9.
2. se deben terminar o no con una D o d
ejemplos: 123, 4d, 123D
NUMEROS REALES
1. se forman con dígitos decimales
2. se puede terminar o no con una D o d
3. pueden iniciar con un punto pero no pueden terminar con un punto
ejemplos: 123.4, 56.234, 32.00D
NUMERO OCTALES
1. se forman con los dígitos 0 al 7
2. deben terminar con O o o
ejemplos: 123O, 54312o
NUMEROS HEXADECIMALES
1. se forma de los dígitos 0 al 9 y las letras A,B,C,D,E,F en mayúsculas
2. deben terminar con una H o h
3. inician con X mayúscula
ejemplos: X121ABh, X324DCH
CONSTANTES STRING
Las constantes string se forman por una cadena de caracteres y se delimitan por dobles comillas.
Ejemplos: “string”
COMENTARIOS
Cualquier cadena de caracteres que se encuentra en la misma línea después del carácter (&), es considerada como un comentario hasta fin de línea.
&comentario asta fin de linea
OTROS OPERADORES Y CARACTERES ESPECIALES
( Paréntesis izquierdo ) paréntesis derecho
[ Corchete izquierdo ] corchete derecho
Dentro de los paréntesis y corchetes pueden recibir cualquier carácter ASCII.






