/* *********************** analizlex.c ****************************/
#include
#include
#include "global.h"
#include
int valcomplex = NINGUNO; /* valor del atributo del componente lexico */
int numlinea = 1;
extern entrada tablasimb[MAXSIMB]; /* tabla de simbolos */
char buflex[TAMBUFF];
//int numlinea = 1;
//int valcomplex = NINGUNO;
int analex() /* analizador lexico */
{
int t;
while(1) {
t = getchar();
if(t == ' ' || t == '\t')
; /* elimina espacios en blanco */
else if (t == '\n')
numlinea = numlinea + 1;
else if (isdigit(t)) { /* t es un digito */
ungetc(t, stdin);
scanf("%d", &valcomplex);
return NUM;
}
else if (isalpha(t)) { /* t es una letra */
int p, b=0;
while (isalnum(t)) { /* t es alfanumerico */
buflex[b] = t;
t = getchar();
b = b+1;
if (b >= TAMBUFF)
error("error de compilador");
}
buflex[b] = FDC;
if (t != EOF)
ungetc(t, stdin);
p = busca(buflex);
if (p == 0)
p = inserta(buflex, ID);
valcomplex = p;
return tablasimb[p].complex;
}
else if(t == EOF)
return FIN;
else {
valcomplex = NINGUNO;
return t;
}
}
}
// **** aanalizsint.cpp **** \\
#include
#include
#include
#include "global.h"
extern int valcomplex; /* valor del atributo del componente lexico */
extern int numlinea;
extern entrada tablasimb[MAXSIMB]; /* tabla de simbolos */
int preanalisis;
void analsint() /* analiza sintecticamente y traduce la lista de la expresion */
{
preanalisis = analex();
while (preanalisis != FIN) {
expr(); parea(';');
}
}
void expr()
{
int t;
termino();
while(1)
switch (preanalisis) {
case '+': case '-':
t = preanalisis;
parea (preanalisis); termino(); emite(t, NINGUNO);
continue;
default:
return;
}
}
void termino()
{
int t;
factor();
while(1)
switch(preanalisis) {
case '*': case '/': case DIV: case MOD:
t = preanalisis;
parea (preanalisis); factor(); emite(t, NINGUNO);
continue;
default:
return;
}
}
void factor()
{
switch(preanalisis) {
case '(':
parea('(');
expr();
parea(')');
break;
case NUM:
emite(NUM, valcomplex); parea(NUM); break;
case ID:
emite(ID, valcomplex); parea(ID); break;
default:
error("error de sintaxis");
}
}
void parea (int t)
{
if(preanalisis == t)
preanalisis = analex();
else error ("error de sintaxis");
}
// **** emisor.cpp **** \\
#include
#include
#include
#include "global.h"
extern int valcomplex; /* valor del atributo del componente lexico */
extern int numlinea;
extern entrada tablasimb[MAXSIMB]; /* tabla de simbolos */
void emite (int t,int tval) /* genera la salida */
{
switch(t) {
case '+': case '-': case '*': case '/':
printf("%c\n",t); break;
case DIV:
printf("%DIV\n"); break;
case MOD:
printf("%MOD"); break;
case NUM:
printf("%d\n", tval); break;
case ID:
printf("%s\n", tablasimb[tval].aplex); break;
default:
printf("complex %d, valcomplex %d\n", t, tval);
}
}
// **** error.cpp **** \\
#include
#include
#include
#include "global.h"
extern int valcomplex; /* valor del atributo del componente lexico */
extern int numlinea;
extern entrada tablasimb[MAXSIMB]; /* tabla de simbolos */
void error(char *m) /* genera todos los mensajes de error */
{
fprintf(stderr, "linea %d: %s\n", numlinea, m);
exit(1); /* terminacion sin exito */
}
// **** inic.cpp **** \\
#include
#include
#include
#include "global.h"
extern int valcomplex; /* valor del atributo del componente lexico */
extern int numlinea;
extern entrada tablasimb[MAXSIMB]; /* tabla de simbolos */
struct _entrada palsclave[] = {
"div",DIV,"mod", MOD,0,0
};
void inic() /* carga las palabras clave en la tabla de simbolos */
{
struct _entrada *p = palsclave;
for (; p->complex; p++)
inserta(p->aplex, p->complex);
}
// **** principal.cpp **** \\
#include
#include
#include
#include "global.h"
extern int valcomplex;
extern int numlinea;
entrada tablasimb[MAXSIMB];
int main()
{
inic();
analsint();
exit(0); /* terminacion con exito */
}
// **** simbolos.cpp **** \\
#include
#include
#include "global.h"
extern int valcomplex; /* valor del atributo del componente lexico */
extern int numlinea;
extern entrada tablasimb[MAXSIMB]; /* tabla de simbolos */
char lexemas[MAXLEX];
int ultcar = -1; /* ultima posicion usada en los lexemas */
int ultent = 0; /* ultima posicion usada en tablasimb */
int busca(char *s) /*debuelve la posicion del elemento de entrada de s */
{
int p;
for(p=ultent;p>0;p=p-1)
if(strcmp(tablasimb[p].aplex, s) == 0)
return p;
return 0;
}
int inserta(char *s, int clex) /* debuelve la posicion del elemento de entrada de s */
{
int lon;
lon = strlen(s); /* strlen evvalua la longitud de s */
if (ultent + 1 >= MAXSIMB)
error("tabla simbolos llena");
if (ultcar + lon + 1 >= MAXLEX)
error("matriz de lexema llena");
ultent = ultent + 1;
tablasimb[ultent].complex = clex;
tablasimb[ultent].aplex = &lexemas[ultcar + 1];
ultcar = ultcar + lon + 1;
strcpy(tablasimb[ultent].aplex, s);
return ultent;
}
// **** global.h **** \\
#include
#include
#include
#include
#define MAXLEX 999 /* tamano de la matriz de lexema */
#define MAXSIMB 100 /* tamano de la tabla de simbolos */
#define TAMBUFF 128
#define NINGUNO -1
#define FDC '\0'
#define NUM 256
#define DIV 257
#define MOD 258
#define ID 259
#define FIN 260
//int valcomplex = NINGUNO; /* valor del atributo del componente lexico */
//int numlinea = 1;
typedef struct _entrada { /* forma del elemento de entrada de la tabla de simbolos */
char *aplex;
int complex;
}entrada;
//entrada tablasimb[MAXSIMB]; /* tabla de simbolos */
//void analizsint();
int analex();
int busca(char *s);
void inic();
void error(char *m);
void emite (int t,int tval);
void analsint();
int inserta(char *s, int clex);
void expr();
//void expre();
void termino();
void factor();
void parea (int t);