Program ktorý demoštruje ako funguje compiler

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

Program: Compiler.c
Soubor exe: Compiler.exe
Potřebné: Klavesy.hStruct.h
Pří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);
}