Umístnení souboru www.TrSek.com/c/compiler.c// COMPILER.C Copyright (c) TrSek alias Zdeno Sekerak
// Program je pokusom o vlastny compiler s podobnou syntaxou
// ako ma Pascal.
//
// Datum:22.04.96 http://www.trsek.com
void okno (int, int, int, int, int, int );
/* Definuj okno posledne dve su farby */
/* podklad, pismo */
void editor ( void ); /* Uvodna obrazovka */
void tprintf( char text[]); /* Specialny prvy riadok */
void farba(int x,int y); /* nastavi naraz farbu pisma aj podkladu */
void posunx ( int ); /* Posun text v smere osi x */
void posuny ( int ); /* Posun text v smere osi y */
void deletuj ( int, int ); /* Zmaz znak z poziciou */
void novyr ( int ); /* Novy riadok */
int posledny ( int ); /* Posledny znak v riadku */
void strana ( int, int ); /* Vykresli stranu */
void help ( void ); /* No comment */
void save ( char meno[] ); /* Uloz subor pod menom */
int vypis_sub( char mena[][13], int dlzok ); /* Vypis suborov do okna */
int load ( void ); /* Najdi subor */
int from_disk( char subor[]); /* Precitaj subor z disku */
void run ( void ); /* Spusti program */
void outwin ( void ); /* Pozri OUTPUT obrazovku */
void compile ( void ); /* Skompiluj program */
void option ( void ); /* Opsns */
def_riadok *zaradr( def_riadok *pointer, char text[] );
/* Zaradi text do pola */
def_riadok *vyhodr( def_riadok *pointer );
/* Vyhodi text z pola */
int otazka ( char text[], char pr[], char dr[], char tr[] );
/* Otazka , pr-prva volba, dr-druha volba */
int kluc_slova ( def_syntax * (* syntax) );
/* Doplni klucove slova */
int patri ( char s[] , int x , int *v_rade , void *prvys , int caka );
/* Porovnava dve retazce */
int podmienka ( char s[] , int x , def_syntax *prvys);
int aritmetika ( char s[] , int x , void *prvys);
/* Je to aritmetika ??? Nie !!!*/
int premenne (int *x, char s[], def_syntax *syntax);
/* doplni premenne do syntax */
int comp,pocr; /* pocet riadkov suboru */
char subor[maxs]; /* Meno suboru */
void *prvy,*teraz; /* Pameta pointer na prvy riadok */
// main tu to vsetko zacne
void main(int arg, char *args[])
{
int key,i;
int x=1,y=1,xr=1,yr=1;
unsigned insert=0,ulozene=0;
editor();
prvy=NULL; pocr=0; comp=0;
if (arg>0) {
strcpy(subor,args[1]);
from_disk(subor);
strana(1,1);
}
gotoxy(x,y);
do {
key=getch();
if (key==BACKSPACE) {} // nereaguje
if (key==0)
{
key=getch();
switch (key)
{
case LEFT: x=x-1;
if (x<1) {
xr--;x=1;
if (xr<1) xr=1;
else strana(xr,yr);
}
break;
case RIGHT: x=x+1;
if (x>maxx) {
xr++;x=maxx-3;
if ((xr+x)>maxznak)
xr=maxznak-x;
strana(xr,yr);
}
break;
case UP: y=y-1;
if (y<1) {
y=1;
yr--;
if (yr<1) yr=1;
strana(xr,yr);
}
break;
case DOWN: y=y+1;
if (y>maxy) {
y=maxy;
yr=yr+1;
if ((yr+y)>pocr) {
yr=pocr-maxy-y-1;
if (yr<1) yr=1;
}
strana(xr,yr);
}
break;
case ENTER: x=1;y=y+1;novyr(y);posunx(0);
break;
case DEL: deletuj(x,y);
break;
case INSERT:insert=!insert;
break;
case HOME: x=1;
break;
case END: x=posledny(yr+y-1);
xr=1;
if (x>maxx) {
xr=x-maxx;
x=maxx-3;
strana(xr,yr);
}
break;
case PGDN: yr=yr+maxy;
if ((yr+y)>pocr) {
for (i=pocr;i<=(yr+y);i++) novyr(i);
yr=pocr-20;
}
strana(xr,yr);
break;
case PGUP: yr=yr-maxy;
if (yr<1) yr=1;
strana(xr,yr);
break;
case F1: help();
break;
case F2: save(subor);
break;
case F3: load();
window(2,3,79,23);
clrscr();
strana(1,1);
break;
case F4: save("");
break;
case F5: if (!comp) compile();
run();
break;
case F6: outwin();
break;
case F7:
break;
case F8: option();
break;
case F9: compile();
break;
case F10: if (!ulozene) {
if (otazka("Ulozit prave editovany subor ?"," ^Ano "," ^Nie ","")==1)
save(subor);
else
key=0;
}
if (key==0)
if (otazka(" Chces skoncit ? "," ^Ano "," ^Nie ","")==1)
key=F10;
break;
default: break;
}
gotoxy(x,y);
}
} while (key!=F10);
clrscr();
}
// zobrazi okno v ktorom sa budeme pohybovat
void okno (int x1, int y1, int x2, int y2, int col1, int col2 )
{
int x,y;
// ulozi subor
void save ( char meno[] )
{
meno=meno;
}
// vypise obsah adresara
// dlzok znamena od akeho suboru sa ma zacat
int vypis_sub(char mena[][13], int dlzok)
{
struct ffblk subory;
int yp=-1;
int i;
// najprv vsetky vyhlada
while ((errno==0) && (yp<maxpocs))
{
strcpy(mena[++yp],subory.ff_name);
// subory prekonvertujem na male pismena
if ((subory.ff_attrib & FA_DIREC) == 0)
for (i=0; i<strlen(mena[yp]); i++)
if (mena[yp][i]!='.')
mena[yp][i]=mena[yp][i]+32;
findnext(&subory);
}
// teraz ich vsetky vypisem
for( i=0; i<dlzok && i<yp; i++ )
{
gotoxy(3,i+1);
cprintf("%s",mena[i]);
}
return(yp);
}
// precita program zo suboru
int load ( void )
{
int dlzok=12;
int y=0, yr=0, yp=0;
char mena[maxpocs+1][13];
char key;
yp=0; yp=yp; yr=0; yr=yr; /* Potom ma zrus */
okno(15,3,18,dlzok+1,LIGHTGRAY,DARKGRAY);
yp=vypis_sub(mena,dlzok);
for (y=1;y<=pocr;y++)
{
x=1;
if ((i=patri( (*riadok).znaky,x,&v_rade,prvys,caka)) >x)
x=i;
else {
if (caka==-1) error=zarade(error,"Nepoznam",y);
else error=zarade(error,klslov[caka],y);
v_rade=caka;
}
if ((caka==-1) && (v_rade>maxkl)) caka=10;
if (v_rade==9) caka=-1;
if (v_rade==10)
if ((i=aritmetika( (*riadok).znaky,x,posled)) >x) { x=i;caka=9; }
else error=zarade(error,klslov[caka],y);
if (v_rade==11)
if ((i=podmienka( (*riadok).znaky,x,posled)) >x) { x=i;caka=12; }
else error=zarade(error,klslov[caka],y);
if ((v_rade==6) || (v_rade==7))
if ((i=patri( (*riadok).znaky,x,&v_rade,posled,caka))>x) { x=i;caka=9; }
else error=zarade(error,klslov[caka],y);
if (v_rade==3) caka=11;
if (v_rade==2) caka=-1;
if (v_rade==1) {
i=premenne( &x,(*riadok).znaky,posled);
if (i!=0) error=zarade(error,"Zle definovanie premennych.",y);
i=oldi+1;
caka=2;
}
if (v_rade==0) caka=1;
if (x>=strlen( (*riadok).znaky)-1 ) { riadok=(*riadok).zani;oldi=-1; }
if (i==oldi) y=pocr;
oldi=i;
}
if (v_rade!=7)
error=zarade(error,klslov[7],y);
if (error==NULL)
comp=1;
}
// nastavenia
void option ( void )
{
}
// polozi otazku a caka odpoved Ano/Nie
int otazka ( char text[], char pr[], char dr[], char tr[])
{
int vo=0,odx,i,x;
char pdt[3][10];
int cpdt[3];
char ch;