/****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "lex.h"

static FILE  *pIF;			/* Quellfile 				*/
static tMorph Morph,MorphInit;		/* Morphem   				*/
static signed char X;			/* Aktuelles Eingabezeichen 		*/
static int    Z;			/* Aktueller Zustand des Automaten 	*/
static char   vBuf[128+1],*pBuf;	/* Ausgabepuffer */
static int    Ende;			/* Flag 				*/

/*---- Initialisierung der lexiaklischen Analyse ----*/
int initLex(char* fname)
{
  pIF=fopen(fname,"r+t");
  if (pIF) X=fgetc(pIF);
  Morph.MC=mcEmpty;
  return (int)pIF;
}

/* Zeichenklassenvektor */

...

/* Automatentabelle */

...

/* Ausgabefunktionen des Automaten */
static void fl  (void);
static void fb  (void);
static void fgl (void);
static void fsl (void);
static void fslb(void);

typedef void (*FX)(void);

static FX vfx[]={fl,fb,fgl,fsl,fslb};

/*---- Lexikalische Analyse ----*/
tMorph* Lex(void)
{
  int Zn;
  Morph=MorphInit;
  pBuf=vBuf;
  Ende=0;
  do
  {
  /*
    /* Berechnung des Folgezustands */
    Zn=   vSMatrix[Z][vZKl[X&0x7f]]&0xF;
    /* Ausführung der Aktion (Ausgabefunktion */
    vfx[((vSMatrix[Z][vZKl[X&0x7f]]))>>4]();
    /* Automat schaltet */
    Z=Zn;
  */
  }while (Ende==0);
  return &Morph;
}


/*---- Testprogramm fuer lexiklaische Analyse ----*/
main(int argc, void*argv[])
{
  initLex(argv[1]);
  while (X!=EOF)
  {
    Lex();
    printf("Line%4d, Col%3d: ",Morph.PosLine, Morph.PosCol);
	 switch(Morph.MC)
    {
       case mcSymb :
	    if (Morph.Val.Symb==zErg)   printf("Symbol,:=\n");    else
	    if (Morph.Val.Symb==zle )   printf("Symbol,<=\n");    else
	    if (Morph.Val.Symb==zge )   printf("Symbol,>=\n");    else
	    if (Morph.Val.Symb==zBGN)   printf("Symbol,_BEGIN\n");else
	    if (Morph.Val.Symb==zCLL)   printf("Symbol,_CALL\n"); else
	    if (Morph.Val.Symb==zCST)   printf("Symbol,_CONST\n");else
	    if (Morph.Val.Symb==zDO )   printf("Symbol,_DO\n");   else
	    if (Morph.Val.Symb==zEND)   printf("Symbol,_END\n");  else
	    if (Morph.Val.Symb==zIF )   printf("Symbol,_IF\n");   else
	    if (Morph.Val.Symb==zODD)   printf("Symbol,_ODD\n");  else
	    if (Morph.Val.Symb==zPRC)   printf("Symbol,_PROCEDURE\n");else
	    if (Morph.Val.Symb==zTHN)   printf("Symbol,_THEN\n"); else
	    if (Morph.Val.Symb==zVAR)   printf("Symbol,_VAR\n");  else
	    if (Morph.Val.Symb==zWHL)   printf("Symbol,_WHILE\n");

            if (isprint(Morph.Val.Symb))printf("Symbol,%c\n",(char)Morph.Val.Symb);
				break;
       case mcNumb :
            printf("Zahl  ,%ld\n",Morph.Val.Numb);
				break;
       case mcIdent:
	    printf("Ident ,%s\n",(char*)Morph.Val.pStr);
				break;
    }
  }
  return 0;
}


