ВУЗ:
Составители:
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(){ // считывание следующего символа #includeif (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