jueves, 14 de enero de 2010

Compilador libro

//principal.cpp//

#include "global.h"

main(){

inic();

analsint();

exit(0);}

//global.h//

#include

#include

#define TAMBUFF 128

#define ninguno -1

#define FDC '\0'

#define NUM 256

#define DIV 257

#define MOD 258

#define ID 259

#define FIN 260int valcomplex;int numlinea;

struct entrada{ char *aplex; int complex;};

struct entrada tablasimb[];

//analizlex.cpp//

#include "global.h"

char buflex [TAMBUFF];

int numlinea=1;

int valcomplex=NINGUNO;

int analex()

{

int t;

while(1) t= getchar();

if(t=='' t=='/t') ;

else if (t=='/n') numlinea=numlinea + 1;

else if(isdigit(t))

{ ungetc(t,stdin);

cin>>valcomplex;

return NUM;

}

else if(isalpha(t))

{ int p,b=0;

while(isalnum(t))

{ buflex[b]=t;

t=getchar();

b=b+1;

if(b>=TAMBUFF)

error("error del 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; }}}

//emisor.cpp//

#include "global.h"

emite(t,tval)int t=0,tval=0;

{

switch(t)

{ case '+': case'-': case'*': case'/': printf("%c\n",t);

break;

case DIV: printf("DIV\n");

break;

case MOD: printf("MOD\N");

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 "global.h"

char *m;

error(m){
fprintf(stderr, "linea %d: %s\n", numlinea, m);

exit(1);
}

//simbolos.cpp//

#include"global.h"

#define MAXLEX 999

#define MAXSIMB 100char lexemas[MAXLEX];

int ultcar=-1;struct entrada tablasimb[MAXSIMB];

int ultent=0;int busca(s)char s[];

{ int p;

for(p=ultent;p>0;p-1)

if(strcmp(tablasimb[p].aplex,s)==0)

return p;

return 0;}

int inserta(s,clex)char s[];

int clex;{

int lon;

lon=strlen(s);

if(ultent + 1 >= MAXSIMB) error("tabla de simbolos llena");

if(ultcar + lon + 1>= MAXLEX) error("matriz de lexemas 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;}

//inic.cpp//

#include "global.h"

struct entrada palsclave [] ={ "div", DIV, "mod", MOD, 0, 0};

inic(){ struct entrada *p;

for(p=palsclave;p->complex;p++)

inserta(p->aplex, p->complex);}

No hay comentarios:

Publicar un comentario