ВУЗ:
Составители:
51
Приложение Б
(обязательное)
Текст программы
la.h
#include <grids.hpp>
#include <fstream.h>
#include <string.h>
#include <vector>
#include <string>
using std::string;
using std::vector;
// структура, описывающая лексему
struct par{
long n; // номер таблицы
long k; // номер в таблице
};
typedef vector<string> wordtable;
typedef vector<par> parvec;
// состояния диаграммы
enum states {SH, // начало
SI, // идентификатор
SN, // число (до точки)
SND, // дробная часть
SNS, // знак порядка
SNP, // порядок
SO, // ограничитель
SC, // комментарий
SL, // <
SG, // >
SS, // :
SDT, // .
SER, // ошибка
SV}; // выход
class LA;
// класс сканер
class Scanner{
public:
LA * A; // связанный лексический ана-
лизатор
string instr; // входная строка с исходным
текстом
unsigned long pos; // позиция в строке
long z; // найденная позиция в таблице
long errcode; // код ошибки
char cur; // текущий символ
string S; // строка, формирующая лексему
states State; // состояние дмаграммы
int Scan(); // метод-сканер
char gc(){ // считывание следующего символа
if (pos >= instr.size()){
State = SV;
return cur;
}
return (cur = instr[pos++]);
}
bool letter(){ // проверка символа на букву
return isalpha(cur);
}
bool digit(){ // проверка символа на цифру
return isdigit(cur);
}
long look(wordtable * t); // поиск лексемы S в
таблице t
long put(wordtable * t){ // помещение лексемы
в таблицу
z = look(t);
if (z >= 0)
return z;
t->push_back(S);
return (z = (t->size() - 1));
}
void out(long n, long z);
};
// класс лексический анализатор
class LA{
public:
wordtable R; // таблица служебных слов
wordtable D; // таблица разделителей
wordtable I; // таблица идентификаторов
wordtable N; // таблица чисел
parvec res; // вектор пар чисел - результат
лексического анализа
Scanner S; // сканер
void InTables(char *fname); // ввод таблиц R и
D из файла
void OutTable(TStringGrid * G, wordtable * X);
// вывод таблицы в StringGrid
int Scan(string s); // сканирование
string ErrorMsg(int code); // сообщение об
ошибке по коду
string GetResult(); // сформировать результат
в виде строки
void OutTables(char *fname); // вывод
таблиц I и N в файл
void OutResult(char *fname); // вывод
результата в файл
};
31
Лист
Приложение Б
(обязательное)
Текст программы
la.h int Scan(); // метод-сканер
char gc(){ // считывание следующего символа
#include if (pos >= instr.size()){
#include State = SV;
#include return cur;
#include }
#include return (cur = instr[pos++]);
}
using std::string; bool letter(){ // проверка символа на букву
using std::vector; return isalpha(cur);
}
// структура, описывающая лексему bool digit(){ // проверка символа на цифру
struct par{ return isdigit(cur);
long n; // номер таблицы }
long k; // номер в таблице long look(wordtable * t); // поиск лексемы S в
}; таблице t
long put(wordtable * t){ // помещение лексемы
typedef vector wordtable; в таблицу
typedef vector parvec; z = look(t);
// состояния диаграммы if (z >= 0)
enum states {SH, // начало return z;
SI, // идентификатор t->push_back(S);
SN, // число (до точки) return (z = (t->size() - 1));
SND, // дробная часть }
SNS, // знак порядка void out(long n, long z);
SNP, // порядок };
SO, // ограничитель
SC, // комментарий // класс лексический анализатор
SL, // < class LA{
SG, // > public:
SS, // : wordtable R; // таблица служебных слов
SDT, // . wordtable D; // таблица разделителей
SER, // ошибка wordtable I; // таблица идентификаторов
SV}; // выход wordtable N; // таблица чисел
parvec res; // вектор пар чисел - результат
class LA; лексического анализа
// класс сканер Scanner S; // сканер
class Scanner{ void InTables(char *fname); // ввод таблиц R и
public: D из файла
LA * A; // связанный лексический ана- void OutTable(TStringGrid * G, wordtable * X);
лизатор // вывод таблицы в StringGrid
string instr; // входная строка с исходным int Scan(string s); // сканирование
текстом string ErrorMsg(int code); // сообщение об
unsigned long pos; // позиция в строке ошибке по коду
long z; // найденная позиция в таблице string GetResult(); // сформировать результат
long errcode; // код ошибки в виде строки
char cur; // текущий символ void OutTables(char *fname); // вывод
string S; // строка, формирующая лексему таблиц I и N в файл
states State; // состояние дмаграммы void OutResult(char *fname); // вывод
результата в файл
};
Лист
31
51
