Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Visual Algory
Visual Algory
0 de 75
Documentación Visual Algory
Índice
No. Página
3. Elementos de la Interfase 10
3.1 Barra de Menús 10
3.2 Barra de Herramientas 13
3.3 Ventana de Análisis 14
3.3.1 Análisis Léxico 14
3.3.2 Análisis Sintáctico 34
3.3.3 Análisis Semántico 48
3.4 Ventana de Errores 50
3.5 Estatus Bar 53
3.6 Código 54
3.7 Simulación 62
5. Glosario 71
1 de 75
Documentación Visual Algory
Es un Compilador de Código Algory que permite simular dicho código a través de la generación de
un Código Intermedio, este Compilador tiene un fin estrictamente educativo, ya que muestra
detenidamente los pasos que realiza un compilador para ejecutar una aplicación.
Algory:
2 de 75
Documentación Visual Algory
Primera Versión:
/*Algory.h
Archivo de macros para la materia de Diseño Estructurado de Algoritmos
de la carrera de Ing. En Sistemas Computacionales
Fecha de última actualización 10 de diciembre de 1998
Ing. Martha Vallejo Moreno
*/
/* Archivos de cabecera */
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <math.h>
3 de 75
Documentación Visual Algory
Segunda Versión:
/*Algory2.h
Archivo de macros para la materia de Computación II
Fecha de penúltima actualización 10 de diciembre de 1998 por Ing. Martha Vallejo Moreno
Fecha de última actualización 03 de Febrero de 2003 por Gerardo Emilio Veloz Flores
*/
/* Archivos de cabecera */
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <math.h>
/*#include <cruces.h>*/
/*#include <marcos.h>*/
/*#include <linea.h>*/
4 de 75
Documentación Visual Algory
5 de 75
Documentación Visual Algory
#define FIN_TAMANO };
#define REF_A &
#define REF_P *
#define PROCEDIMIENTO void
#define INICIO_PROCEDIMIENTO {
#define FIN_PROCEDIMIENTO }
#define SENO(a) (float)(sin((double)(M_PI*a)/180));
#define COSENO(a) (float)(cos((double)(M_PI*a)/180));
#define TANGENTE(a) (float)(tan((double)(M_PI*a)/180));
#define COTANGENTE(a) (float)(1/(tan((double)(M_PI*a)/180)));
#define SECANTE(a) (float)(1/cos((double)(M_PI*a)/180));
#define COSECANTE(a) (float)(1/sin((double)(M_PI*a)/180));
#define ARCOSENO(a) (float)(180*asin((double)a))/M_PI;
#define ARCOCOSENO(a) (float)(180*acos((double)a))/M_PI;
#define ARCOTAN(a) (float)(180*atan((double)a))/M_PI;
#define ARCOCOTAN(a) (float)(180*atan((double)(1/a)))/M_PI;
#define ARCOSEC(a) (float)(180*acos((double)(1/a)))/M_PI;
#define ARCOCOSEC(a) (float)(180*asin((double)(1/a)))/M_PI;
6 de 75
Documentación Visual Algory
La Interfase Gráfica de Visual Algory esta compuesta por los siguientes Elementos:
1. Barra de Menús
2. Barra de Herramientas
3. Ventana de Análisis
4. Ventana de Errores
5. Estatus Bar
6. Código
7. Simulación
7 de 75
Documentación Visual Algory
Compilación
Análsis Léxico
Análisis Sintáctico
Análisis Semántico
Simulación
Ejecución
Descripción
Visual Algory trabaja sobre un Archivo de Código Fuente (.COD), al cual se le realiza un Análisis
Léxico para determinar que Tokens están dentro de él, si no posee errores pasa al Análisis
Sintáctico el cual verifica que los Tokens cumplan con la Gramática de Visual Algory, si no posee
errores pasa al Análisis Semántico para identificar las Variables utilizadas dentro del Código
Fuente, los tipos de las mismas y correspondencias en declaraciones; si no posee errores se le
genera su Archivo de Tabla de Símbolos (.TBS), y su Archivo de Código Intermedio (.CIN), los
cuales serán utilizados para la Simulación, de manera que ésta se Ejecute dentro de Visual Algory.
8 de 75
Documentación Visual Algory
Visual Algory permite Simular un Código Fuente el cual es sometido a una serie de Análisis para
determinar si es correcto. Éstos son mostrados para identificar cada una de las Fases de
Compilación, los Análisis realizados al Código Fuente son:
1. Análisis Léxico
2. Análisis Sintáctico
3. Análisis Semántico
9 de 75
Documentación Visual Algory
Elementos de la Interfase
Barra de Menús
1. Menú Archivo
10 de 75
Documentación Visual Algory
2. Menú Edición
Deshacer: Invierte o elimina la Última entrada, que haya escrito en el Archivo de Código Activo.
Rehacer: Invierte la Acción del Comando Deshacer. Es decir Rehace la Última Acción Deshecha.
3. Menú Ver
11 de 75
Documentación Visual Algory
4. Menú Ayuda
12 de 75
Documentación Visual Algory
Elementos de la Interfase
Barra de Herramientas
La Barra de Herramientas de Visual Algory esta constituida por la siguiente Barra de Herramientas:
Nuevo
Abrir
Guardar
Vista Previa
Imprimir
Cerrar
Cortar
Copiar
Pegar
Buscar
Reemplazar
Deshacer
Rehacer
Compilar
13 de 75
Documentación Visual Algory
Elementos de la Interfase
Ventana de Análisis
Original Final
Delim * -
Enter -
Coment -
opRel1 oprel
opRel2 * oprel
opAsig2* Lexema
opAsig1 Lexema
opLog Lexema
opInc Lexema
opDec Lexema
char cadena
opArit Lexema
separ Lexema
cadena cadena
id * id
num1 * flotante
num3 * flotante
num2 * flotante
num0 numero
num4 * numero
termIns Lexema
error -
14 de 75
Documentación Visual Algory
1. Delimitador (Delim)
2. Enter (enter)
3. Comentarios (Comentario)
15 de 75
Documentación Visual Algory
16 de 75
Documentación Visual Algory
9. Carácter (caracter)
17 de 75
Documentación Visual Algory
18 de 75
Documentación Visual Algory
19 de 75
Documentación Visual Algory
20 de 75
Documentación Visual Algory
Implementación
Lexico.h
//---------------------------------------------------------------------------
#ifndef LexicoH
#define LexicoH
//---------------------------------------------------------------------------
#include <vcl/grids.hpp>
#include "Unit1.h"
//---------------------------------------
// UNIDAD LEXICO.H
//---------------------------------------
const int TOKREC = 22;
const int MAXTOKENS = 1000;
const int ANCHOTOKEN = 20;
const int ANCHOLEXEMA = 255;
const int ANCHOPALABRA = 10;
const int NOPALRES = 12;
char asNomAuto[TOKREC]
[ANCHOTOKEN]={"delim","enter","coment","opRel1","opRel2","opAsig2","opAsig1","opLog","opinc","opDec","char","opArit","
separado","cadena","id","num1","num3","num2","num0","num4","termIns","error"};
//--------------------------
class Automata
{
int iEdoAct;
char *psTexto;
char NextChar(int &iI) { return psTexto[iI++]; }
public :
int iReconoce(char *, int &, int &, int);
};
//---------------------------
//---------------------------
class Lexico
{
int asRenglon[MAXTOKENS];
int Error;
int iI,iIniToken,iNoTokens,iNoRenglon,iNoError;
char asTokens[MAXTOKENS][ANCHOTOKEN];
char asLexemas[MAXTOKENS][ANCHOLEXEMA];
char asError[MAXTOKENS][ANCHOLEXEMA];
char sLexema[255];
int DirEnter[MAXTOKENS/2];
Automata oAFD;
public :
void Analiza(char *);
void Inicia(void);
void Lexema(char *);
int EsId();
void Mostrar(TStringGrid *A,TPanel *P);
char* RetToken(int);
char* RetLexema(int i){return asLexemas[i];};
void Anade(char *);
int RetError(){return Error;};
char* RetDefError(int i){return asError[i];};
int RetRenError(int i){return asRenglon[i];};
int RetNoErro(){return iNoError;};
int RetiNoTokens(){return iNoTokens;};
int RetDirEnter(int);
};
//---------------------------------------------------------------------------
#endif
21 de 75
Documentación Visual Algory
Lexico.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Lexico.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
//---------------------------------------
// UNIDAD LEXICO.CPP
//---------------------------------------
//---------------------------------------
void Lexico::Lexema(char *pTexto)
{
int iL,iM=0;
for(iL=iIniToken;iL<iI;iL++,iM++)
sLexema[iM]=pTexto[iL];
sLexema[iM]='\0';
}
//---------------------------------------
void Lexico::Inicia(void)
{
iIniToken=iI=iNoTokens=iNoRenglon=iNoError=0;
for(int i=0;i<MAXTOKENS;i++)
{
asRenglon[i]=-1;
strcpy(asError[i],"");
}
for(int i=0;i<MAXTOKENS/2;i++)
{
DirEnter[i]=-1;
}
Error=false;
}
//---------------------------------------
void Lexico::Analiza(char *pTexto)
{
int iNoAuto,iRec;
while(iI<strlen(pTexto))
{
for(iNoAuto=0,iRec=FALSE;iNoAuto<TOKREC && !iRec;)
if (oAFD.iReconoce(pTexto,iIniToken,iI,iNoAuto))
iRec=TRUE;
else
iNoAuto++;
if (iRec)
{
Lexema(pTexto);
switch(iNoAuto)
{
//-------------- Automata delim--------------
case 0 : //strcpy(asTokens[iNoTokens],"delim");
break;
//-------------- Automata enter--------------
case 1 : //strcpy(asTokens[iNoTokens],"enter");
DirEnter[iNoRenglon]=iNoTokens-1;
iNoRenglon++;
break;
//-------------- Automata coment--------------
case 2 : //strcpy(asTokens[iNoTokens],"coment");
break;
//-------------- Automata opRel1--------------
case 3 : strcpy(asTokens[iNoTokens],"oprel");
break;
//-------------- Automata opRel2--------------
case 4 : strcpy(asTokens[iNoTokens],"oprel");
break;
//-------------- Automata opAsig2--------------
22 de 75
Documentación Visual Algory
case 5 : //strcpy(asTokens[iNoTokens],"opAsig2");
strcpy(asTokens[iNoTokens],sLexema);
break;
//-------------- Automata opAsig1--------------
case 6 : //strcpy(asTokens[iNoTokens],"opAsig1");
strcpy(asTokens[iNoTokens],sLexema);
break;
//-------------- Automata opLog--------------
case 7 : //strcpy(asTokens[iNoTokens],"opLog");
strcpy(asTokens[iNoTokens],sLexema);
break;
//-------------- Automata opinc--------------
case 8 : //strcpy(asTokens[iNoTokens],"opinc");
strcpy(asTokens[iNoTokens],sLexema);
break;
//-------------- Automata opDec--------------
case 9 : //strcpy(asTokens[iNoTokens],"opDec");
strcpy(asTokens[iNoTokens],sLexema);
break;
//-------------- Automata char--------------
case 10 : strcpy(asTokens[iNoTokens],"cadena");
break;
//-------------- Automata opArit--------------
case 11 : //strcpy(asTokens[iNoTokens],"opArit");
strcpy(asTokens[iNoTokens],sLexema);
break;
//-------------- Automata separado--------------
case 12 : //strcpy(asTokens[iNoTokens],"separado");
strcpy(asTokens[iNoTokens],sLexema);
break;
//-------------- Automata cadena--------------
case 13 : strcpy(asTokens[iNoTokens],"cadena");
break;
//-------------- Automata id--------------
case 14 : if(EsId())
{
strcpy(asTokens[iNoTokens],"id");
}
else
{
strcpy(asTokens[iNoTokens],sLexema);
}
break;
//-------------- Automata num1--------------
case 15 : strcpy(asTokens[iNoTokens],"flotante");
break;
//-------------- Automata num3--------------
case 16 : strcpy(asTokens[iNoTokens],"flotante");
break;
//-------------- Automata num2--------------
case 17 : strcpy(asTokens[iNoTokens],"flotante");
break;
//-------------- Automata num0--------------
case 18 : strcpy(asTokens[iNoTokens],"numero");
break;
//-------------- Automata num4--------------
case 19 : strcpy(asTokens[iNoTokens],"numero");
break;
//-------------- Automata termIns--------------
case 20 : //strcpy(asTokens[iNoTokens],"termIns");
strcpy(asTokens[iNoTokens],sLexema);
break;
//-------------- Automata error--------------
case 21 : //strcpy(asTokens[iNoTokens],"error");
Error = true;
break;
}
if(iNoAuto!=0&&iNoAuto!=1&&iNoAuto!=2&&iNoAuto!=21)
{
strcpy(asLexemas[iNoTokens++],sLexema);
23 de 75
Documentación Visual Algory
}
if(iNoAuto==21)
{
strcpy(asError[iNoError],sLexema);
asRenglon[iNoError]=iNoRenglon;
iNoError++;
}
}
else
iI++;
iIniToken=iI;
}
}
//---------------------------------------
int Automata::iReconoce(char *pTexto,int &iIniToken,int &iI,int iNoAuto)
{
char c;
psTexto=pTexto;
switch(iNoAuto)
{
//-------------- Automata delim--------------
case 0 : iEdoAct=0;
break;
//-------------- Automata enter--------------
case 1 : iEdoAct=3;
break;
//-------------- Automata coment--------------
case 2 : iEdoAct=5;
break;
//-------------- Automata opRel1--------------
case 3 : iEdoAct=10;
break;
//-------------- Automata opRel2--------------
case 4 : iEdoAct=13;
break;
//-------------- Automata opAsig2--------------
case 5 : iEdoAct=16;
break;
//-------------- Automata opAsig1--------------
case 6 : iEdoAct=19;
break;
//-------------- Automata opLog--------------
case 7 : iEdoAct=22;
break;
//-------------- Automata opinc--------------
case 8 : iEdoAct=26;
break;
//-------------- Automata opDec--------------
case 9 : iEdoAct=29;
break;
//-------------- Automata char--------------
case 10 : iEdoAct=32;
break;
//-------------- Automata opArit--------------
case 11 : iEdoAct=41;
break;
//-------------- Automata separado--------------
case 12 : iEdoAct=43;
break;
//-------------- Automata cadena--------------
case 13 : iEdoAct=45;
break;
//-------------- Automata id--------------
case 14 : iEdoAct=48;
break;
//-------------- Automata num1--------------
case 15 : iEdoAct=51;
break;
//-------------- Automata num3--------------
24 de 75
Documentación Visual Algory
case 16 : iEdoAct=59;
break;
//-------------- Automata num2--------------
case 17 : iEdoAct=68;
break;
//-------------- Automata num0--------------
case 18 : iEdoAct=72;
break;
//-------------- Automata num4--------------
case 19 : iEdoAct=75;
break;
//-------------- Automata termIns--------------
case 20 : iEdoAct=78;
break;
//-------------- Automata error--------------
case 21 : iEdoAct=80;
break;
}
while(iI<=strlen(psTexto))
switch(iEdoAct)
{
//-------------- Automata delim--------------
case 0 : c=NextChar(iI);
if (strchr(" \t\r",c) && c) iEdoAct=1; else
{ iI=iIniToken;
return FALSE; }
break;
case 1 : c=NextChar(iI);
if (strchr(" \t\r",c) && c) iEdoAct=1; else
if (strchr("!\"#$%&\'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€ ‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿\n\f",c)) iEdoAct=2; else
{ iI=iIniToken;
return FALSE; }
break;
case 2 : iI--;
return TRUE;
break;
//-------------- Automata enter--------------
case 3 : c=NextChar(iI);
if (strchr("\n",c) && c) iEdoAct=4; else
{ iI=iIniToken;
return FALSE; }
break;
case 4 : return TRUE;
break;
//-------------- Automata coment--------------
case 5 : c=NextChar(iI);
if (strchr("/",c) && c) iEdoAct=6; else
{ iI=iIniToken;
return FALSE; }
break;
case 6 : c=NextChar(iI);
if (strchr("*",c) && c) iEdoAct=7; else
{ iI=iIniToken;
return FALSE; }
break;
case 7 : c=NextChar(iI);
if (strchr("/",c) && c) iEdoAct=7; else
if (strchr("*",c) && c) iEdoAct=8; else
if (strchr(" !\"#$%&\'()+,-.0123456789:;<=>?
@áéíóúÁÉÍÓÚABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyzñÑ{|}~ €‚ƒ„…†‡ˆ
‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿\n\t\r\f",c) && c) iEdoAct=7; else
{ iI=iIniToken;
return FALSE; }
break;
case 8 : c=NextChar(iI);
if (strchr("/",c) && c) iEdoAct=9; else
if (strchr("*",c) && c) iEdoAct=8; else
25 de 75
Documentación Visual Algory
if (strchr(" !\"#$%&\'()+,-.0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyzñÑ{|}~ €‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—
˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿\n\t\r\f",c) && c) iEdoAct=7; else
{ iI=iIniToken;
return FALSE; }
break;
case 9 : return TRUE;
break;
//-------------- Automata opRel1--------------
case 10 : c=NextChar(iI);
if (strchr("!<>",c) && c) iEdoAct=11; else
if (strchr("=",c) && c) iEdoAct=11; else
{ iI=iIniToken;
return FALSE; }
break;
case 11 : c=NextChar(iI);
if (strchr("=",c) && c) iEdoAct=12; else
{ iI=iIniToken;
return FALSE; }
break;
case 12 : return TRUE;
break;
//-------------- Automata opRel2--------------
case 13 : c=NextChar(iI);
if (strchr("<>",c) && c) iEdoAct=14; else
{ iI=iIniToken;
return FALSE; }
break;
case 14 : c=NextChar(iI);
if (strchr("<>",c)) iEdoAct=15; else
if (strchr(" !\"#$%&\'()*+,-./0123456789:;?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€ ‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿\n\t\r\f",c)) iEdoAct=15; else
{ iI=iIniToken;
return FALSE; }
break;
case 15 : iI--;
return TRUE;
break;
//-------------- Automata opAsig2--------------
case 16 : c=NextChar(iI);
if (strchr("=",c) && c) iEdoAct=17; else
{ iI=iIniToken;
return FALSE; }
break;
case 17 : c=NextChar(iI);
if (strchr(" !\"#$%&\'()*+,-./0123456789:;<>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€ ‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿\n\t\r\f",c)) iEdoAct=18; else
{ iI=iIniToken;
return FALSE; }
break;
case 18 : iI--;
return TRUE;
break;
//-------------- Automata opAsig1--------------
case 19 : c=NextChar(iI);
if (strchr("+",c) && c) iEdoAct=20; else
if (strchr("-",c) && c) iEdoAct=20; else
if (strchr("*",c) && c) iEdoAct=20; else
if (strchr("/",c) && c) iEdoAct=20; else
if (strchr("%",c) && c) iEdoAct=20; else
{ iI=iIniToken;
return FALSE; }
break;
case 20 : c=NextChar(iI);
if (strchr("=",c) && c) iEdoAct=21; else
{ iI=iIniToken;
return FALSE; }
break;
26 de 75
Documentación Visual Algory
27 de 75
Documentación Visual Algory
{ iI=iIniToken;
return FALSE; }
break;
case 35 : c=NextChar(iI);
if (strchr("\'",c) && c) iEdoAct=36; else
if (strchr("Oo",c) && c) iEdoAct=37; else
if (strchr("Xx",c) && c) iEdoAct=38; else
if (strchr("nrt",c) && c) iEdoAct=34; else
{ iI=iIniToken;
return FALSE; }
break;
case 36 : return TRUE;
break;
case 37 : c=NextChar(iI);
if (strchr("01234567",c) && c) iEdoAct=39; else
{ iI=iIniToken;
return FALSE; }
break;
case 38 : c=NextChar(iI);
if (strchr("01234567",c) && c) iEdoAct=40; else
if (strchr("89ABCDEFabcde",c) && c) iEdoAct=40; else
if (strchr("f",c) && c) iEdoAct=40; else
{ iI=iIniToken;
return FALSE; }
break;
case 39 : c=NextChar(iI);
if (strchr("01234567",c) && c) iEdoAct=34; else
{ iI=iIniToken;
return FALSE; }
break;
case 40 : c=NextChar(iI);
if (strchr("01234567",c) && c) iEdoAct=34; else
if (strchr("89ABCDEFabcde",c) && c) iEdoAct=34; else
if (strchr("f",c) && c) iEdoAct=34; else
{ iI=iIniToken;
return FALSE; }
break;
//-------------- Automata opArit--------------
case 41 : c=NextChar(iI);
if (strchr("%*+-^/\\",c) && c) iEdoAct=42; else
{ iI=iIniToken;
return FALSE; }
break;
case 42 : return TRUE;
break;
//-------------- Automata separado--------------
case 43 : c=NextChar(iI);
if (strchr("(),[]{}",c) && c) iEdoAct=44; else
{ iI=iIniToken;
return FALSE; }
break;
case 44 : return TRUE;
break;
//-------------- Automata cadena--------------
case 45 : c=NextChar(iI);
if (strchr("\"",c) && c) iEdoAct=46; else
{ iI=iIniToken;
return FALSE; }
break;
case 46 : c=NextChar(iI);
if (strchr("\"",c) && c) iEdoAct=47; else
if (strchr(" !#$%&\'()*+,-./0123456789:;<=>?
@áéíóúÁÉÍÓÚABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyzÑñ{|}~ €‚ƒ„…†‡ˆ
‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿\n\t\r\f",c) && c) iEdoAct=46; else
{ iI=iIniToken;
return FALSE; }
break;
case 47 : return TRUE;
break;
//-------------- Automata id--------------
28 de 75
Documentación Visual Algory
case 48 : c=NextChar(iI);
if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",c) && c) iEdoAct=49; else
{ iI=iIniToken;
return FALSE; }
break;
case 49 : c=NextChar(iI);
if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",c) && c) iEdoAct=49; else
if (strchr("0123456789",c) && c) iEdoAct=49; else
if (strchr("_",c) && c) iEdoAct=49; else
if (strchr(" !\"#$%&\'()*+,-./:;<=>?@[\\]^`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³
´µ¶·¸¹º»¼½¾¿\n\t\r\f",c)) iEdoAct=50; else
{ iI=iIniToken;
return FALSE; }
break;
case 50 : iI--;
return TRUE;
break;
//-------------- Automata num1--------------
case 51 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=52; else
{ iI=iIniToken;
return FALSE; }
break;
case 52 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=52; else
if (strchr(".",c) && c) iEdoAct=53; else
if (strchr("Ee",c) && c) iEdoAct=54; else
{ iI=iIniToken;
return FALSE; }
break;
case 53 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=55; else
{ iI=iIniToken;
return FALSE; }
break;
case 54 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=56; else
if (strchr("+",c) && c) iEdoAct=57; else
if (strchr("-",c) && c) iEdoAct=57; else
{ iI=iIniToken;
return FALSE; }
break;
case 55 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=55; else
if (strchr("Ee",c) && c) iEdoAct=54; else
{ iI=iIniToken;
return FALSE; }
break;
case 56 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=56; else
if (strchr(".",c)) iEdoAct=58; else
if (strchr("Ee",c)) iEdoAct=58; else
if (strchr("+",c)) iEdoAct=58; else
if (strchr("-",c)) iEdoAct=58; else
if (strchr(" !\"#$%&\'()*,/:;<=>?@ABCDFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdfghijklmnopqrstuvwxyz{|}~ €
‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿\n\t\r\f",c)) iEdoAct=58; else
{ iI=iIniToken;
return FALSE; }
break;
case 57 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=56; else
{ iI=iIniToken;
return FALSE; }
break;
case 58 : iI--;
return TRUE;
break;
//-------------- Automata num3--------------
case 59 : c=NextChar(iI);
if (strchr(".",c) && c) iEdoAct=60; else
29 de 75
Documentación Visual Algory
30 de 75
Documentación Visual Algory
{ iI=iIniToken;
return FALSE; }
break;
case 71 : iI--;
return TRUE;
break;
//-------------- Automata num0--------------
case 72 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=73; else
{ iI=iIniToken;
return FALSE; }
break;
case 73 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=73; else
if (strchr(".",c) && c) iEdoAct=74; else
{ iI=iIniToken;
return FALSE; }
break;
case 74 : return TRUE;
break;
//-------------- Automata num4--------------
case 75 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=76; else
{ iI=iIniToken;
return FALSE; }
break;
case 76 : c=NextChar(iI);
if (strchr("0123456789",c) && c) iEdoAct=76; else
if (strchr(" !\"#$%&\'()*+,-./:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€ ‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿\n\t\r\f",c)) iEdoAct=77; else
{ iI=iIniToken;
return FALSE; }
break;
case 77 : iI--;
return TRUE;
break;
//-------------- Automata termIns--------------
case 78 : c=NextChar(iI);
if (strchr(";",c) && c) iEdoAct=79; else
{ iI=iIniToken;
return FALSE; }
break;
case 79 : return TRUE;
break;
//-------------- Automata error--------------
case 80 : c=NextChar(iI);
if (strchr(" !\"#$%&\'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€ ‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿\n\t\r\f",c) && c) iEdoAct=81; else
{ iI=iIniToken;
return FALSE; }
break;
case 81 : return TRUE;
break;
}
switch(iEdoAct)
{
case 2 : // Autómata delim
case 15 : // Autómata opRel2
case 18 : // Autómata opAsig2
case 50 : // Autómata id
case 58 : // Autómata num1
case 67 : // Autómata num3
case 71 : // Autómata num2
case 77 : // Autómata num4
--iI;
return TRUE;
}
return FALSE;
31 de 75
Documentación Visual Algory
}
//---------------------------------------
void Lexico::Mostrar(TStringGrid *A,TPanel *P)
{
int i;
if(iNoTokens==0)
{
A->RowCount= 2;
}
else
{
A->RowCount= iNoTokens+1;
}
for(i=0;i<=iNoTokens;i++)
{
A->Cells[0][(i+1)]=asTokens[i];
A->Cells[1][(i+1)]=asLexemas[i];
}
if(A->Cells[0][1]!="")
{
if(iNoTokens>1)
{
P->Caption=AnsiString(iNoTokens)+ " Tokens Reconocidos";
}
else
{
P->Caption="Un Token Reconocido";
}
}
}
//---------------------------------------------------------------------------
int Lexico::EsId(void)
{
char asPalRes[NOPALRES]
[ANCHOPALABRA]={"caracter","desde","entero","escribir","fin","flotante","hacer","inicio","leer","mientras","si","sino"};
int Res;
for(int i=0;i<NOPALRES;i++)
{
if(strcmp(asPalRes[i],sLexema)==0)
{
return 0;
}
Res = 1;
}
return Res;
}//---------------------------------------------------------------------------
char* Lexico::RetToken(int ae)
{
return asTokens[ae];
}
//---------------------------------------------------------------------------
void Lexico::Anade(char *ptok)
{
strcpy(asTokens[iNoTokens],ptok);
strcpy(asLexemas[iNoTokens],ptok);
}
//---------------------------------------------------------------------------
int Lexico::RetDirEnter(int Tok)
{
if(Tok<=DirEnter[0])
{
return 1;
}
for(int i=0;i<iNoRenglon;i++)
{
if(Tok>=DirEnter[i]&&Tok<=DirEnter[i+1])
{
return i+2;
}
}
32 de 75
Documentación Visual Algory
if(Tok>=DirEnter[iNoRenglon-1])
{
return iNoRenglon+1;
}
}
//---------------------------------------------------------------------------
#pragma package(smart_init)
33 de 75
Documentación Visual Algory
34 de 75
Documentación Visual Algory
Como la Gramática a utilizar posee Recursividad a la Izquierda, fue necesario el realizar ERI, FI,
Primeros, Siguientes y Tabla M para poder aplicar un Análisis Sintáctico.
35 de 75
Documentación Visual Algory
Bitácora:
36 de 75
Documentación Visual Algory
Sig( {{Programa}} )= $
Sig( {{ListaVar}} )= inicio
Sig( {{ListaId}} )= entero flotante caracter inicio
Sig( {{R1}} )= entero flotante caracter inicio
Sig( {{BloqueProg}} )= $
Sig( {{ListaProp}} )= }
Sig( {{PropSi}} )= si mientras hacer desde id leer escribir }
Sig( {{R2}} )= si mientras hacer desde id leer escribir }
Sig( {{PropMientras}} )= si mientras hacer desde id leer escribir }
Sig( {{PropHacer}} )= si mientras hacer desde id leer escribir }
Sig( {{PropDesde}} )= si mientras hacer desde id leer escribir }
Sig( {{PropAsig}} )= si mientras hacer desde id leer escribir } ( ++ -- ! numero flotante
Sig( {{PropLeer}} )= si mientras hacer desde id leer escribir }
Sig( {{PropEscribir}} )= si mientras hacer desde id leer escribir }
Sig( {{A1}} )= )
Sig( {{R3}} )= )
Sig( {{Exp}} )= ) ;
Sig( {{E}} )= oprel ) ;
Sig( {{F}} )= + - * / % ^ || && oprel ) ;
Sig( {{R5}} )= + - * / % ^ || && oprel ) ;
Sig( {{E2}} )= oprel ) ;
Sig( {{R4}} )= ) ;
Bitácora:
37 de 75
Documentación Visual Algory
38 de 75
Documentación Visual Algory
39 de 75
Documentación Visual Algory
Implementación
Sintáctico.h
//---------------------------------------------------------------------------
#ifndef SintacticoH
#define SintacticoH
//---------------------------------------------------------------------------
#include "Lexico.h"
#define MAX 3000
const int NOVTS = 36;
const int NOVNS = 23;
const int ANCHOVNS = 16;
const int NOPROD = 53;
const int NOYES = 10;
const int NOENT = 89;
const int MAXDIS = 1000;
//---------------------------------------------------------------------------
class Pila
{
private:
char Datos[MAX][255];
int Tope;
public:
void Inicia();
void Push (char*);
char* Pop ();
bool Empty ();
char* E(int);
int RetTope();
char* StackTop();
};
//---------------------------------------------------------------------------
class Sintactico
{
private:
Pila oPila;
char VTS[NOVTS][ANCHOTOKEN];
char VNS[NOVNS][ANCHOVNS];
int Prod[NOPROD][NOYES+2];
int M[NOENT][3];
int iNoDis;
int DIS[MAXDIS];
int iNoProd;
int EsTerminal(char *);
int Busqueda(char* , char*);
void MeterYes(int);
char Error[MAXDIS][ANCHOTOKEN];
int TipoError[MAXDIS];
int RenglonError[MAXDIS];
int iNoError;
int iNoRenglon;
public:
void Inicia();
int Analiza(Lexico);
char* RetProdNo(int);
char* RetVTNo(int i){return VTS[i];};
char* RetVNNo(int i){return VNS[i];};
int RetValM(int,int);
int RetNoDis(){return iNoDis;};
int RetDIS(int i){return DIS[i];};
int RetElemProdNo(int i, int j){return Prod[i][j];};
char* RetError(int i){return Error[i];};
int RetRenError(int i){return RenglonError[i];};
int RetTipoError(int i){return TipoError[i];};
int RetNoError(){return iNoError;};
40 de 75
Documentación Visual Algory
};
//---------------------------------------------------------------------------
#endif
Sintáctico.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Sintactico.h"
#include "Lexico.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
char sProd[255];
//---------------------------------------------------------------------------
void Pila::Inicia()
{
Tope=-1;
}
//---------------------------------------------------------------------------
void Pila::Push (char* Elemento)
{
if((Tope+1)==MAX)
{
Application->MessageBox("Desbordamiento","Error",MB_OK);
}
else
{
Tope++;
strcpy(Datos[Tope],Elemento);
}
}
//---------------------------------------------------------------------------
char* Pila::Pop ()
{
char* Elemento;
if(Empty())
{
Application->MessageBox("Subdesdordamiento","Error",MB_OK);
}
else
{
Elemento=Datos[Tope];
Tope--;
}
return Elemento;
}
//---------------------------------------------------------------------------
bool Pila::Empty ()
{
if(Tope==-1)
{
return true;
}
else
{
return false;
}
}
//---------------------------------------------------------------------------
char* Pila::E(int i)
{
return Datos[i];
}
//---------------------------------------------------------------------------
41 de 75
Documentación Visual Algory
int Pila::RetTope()
{
return Tope;
}
//---------------------------------------------------------------------------
char* Pila::StackTop()
{
char* Elemento="";
if(Empty())
{
Application->MessageBox("Pila Vacía","Error",MB_OK);
}
else
{
Elemento=Datos[Tope];
}
return Elemento;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void Sintactico::Inicia()
{
iNoDis=iNoError=iNoRenglon=0;
char AuxVNS[NOVNS][ANCHOVNS]={"","Programa\0","ListaVar\0","ListaId\0","R1\0","BloqueProg\0","ListaProp\
0","PropSi\0","R2\0","PropMientras\0","PropHacer\0","PropDesde\0","PropAsig\0","PropLeer\0","PropEscribir\
0","A1\0","R3\0","Exp\0","E\0","F\0","R5\0","E2\0","R4\0"};
for(int i=0;i<NOVNS;i++)
{
strcpy(VNS[i],AuxVNS[i]);
}
char AuxVTS[NOVTS][ANCHOTOKEN]={"","entero\0","flotante\0","caracter\0","id\0",",\0",";\0","inicio\0","{\0","}\
0","fin\0","si\0","(\0",")\0","sino\0","mientras\0","hacer\0","desde\0","=\0","leer\0","escribir\0","cadena\0","++\0","--\0","!\
0","numero\0","+\0","-\0","*\0","/\0","%\0","^\0","||\0","&&\0","oprel\0","$\0"};
for(int i=0;i<NOVTS;i++)
{
strcpy(VTS[i],AuxVTS[i]);
}
int AuxProd[NOPROD][NOYES+2]={ 1,2,2,5,0,0,0,0,0,0,0,0, //Programa -> ListaVar
BloqueProg
2,3,-1,3,2,0,0,0,0,0,0,0, //ListaVar -> entero ListaId
ListaVar
2,3,-2,3,2,0,0,0,0,0,0,0, //ListaVar -> flotante ListaId
ListaVar
2,3,-3,3,2,0,0,0,0,0,0,0, //ListaVar -> caracter ListaId
ListaVar
2,0,0,0,0,0,0,0,0,0,0,0, //ListaVar -> £
3,2,-4,4,0,0,0,0,0,0,0,0, //ListaId -> id R1
4,2,-5,3,0,0,0,0,0,0,0,0, //R1 -> , ListaId
4,1,-6,0,0,0,0,0,0,0,0,0, //R1 -> ;
5,5,-7,-8,6,-9,-10,0,0,0,0,0, //BloqueProg -> inicio { ListaProp }
fin
6,2,7,6,0,0,0,0,0,0,0,0, //ListaProp -> PropSi ListaProp
6,2,9,6,0,0,0,0,0,0,0,0, //ListaProp -> PropMientras
ListaProp
6,2,10,6,0,0,0,0,0,0,0,0, //ListaProp -> PropHacer
ListaProp
6,2,11,6,0,0,0,0,0,0,0,0, //ListaProp -> PropDesde
ListaProp
6,2,12,6,0,0,0,0,0,0,0,0, //ListaProp -> PropAsig ListaProp
6,2,13,6,0,0,0,0,0,0,0,0, //ListaProp -> PropLeer ListaProp
6,2,14,6,0,0,0,0,0,0,0,0, //ListaProp -> PropEscribir
ListaProp
6,0,0,0,0,0,0,0,0,0,0,0, //ListaProp -> £
7,8,-11,-12,17,-13,-8,6,-9,8,0,0, //PropSi -> si ( Exp ) { ListaProp }
R2
8,4,-14,-8,6,-9,0,0,0,0,0,0, //R2 -> sino { ListaProp }
8,0,0,0,0,0,0,0,0,0,0,0, //R2 -> £
9,7,-15,-12,17,-13,-8,6,-9,0,0,0, //PropMientras -> mientras ( Exp )
{ ListaProp }
42 de 75
Documentación Visual Algory
for(int i=0;i<NOPROD;i++)
{
for(int j=0;j<NOYES+2;j++)
{
Prod[i][j]=AuxProd[i][j];
}
}
int AuxM[NOENT][3] = { 1,35,0, //X: {{Programa}} A: $
1,1,0, //X: {{Programa}} A: entero
1,2,0, //X: {{Programa}} A: flotante
1,3,0, //X: {{Programa}} A: caracter
1,7,0, //X: {{Programa}} A: inicio
2,1,1, //X: {{ListaVar}} A: entero
2,2,2, //X: {{ListaVar}} A: flotante
2,3,3, //X: {{ListaVar}} A: caracter
2,7,4, //X: {{ListaVar}} A: inicio
3,4,5, //X: {{ListaId}} A: id
4,5,6, //X: {{R1}} A: ,
4,6,7, //X: {{R1}} A: ;
5,7,8, //X: {{BloqueProg}} A: inicio
6,11,9, //X: {{ListaProp}} A: si
6,15,10, //X: {{ListaProp}} A: mientras
6,16,11, //X: {{ListaProp}} A: hacer
6,17,12, //X: {{ListaProp}} A: desde
6,4,13, //X: {{ListaProp}} A: id
6,19,14, //X: {{ListaProp}} A: leer
6,20,15, //X: {{ListaProp}} A: escribir
6,9,16, //X: {{ListaProp}} A: }
7,11,17, //X: {{PropSi}} A: si
8,14,18, //X: {{R2}} A: sino
8,11,19, //X: {{R2}} A: si
8,15,19, //X: {{R2}} A: mientras
8,16,19, //X: {{R2}} A: hacer
8,17,19, //X: {{R2}} A: desde
43 de 75
Documentación Visual Algory
for(int i=0;i<NOENT;i++)
{
for(int j=0;j<3;j++)
{
M[i][j]=AuxM[i][j];
}
44 de 75
Documentación Visual Algory
}
}
//---------------------------------------------------------------------------
int Sintactico::EsTerminal(char *px)
{
for(int i=1;i<NOVTS;i++)
{
if(strcmp(px,VTS[i])==0)
{
return 1;
}
}
return 0;
}
//---------------------------------------------------------------------------
int Sintactico::Busqueda(char *px, char *pa)
{
int iIndx, iInda;
for(int i=0;i<NOVNS;i++)
{
if(strcmp(px,VNS[i])==0)
{
iIndx=i;
break;
}
}
for(int i=0;i<NOVTS;i++)
{
if(strcmp(pa,VTS[i])==0)
{
iInda=i;
break;
}
}
for(int i=0;i<NOENT;i++)
{
if(M[i][0]==iIndx && M[i][1]==iInda)
{
return M[i][2];
}
}
return -1;
}
//---------------------------------------------------------------------------
void Sintactico::MeterYes(int iNoProd)
{
int iNoyes=Prod[iNoProd][1];
int iCol=iNoyes+2;
for(int i=1;i<=iNoyes;i++)
{
if((Prod[iNoProd][iCol-i])<0)
{
oPila.Push(RetVTNo(-Prod[iNoProd][iCol-i]));
}
else
{
oPila.Push(RetVNNo(Prod[iNoProd][iCol-i]));
}
}
}
//---------------------------------------------------------------------------
int Sintactico::Analiza(Lexico oAnalex)
{
int AE, Error1=false;
char X[ANCHOTOKEN], A[ANCHOTOKEN];
oPila.Inicia();
oPila.Push("$");
//Símbolo de inicio
oPila.Push("Programa");
AE=0;
45 de 75
Documentación Visual Algory
oAnalex.Anade("$");
do
{
strcpy(X,oPila.StackTop());
strcpy(A,oAnalex.RetToken(AE));
if(EsTerminal(X))
{
if(strcmp(X,A)==0)
{
oPila.Pop();
AE++;
}
else
{
Error1=true;
strcpy(Error[iNoError],X);
TipoError[iNoError]=1;
iNoRenglon=oAnalex.RetDirEnter(AE);
RenglonError[iNoError]=iNoRenglon;
iNoError++;
oPila.Pop();
AE++;
//return 1;
}
}
else
{
if((iNoProd=Busqueda(X,A))>=0)
{
oPila.Pop();
MeterYes(iNoProd);
DIS[iNoDis++]=iNoProd;
}
else
{
AnsiString DefinicionError1;
DefinicionError1 = AnsiString(X) + " : " + AnsiString(A);
strcpy(Error[iNoError],DefinicionError1.c_str());
TipoError[iNoError]=2;
iNoRenglon=oAnalex.RetDirEnter(AE);
RenglonError[iNoError]=iNoRenglon;
iNoError++;
return 2;
}
}
}while(strcmp(X,"$")!=0);
if(Error1)
{
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
char* Sintactico::RetProdNo(int iNoProd)
{
strcpy(sProd,RetVNNo(Prod[iNoProd][0]));
strcat(sProd," -> ");
for(int i=0;i<Prod[iNoProd][1];i++)
{
if(Prod[iNoProd][i+2]<0)
{
strcat(sProd,RetVTNo(-Prod[iNoProd][i+2]));
}
else
{
strcat(sProd,RetVNNo(Prod[iNoProd][i+2]));
}
strcat(sProd," ");
}
return sProd;
46 de 75
Documentación Visual Algory
}
//---------------------------------------------------------------------------
int Sintactico::RetValM(int iNoEnt,int Col)
{
return M[iNoEnt][Col];
}
//---------------------------------------------------------------------------
47 de 75
Documentación Visual Algory
Este Análisis se realiza en base al Léxico realizado, sigue un Algoritmo de Comprobación de Tipos,
Flujo de Control y Unicidad que permiten determinar el significado de las palabras utilizadas en
contextos específicos de una manera sistemática y objetiva, haciendo referencia a una gama de
expresiones. El Análisis Semántico identifica 3 tipos de incoherencias:
48 de 75
Documentación Visual Algory
Implementación
Semántico.h
//---------------------------------------------------------------------------
#ifndef SemanticoH
#define SemanticoH
//---------------------------------------------------------------------------
#include "Lexico.h"
#define MAXVariables 500 //Cantidad de Variables Declaradas
#define MAXTipoDeclaraciones 3 //Cantidad de Tipos de Declaraciones
#define MAXTipos 3 //Cantidad de Tipos de Datos
#define MAXTipoEstCont 2 //Cantidad de Estructuras de Control a Revisar los Tipos
#define MAXTermTipoEstCont 2 //Cantidad de Terminaciones para las Estructuras de Control a Revisar los Tipos
#define MAXErrores 1000
//---------------------------------------------------------------------------
class Semantico
{
private:
int iNoError;
int iNoRenglon;
int iNoVariables;
char Errores[MAXErrores][255];
char DefID[255];
char DefTermDec[255];
char DefIniProg[255];
char DefAsig[255];
char DefDesde[255];
char DefSepDesde[255];
char DefTermAsig[255];
char DefEstCont[MAXTipoEstCont][255];
char DefTermEstCont[MAXTermTipoEstCont][255];
int TipoError[MAXErrores];
int RenError[MAXErrores];
char TipoDeclaraciones[MAXTipoDeclaraciones][255];
char TipoDato[MAXTipos][255];
int TipoTipoDato[MAXTipos];
char Variables[MAXVariables][255];
int TipoVariables[MAXVariables];
int Insertar(char*,int);
int Buscar(char*);
int EsDeclaracion(char*,int&);
int EsDato(char*,int&);
int EsEstructuradeControl(char*);
int EsTerminodeEstructuradeControl(char*);
public:
void Inicia();
int Analiza(Lexico);
int RetiNoError(){return iNoError;};
char* RetError(int i){return Errores[i];};
int RetTipoError(int i){return TipoError[i];};
int RetRenError(int i){return RenError[i];};
char* RetTipoDeclaraciones(int i){return TipoDeclaraciones[i];};
int RetiNoVariables(){return iNoVariables;};
int RetTipoVariables(int i){return TipoVariables[i];};
char* RetVariables(int i){return Variables[i];};
};
//---------------------------------------------------------------------------
#endif
49 de 75
Documentación Visual Algory
Elementos de la Interfase
Ventana de Errores
En esta ventana se muestran los errores que se encuentran en el Código Fuente al realizar una
Compilación (Análisis Léxico, Sintáctico y Semántico).
1. Evento: Esta Columna Muestra el tipo de Error ocurrido (Léxico, Sintáctico ó Semántico).
2. Descripción: Esta Columna Informa Detalladamente el Tipo de Error ocurrido.
3. Línea: La última Columna indica en que Línea del SynEdit aparece dicho Error.
50 de 75
Documentación Visual Algory
Se presentan cuando no se cumplen las Reglas de la Gramática de Visual Algory. Por ejemplo:
Error de Sintaxis
Se da cuando no se siguen las Reglas de la Gramática de Visual Algory.
51 de 75
Documentación Visual Algory
52 de 75
Documentación Visual Algory
Elementos de la Interfase
Estatus Bar
53 de 75
Documentación Visual Algory
Elementos de la Interfase
Código
1. Código Fuente
Se constituye de un SynEdit
Este Componente del Código, permite estructurar un Código Fuente, al cual se le realizarán los
Análisis pertinentes y la Simulación adecuada, consta de un Gutter.
54 de 75
Documentación Visual Algory
Instrucciones Reconocidas
1. Instrucción si-sino
55 de 75
Documentación Visual Algory
2. Instrucción mientras
3. Instrucción hacer-mientras
56 de 75
Documentación Visual Algory
4. Instrucción desde
5. Instrucción leer
6. Instrucción escribir
57 de 75
Documentación Visual Algory
Autocompletar
El SynEdit posee una función denominada Autocompletar, la cual consiste en llenar con ciertos
caracteres una entrada válida para esta función. La forma de activar esta función es:
inicio
{
|
}
fin
L, lo que produce:
leer(|);
si(|)
{
si(|)
{
}
sino
{
M, lo que produce:
mientras(|)
{
H, lo que produce:
hacer
{
}mientras(|);
D, lo que produce:
desde(|;;)
{
58 de 75
Documentación Visual Algory
escribir(|);
E, lo que produce:
entero |;
F, lo que produce:
flotante |;
C, lo que produce:
caracter |;
59 de 75
Documentación Visual Algory
El código intermedio es una estructura de código cuya complejidad está entre el código fuente en
lenguaje de alto nivel y el código maquina, los códigos intermedios se pueden considerar como la
interfaz entre el generador de código y las fases previas del compilador. Las clases de código
intermedio usadas más comunes son:
Notación postfija: x y + x y * -
Código de tres direcciones (cuádruples): Op. Arg1. Arg2. Res.
Código de dos direcciones (triples): Op.Arg1. Arg2.
60 de 75
Documentación Visual Algory
El tipo de código implementado fue el de la notación postfija para así poder implementar una
maquina de pila abstracta. Las instrucciones usadas para representar el código intermedio son:
Aritméticas y lógicas:
{"==","+","-","*","/","%","^","|","&","++","--","<","<=","==","!=",">=",">","!","||","&&"}
Manipulación de pila:
Control de flujo:
Ejemplo:
61 de 75
Documentación Visual Algory
Elementos de la Interfase
Simulación
1. Ejecución
2. Secuencia de Operaciones
3. Barra de Opciones
4. Contenedor del Código Intermedio
62 de 75
Documentación Visual Algory
Ejecución
Es un SynEdit en el cual se mostrará la Simulación del Código Intermedio, funcionará como una
consola de MS-DOS en la cual se podrá mostrar y recibir datos. En la Lectura de datos se mostrará
un cursor a la espera de información, para aceptar dicha información es necesario dar un Enter;
para cancelar la Simulación será necesario dar ESC.
Secuencia de Operaciones
Barra de Opciones
Es un Panel en el cual se pueden establecer las Opciones de Simulación del Código Intermedio,
cuenta con los siguientes elementos:
63 de 75
Documentación Visual Algory
1. C.I.
2. Variables
3. Pila
C.I.
Variables
Pila
64 de 75
Documentación Visual Algory
Mensajes de Error
1. Mensaje de Modificación
Ocurre al Abrir, Cerrar ó Crear un Archivo Nuevo y no se han guardado los cambios del Archivo de
Código Fuente Actual, es una medida de seguridad para evitar perder un Archivo modificado.
65 de 75
Documentación Visual Algory
4. Mensaje de Ejecución
Ocurre al haber un error en la Compilación del Código Fuente, es muy posible que sea por que el
código posea errores que pasaron desapercibidos por alguno de los análisis realizados, sin
embargo otra causa podría ser que la cantidad del código a generar sea demasiado y no pueda ser
procesado.
6. Mensaje de Búsqueda
7. Mensaje de Simulación
66 de 75
Documentación Visual Algory
8. Mensaje de Simulación
9. Mensaje de Simulación
Se muestra al Pausar la Simulación del Código Intermedio actual, esto debido a que se presionó
ESC en una entrada de datos durante la Simulación.
Se presenta cuando al Simular el Código Intermedio ocurre un error, la razón puede ser el tamaño
del Código a Simular.
67 de 75
Documentación Visual Algory
68 de 75
Documentación Visual Algory
Sucede al no poder Guardar la Tabla de Símbolos del Archivo de Código Fuente Actual, es
completamente ajeno al funcionamiento de Visual Algory, ya que no se puede realizar el proceso
de Fijación del Archivo.
Aparece cuando no se puede Cargar el Archivo de Tabla de Símbolos del Archivo de Código
Fuente Actual, es completamente ajeno al funcionamiento de Visual Algory, ya que no se puede
realizar el proceso de Lectura del Archivo, es posible que no exista dicho archivo.
69 de 75
Documentación Visual Algory
Surge cuando en una Lectura de la Simulación se esperaba un entero como entrada y no se dio tal
tipo de dato.
Emerge cuando en una Lectura de la Simulación se esperaba un flotante como entrada y no se dio
tal tipo de dato.
70 de 75
Documentación Visual Algory
Glosario
Compilador
Fases de Compilación
Conceptualmente un Compilador opera en fases, cada una de las cuales Transforma al Programa
Fuente de una Representación a otra. Las cuales son:
1. Análisis Léxico
2. Análisis Sintáctico
3. Análisis Semántico
4. Generación de Código Intermedio
5. Optimización de Código
6. Generación de Código Ensamblador
7. Generación del Programa Objeto
En la Práctica se pueden agrupar algunas fases, y las Representaciones intermedias entre las
fases agrupadas no necesitan ser construidas explícitamente.
Análisis Léxico
Algoritmo que reconoce Tokens de a cuerdo a Expresiones Regulares, para cumplir con la primera
fase de un Compilador. Su principal función consiste en leer los caracteres de entrada y elaborar
como salida una secuencia de Componentes Léxicos que utiliza el Analizador Sintáctico para hacer
el Análisis Sintáctico. Para realizar Analizadores Léxicos se puede utilizar el PS1 creado por el Ing.
Francisco Ríos Acosta.
Análisis Sintáctico
Algoritmo que determina si un Código Fuente esta cumpliendo con las Reglas Sintácticas de un
Lenguaje, especificadas en la Gramática de dicho Lenguaje, cumpliendo con esto con la segunda
fase de un Compilador. Para realizar Analizadores Sintácticos se puede utilizar el E-Syntax creado
por Gerardo Emilio Veloz Flores.
Análisis Semántico
Es un Algoritmo que obtiene los Identificadores utilizados en el Código Fuente clasificándolos por el
tipo y asignándolos a una Tabla de Símbolos. Lo hace cumpliendo con lo siguientes requisitos:
Algoritmo que obtiene un Código entre el Código Fuente y el Ensamblador que permite definir
Datos, Estructuras de Control, Entrada y Salida de Datos. Ese Código se obtiene en base a una
71 de 75
Documentación Visual Algory
Tabla de Equivalencias que define cada una de las Microinstrucciones que han de ser ejecutadas
por una Computadora.
72 de 75
Documentación Visual Algory
Optimización de Código
Algoritmo que elimina instancias innecesarias para la elaboración del Código en Ensamblador, que
permitirá ejecutar la aplicación establecida en el Código Fuente.
Algoritmo que obtiene el Código Ensamblador a partir del Código Intermedio, el cual puede ser
interpretado de manera directa por una Computadora. Este código se basa en la utilización de los
registros del CPU y las regiones de Segmentos del mismo.
Código Algory:
inicio
{
escribir("Hola");
}
fin
Código Ensamblador:
.model small
.stack
.data
Cadena1 DB 'Hola.$'
.code
programa:
mov ax, @data
mov ds, ax
mov dx, offset Cadena1
mov ah, 9
int 21h
end programa
Algoritmo que obtiene el Programa Objeto, que es un Programa a nivel de Lenguaje Máquina que
resulta de la compilación de un Programa Fuente.
Es una Instancia Individual de un Tipo de Símbolo que es representada por una Expresión Regular.
En pocas palabras representa un tipo de dato de un Código Fuente, es decir son Cadenas de
Caracteres que tienen un cierto Significado. Por Ejemplo:
X = 10;
Token Lexema
Identificador X
Operador de Asignación =
Número 10
Terminador de Instrucción ;
73 de 75
Documentación Visual Algory
Expresión Regular
Notación que nos permite definir de Manera Precisa, al conjunto de Cadenas que forman el
Lenguaje representado por un Token. Por Ejemplo:
74 de 75