miércoles, 13 de enero de 2010

Doxygen....PHP

/* \var nombre guarda una cadena de caracteres
\var numero guarda un dato numerico
*/
var $nombre;
var $numero;

/* funcion que suma a y b
\param a valor para primer operando
\param b valor para segundo operando
\return la suma de a y b
*/
function valor( var $a,var $b )
{
return $a+$b;
}

/* funcion que hace el producto de ab y da
\param ab primer operando
\param da segundo operando
\return el producto de ab * da
*/
function operacion( var $ab, var $da )
{
return $ab * $da;
}

/* imprime la cadena hola mundo */
function Hola()
{
echo "Hola mundo!";
}

/* pone un texto en la variable "nombre"
\param cadena recibe una cadena de caracteres
*/
function ponerTexto( var $cadena )
{
$nombre = cadena;
}
?>

Lexico...

#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;
}

main.h

#include
#include
using namespace std;

#define RESERVADAS 55
#define OPERADORES 37

#define SIMBOLOS 100
#define SINTAXIS 100
#define BUFFER 512

#ifndef MAX_PATH //si no esta definido max_path
#define MAX_PATH 260
#endif

#define VARIABLE 0
#define CADENA 1
#define CONSTANTE 2
#define REAL 3
#define IDENTIFICADOR 4
#define RESERVADA 6
#define CONST_SIMB 5

#define ID_OPERADORES 60
#define ID_RESERVADAS 7
#define ID_SIMBOLOS 100

#define SUMA ID_OPERADORES
#define RESTA ID_OPERADORES+1
#define MULT ID_OPERADORES+2
#define DIVI ID_OPERADORES+3
#define MODU ID_OPERADORES+4
#define INC ID_OPERADORES+5
#define DEC ID_OPERADORES+6
#define IGUAL ID_OPERADORES+7
#define SUMA_A ID_OPERADORES+8
#define RESTA_A ID_OPERADORES+9
#define MULT_A ID_OPERADORES+10
#define DIVI_A ID_OPERADORES+11
#define MODU_A ID_OPERADORES+12
#define PUNTO_A ID_OPERADORES+13
#define NOT ID_OPERADORES+14
#define AND ID_OPERADORES+15
#define OR ID_OPERADORES+16
#define XOR ID_OPERADORES+17
#define O_AND_AND ID_OPERADORES+18
#define O_OR_OR ID_OPERADORES+19
#define IGUAL_IGUAL ID_OPERADORES+20
#define MAYOR_Q ID_OPERADORES+21
#define MENOR_Q ID_OPERADORES+22
#define DIST ID_OPERADORES+23
#define MENOR_IGUAL ID_OPERADORES+24
#define MAYOR_IGUAL ID_OPERADORES+25
#define O_AND ID_OPERADORES+26
#define O_OR ID_OPERADORES+27
#define LLAVE_A ID_OPERADORES+28
#define LLAVE_C ID_OPERADORES+29
#define PAREN_A ID_OPERADORES+30
#define PAREN_C ID_OPERADORES+31
#define CORCH_A ID_OPERADORES+32
#define CORCH_C ID_OPERADORES+33
#define PUNTO ID_OPERADORES+34
#define COMA ID_OPERADORES+35
#define PUNTO_COMA ID_OPERADORES+36

#define R_AND ID_RESERVADAS
#define R_OR ID_RESERVADAS+1
#define R_XOR ID_RESERVADAS+2

#define TOKEN_NO_ENCONTRADO -2
#define TOKEN_INVALIDO -3

typedef struct _TOKEN {
char token[61];
int id;
int tipo;
}TOKEN;

int OperadorArit(char c);
int OperadorRel(char c);
int OperadorLog(char c);
int OperadorOtro(char c);
int OperadorGrupo(char c);

int abrirArchivo(char* nombre);
int AnaSint();
int AnaSem();
int AnaLex(char* token);
int IDOperador(char* token);
int IDReserv(char* token);
int BuscarSimbolo(char* token);
int ModificaTipo(char* token, int tipo);
int ObtieneTipo(char* token);

Main.c

#include "main.h"
TOKEN tablaSimb[SIMBOLOS];
TOKEN sintBuf[SINTAXIS];
char buffer[BUFFER];
int Bufpos=0, sinCont=-1, Sinpos=-1, buftam, linea=1, idSimb=0, simCont=-1;
int lCon=0;
int main()
{
char archivo[MAX_PATH];
int ret;
cout<<"Nombre de archivo fuente:"<0)cout<<"\nError de sintaxis ["<=ID_SIMBOLOS)
{
cout<<"token: "< case CADENA: cout<<"string"; break;
case CONSTANTE: cout<<"Entero"; break;
case REAL: cout<<"Flotante"; break;
case CONST_SIMB: cout<<"constante"; break;
}
cout< }
}
return 0;
}

continua lexico

["< 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;
}
#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! ["<

Compilador...Gabby....Si se pudo

/*Hola Mundo*/
$as = 34,
$v1 = "Hola";
$cad = $as + $v1;
$variable;

if(!$as)
{
}

while($as == $v1)¨
{
$as++;
}

for($as ==0; $as<100; $as++)
{

}
}