#include "main.h"
extern TOKEN tablaSimb[SIMBOLOS];
extern TOKEN sintBuf[SINTAXIS];
extern char buffer[BUFFER];
extern int Bufpos, sinCont, Sinpos, buftam, linea, idSimb, simCont;
int InsertarSimbolo(char* token, int id, int tipo);
/* php 4 */
char *reservadas[RESERVADAS] = { "and","or","xor","__FILE__","exception","php_user_filter"
"__LINE__","array","as","break","case","cfunction","class",
"const","continue","declare","default","die","do","echo","else",
"elseif","empty","enddeclare","endfor","endforeach","endif",
"endswitch","endwhile","eval","exit","extends","for","foreach",
"function","global","if","include","include_once","isset","list",
"new","old_function","print","require","require_once","return",
"static","switch","unset","use","var","while","__FUNCTION__",
"__CLASS__","__METHOD__" };
char *Operadores[OPERADORES] = { "+","-","*","/","%","++","--","=","+=","-=","*=","/=","%=",".=",
"!","and","or","xor","&&","||","==",">","<","!=","<=",">=",
"&","|","{","}","(",")","[","]",".",",",";" };
int Tabla[7][7] = { { 1, 2, 3, 1, 1, 6, 6 },
{ 1, 1, 1, 1, 1, 6, 0 },
{ 6, 3, 3, 6, 5, 6, 6 },
{ 6, 3, 3, 6, 6, 6, 4 },
{ 6, 4, 4, 6, 6, 6, 6 },
{ 6, 5, 5, 5, 6, 6, 6 },
{ 6, 6, 6, 6, 6, 6, 6 } };
int AnaLex(char* token)
{
int i = Bufpos, rt=0, estado=0, j=0, res_id;
int flgHex=0, flgID = 0;
char ttok[61], tmpc;
TOKEN tmp_sim;
for( ; i <= buftam; i++ )
{
if(isalpha(buffer[i]) || buffer[i]=='_' || buffer[i]=='$')
{
tmpc = toupper(buffer[i]);
switch(estado)
{ // para ID
case 0: case 1: estado = Tabla[estado][0]; break;
case 2: // puede ser numero oct o hex
{
if(tmpc == 'X') // si es hex
estado = Tabla[estado][4];
else
estado = Tabla[estado][1]; // error en hex
} break;
case 5:
{
if(tmpc >= 'A' && tmpc <= 'F') // es numero hex
estado = Tabla[estado][3];
else
estado = Tabla[estado][1]; // error en hex
} break;
default: estado = Tabla[estado][1]; // error
}
ttok[j++] = buffer[i];
ttok[j] = '\0';
}
else if(isdigit(buffer[i])) // si es digito
{
switch(estado)
{
case 0:
{
if( buffer[Bufpos] == '0' ) // puede ser octal o hexa
estado = Tabla[ estado][1];
else
estado = Tabla[estado][2];
} break;
case 1: estado = Tabla[estado][1]; break;
case 2: case 3: case 4: estado = Tabla[estado][1]; break;
case 5: estado = Tabla[estado][2]; break; // numero hex
}
ttok[j++] = buffer[i];
ttok[j] = '\0';
}
// cualquier otro caracter perteneciente al lenguaje
else if(OperadorArit(buffer[i]) || OperadorRel(buffer[i]) || OperadorLog(buffer[i])
|| OperadorOtro(buffer[i]) || OperadorGrupo(buffer[i]) || buffer[i]=='\0'
|| buffer[i]==' ')
{
short flg=0;
for(;buffer[i] == ' ';i++) flg=1; // salta espacios
if(flg==1) Bufpos = --i;
if(buffer[i] == '.' && estado == 3)
{
estado = Tabla[ estado ][ 6 ];
ttok[ j++ ] = buffer[ i ];
ttok[ j ] = '\0';
}
else
{
if(estado==6 || buffer[i] == '.'||(ttok[0]=='$'&&isdigit(ttok[1]))) // si hay error
{
cout<<"\nError! ["<
rt = TOKEN_INVALIDO;
}
else if(estado == 1) // identificador o constante
{
strcpy(tmp_sim.token,ttok);
tmp_sim.tipo = VARIABLE;
if( ttok[0]=='$') // es variable
{
tmp_sim.id = ID_SIMBOLOS + idSimb;
rt = IDENTIFICADOR;
if(BuscarSimbolo(ttok)==TOKEN_NO_ENCONTRADO )
{
InsertarSimbolo(ttok,tmp_sim.id,VARIABLE);
idSimb++;
}
}
else
{
rt=IDReserv(ttok);
if(rt != TOKEN_NO_ENCONTRADO)
{
tmp_sim.id = rt;
rt = RESERVADA;
}
else
{
tmp_sim.id = ID_SIMBOLOS + idSimb;
rt = CONST_SIMB;
}
if(BuscarSimbolo(ttok)==TOKEN_NO_ENCONTRADO )
{
InsertarSimbolo(ttok,tmp_sim.id,VARIABLE);
idSimb++;
}
}
}
else if( estado==2 || estado==3 || estado==5) rt=CONSTANTE;
else if( estado==4 ) rt=REAL;
strcpy(token,ttok);
break;
}
}
else // caracter raro
{
ttok[ j++ ] = buffer[ i ];
ttok[ j ] = '\0';
estado = 6;
}
}
Bufpos = i-1;
return rt;
}
int BuscarSimbolo(char* token) // regresa el id del simbolo si lo encuentra
{
int i;
for(i=0;i<=simCont;i++)
if( strcmp(tablaSimb[i].token,token)==0) return tablaSimb[i].id;
return TOKEN_NO_ENCONTRADO;
}
int IDReserv(char* token)
{
int i = 0;
for(;i
return TOKEN_NO_ENCONTRADO;
}
int IDOperador( char* token )// regresa el id del operador encaso de encontrarlo
{
int i = 0;
for(;i
if(strcmp(Operadores[ i ],token)==0) return i + ID_OPERADORES;
return TOKEN_NO_ENCONTRADO;
}
int InsertarSimbolo(char* token, int id, int tipo)
{
simCont++;
strcpy(tablaSimb[simCont].token,token);
tablaSimb[simCont].id = id;
tablaSimb[simCont].tipo = tipo;
return 0;
}
int ModificaTipo(char* token, int tipo)
{
int i = 0;
for(i=0;i<=simCont;i++)
{
if( strcmp(tablaSimb[i].token,token)==0)
{
tablaSimb[i].tipo = tipo;
return tablaSimb[i].id;
}
}
return TOKEN_NO_ENCONTRADO;
}
int ObtieneTipo(char* token)
{
int i = 0;
for(;i<=simCont;i++)
if( strcmp(tablaSimb[i].token,token)==0) return tablaSimb[i].tipo;
return TOKEN_NO_ENCONTRADO;
}