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");
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.