Разработка компиляторов. Ишакова Е.Н. - 51 стр.

UptoLike

Составители: 

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