Реализация синтаксического блока. Применение конечного автомата, страница 3

                                                                       if (symbol == RBR) {

                                                                                   FPRT;symbol=NextSymb();

                                                                                   if (symbol == COMMA) {

                                                                                               FPRT;symbol=NextSymb();

                                                                                               List();

                                                                                   }

                                                                       } else printf("Нет закрывающей скобки\n");

                                                           } else printf("Нет количества дробных разрядов\n");

                                               } else printf("Нет запятой\n");

                                    } else printf("Нет длины числа\n");

                        } else printf("Нет открывающей скобки\n");                   

            }

}

Еще один пример для грамматики из лабораторной работы 5

P={

<программа>         ®  TITLE <описания><операторы>END

<описания>           ®  <список имен> : <тип>;<описания>

<описания>           ® <список имен> : <тип>;

<тип>                    ® INT

<тип>                    ® REAL

<список имен>      ® <идентификатор>, <список имен>

<список имен>      ® <идентификатор>

<операторы>         ® <оператор ввода> <операторы>

<операторы>         ® <оператор ввода>

<операторы>         ® <оператор вывода> <операторы>

<операторы>         ® <оператор вывода>

<операторы>         ® <оператор присваивания> <операторы>

<операторы>         ® <оператор присваивания>

<оператор ввода>  ®  INPUT(<список ввода-вывода>);

<оператор вывода>®  OUTPUT(<список ввода-вывода>);

<список ввода-вывода>     ® <элемент>,<список ввода-вывода>

<список ввода-вывода>     ® <элемент>

<элемент>                         ® <идентификатор>

<оператор присваивания> ® <идентификатор> = <выражение>;

}

#include <stdio.h>

#include <string.h>

. . .

enum Term {TTL=1,END,Int,REAL,Input,OUTPUT};

enum Delim {COMMA=10,SCOL,COLON,EQ,ASGN,LBR,RBR }; //символы , ; : = ( )

#define BEGTBL 31

#define ENDTBL 59

#define BEGLIT  60

#define ENDLIT  99

#define FPRT fprintf(out,"%02d ",symbol)

#define FPRT1(x) fprintf(out,"%02d ",x)

#define NS symbol=NextSymb()

. . .

void Lex(void);

int NextSymb (void);

void DclOp(void);

void List(void);

void ListIO (void);

void ExeOp(void);

void End(void);

void Expr(void);

FILE *in, *out;

struct tbl {

   int code;

   char name[9];

   int dcl;

} TBL[]= {

     31, "a", 0,

     32, "b", 0,

     33, "c", 0,

     34, "d", 0,

     35, "e", 0,

     -1

}; //имитируем заполнение таблицы 5-ю именами в ЛБ

int symbol;     //для хранения кода текущей лексемы

char buf[255]; //буфер для чтения очередной строки из файла

char *pbuf;     //текущая позиция очередной лексемы

int serr=0;   //количество ошибок синт. блока

int ilst, nlst; //номер и число строк файла с лексемами

char ostr[255], *postr;            //буфер для выходной строки в Form4

int pos; //смещение для конечной позиции в выходной строке в Form4

//Головная процедура

    . . .

  in=fopen(lname,"r");

  out=fopen(sname,"w");

  if((pbuf=fgets(buf,80,in))!=NULL){

     symbol=atoi(pbuf); Snt();

  }

  fclose(in); fclose(out);

. . .

NextSymb (void) {

   pbuf += 3;

   if ( atoi(pbuf) ) return atoi(pbuf);

   fprintf(out,"00\n");

   if ( (pbuf = fgets(buf, 80, in) ) == NULL) return -1;

   return (atoi(pbuf));

}

void ErrMes(char *s){

            serr++;

            Form1->Memo2->Lines->Add(s);

}

void Snt(void){

if (symbol==TTL){

                        FPRT; NS;

} else ErrMes("Нет заголовка программы");

DclOp();

ExeOp();

if (symbol == END) {

                        FPRT;NS;

} else ErrMes("Нет оператора END");

}

void DclOp(void){

if (symbol >= BEGTBL && symbol <= ENDTBL ){

            List();

            if (symbol==COLON){

                                    FPRT; NS;

if (symbol == Int ||symbol == REAL ){

                                    FPRT; NS;

                                    if (symbol == SCOL){

                                                            FPRT; NS;

}else ErrMes("Нет точки с запятой в операторе объявления");

}else ErrMes("Нет задания типа в операторе объявления");

}else ErrMes("Нет двоеточия в операторе объявления");

DclOp();

            }

}

void List(void){

if(symbol>=BEGTBL && symbol<=ENDTBL){

                        FPRT; NS;

                        if (symbol == COMMA) {

                                    FPRT; NS();

                                    List();

                        }

}

}

void ExeOp(void){

   if (symbol == Input){

            FPRT; NS;

            if (symbol == LBR){

               FPRT; NS;

               ListIO();

               if (symbol == RBR){

                        FPRT; NS;

                        if (symbol == SCOL){

                           FPRT; NS;

                        }else ErrMes("Нет ; в операторе INPUT");

               } else ErrMes("Нет закр.скобки в операторе INPUT");

            } else ErrMes("Нет открыв.скобки в операторе INPUT");

            ExeOp();

   }else

   if (symbol == OUTPUT){

            FPRT;NS;

            if (symbol == LBR){

               FPRT;NS;

               ListIO();

               if (symbol == RBR){

                        FPRT; NS;

                        if (symbol == SCOL){

                           FPRT; NS;

                        }else ErrMes("Нет ; в операторе OUTPUT");

               }else ErrMes("Нет закр.скобки в операторе OUTPUT");

            } else ErrMes("Нет открыв.скобки в операторе OUTPUT");