Program ktorý demoštruje ako funguje compiler

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Kategória: Programy v C, C++

Program: Compiler.c
Súbor exe: Compiler.exe
Potrebné: Klavesy.hStruct.h
Príklady: Prog.c

Program ktorý demoštruje ako funguje compiler. Má IDE prostredie so všetkými potrebnými funkciami. Program vie odhaliť syntaktické chyby programu nevie kompilovať do exe tvaru. Zdrojový kód ktorý kompiluje je akási obdoba Pascalu.
// STRUCT.H                  Copyright (c) TrSek alias Zdeno Sekerak 
// Program je sucastou programu Compiler.c
//                                                                   
// Datum:22.04.96                               http://www.trsek.com 
 
typedef struct {
  void *pred;
  char znaky[maxznak];
  void *zani;
} def_riadok;
 
typedef struct {
  void *pred;
  char znaky[maxsyn];
  void *zani;
} def_syntax;
 
typedef struct {
  void *pred;
  char error[maxsyn];
  int  err;
  void *zani;
} def_error;
 
def_riadok *riadok;			/* Natlaci subor */
def_syntax *syntax;			/* Natlaci syntax */
def_error  *error;			/* Objavia sa chyby */
 
 
// zaradi riadok do zoznamu
def_riadok *zaradr( def_riadok *pointer, char text[] )
{
def_riadok *pomocny,*pomocny2;
 
 pomocny=malloc(sizeof((*riadok)));
 if (pomocny==NULL) return(NULL);
 
 strcpy((*pomocny).znaky,text);
 (*pomocny).pred=pointer;
 (*pomocny).zani=NULL;
 
 if (pointer!=NULL) {
   if ((*pointer).zani!=NULL) {
      pomocny2=(*pointer).zani;
      (*pointer).zani=pomocny;
      (*pomocny).zani=pomocny2;
      pomocny2=(*pomocny).zani;
      (*pomocny2).pred=pomocny;
   }
   (*pointer).zani=pomocny;
 }
 
 return(pomocny);
}
 
 
// vyhodi riadok zo zoznamu
def_riadok *vyhodr( def_riadok *pointer )
{
def_riadok *pomocny;
 
 pomocny=NULL;
 if (pointer==NULL) return(NULL);
 
 if ((*pointer).pred!=NULL) {
    pomocny=(*pointer).pred;
    (*pomocny).zani=(*pointer).zani;
 }
 
 if ((*pointer).zani!=NULL) {
    pomocny=(*pointer).zani;
    (*pomocny).pred=(*pointer).pred;
 }
 else {
    pomocny=(*pointer).pred;
    (*pomocny).zani=NULL;
 }
 
 free(pointer);
 return(pomocny);
}
 
 
//
def_syntax *zarads( def_syntax *pointer, char text[] )
{
def_syntax *pomocny,*pomocny2;
 
 pomocny=malloc(sizeof(( * syntax)));
 if (pomocny==NULL) return(NULL);
 
 strcpy((*pomocny).znaky,text);
 (*pomocny).pred=pointer;
 (*pomocny).zani=NULL;
 
 if (pointer!=NULL) {
   if ((*pointer).zani!=NULL) {
      pomocny2=(*pointer).zani;
      (*pointer).zani=pomocny;
      (*pomocny).zani=pomocny2;
      pomocny2=(*pomocny).zani;
      (*pomocny2).pred=pomocny;
   }
   (*pointer).zani=pomocny;
 }
 
 return(pomocny);
}
 
 
//
def_syntax *vyhods( def_riadok *pointer )
{
def_syntax *pomocny;
 
 pomocny=NULL;
 if (pointer==NULL) return(NULL);
 
 if ((*pointer).pred!=NULL) {
    pomocny=(*pointer).pred;
    (*pomocny).zani=(*pointer).zani;
 }
 
 if ((*pointer).zani!=NULL) {
    pomocny=(*pointer).zani;
    (*pomocny).pred=(*pointer).pred;
 }
 else {
    pomocny=(*pointer).pred;
    (*pomocny).zani=NULL;
 }
 
 free(pointer);
 return(pomocny);
}
 
 
//
def_error *zarade( def_error *pointer, char text[] , int err)
{
def_error *pomocny,*pomocny2;
 
 pomocny=malloc(sizeof(( * error)));
 if (pomocny==NULL) return(NULL);
 
 strcpy((*pomocny).error,text);
 (*pomocny).err=err;
 (*pomocny).pred=pointer;
 (*pomocny).zani=NULL;
 
 if (pointer!=NULL) {
   if ((*pointer).zani!=NULL) {
      pomocny2=(*pointer).zani;
      (*pointer).zani=pomocny;
      (*pomocny).zani=pomocny2;
      pomocny2=(*pomocny).zani;
      (*pomocny2).pred=pomocny;
   }
   (*pointer).zani=pomocny;
 }
 
 return(pomocny);
}
 
 
//
def_error *vyhode( def_error *pointer )
{
def_error *pomocny;
 
 pomocny=NULL;
 if (pointer==NULL) return(NULL);
 
 if ((*pointer).pred!=NULL) {
    pomocny=(*pointer).pred;
    (*pomocny).zani=(*pointer).zani;
 }
 
 if ((*pointer).zani!=NULL) {
    pomocny=(*pointer).zani;
    (*pomocny).pred=(*pointer).pred;
 }
 else {
    pomocny=(*pointer).pred;
    (*pomocny).zani=NULL;
 }
 
 free(pointer);
 return(pomocny);
}