VM2D  1.12
Vortex methods for 2D flows simulation
VMlib::Preprocessor Class Reference

Класс, позволяющий выполнять предварительную обработку файлов More...

#include <Preprocessor.h>

Collaboration diagram for VMlib::Preprocessor:

Public Member Functions

 Preprocessor (const std::string &fileName)
 Конструктор, принимающий на вход имя обрабатываемого файла More...
 
 ~Preprocessor ()
 Деструктор More...
 

Public Attributes

std::string initialInput
 Строка, содержащая исходный файл в первоначальном виде More...
 
std::string intermediateOutput
 Строка, содержащая результат промежуточной обработки файла More...
 
std::string resultString
 Строка, содержащая окончательный результат обработки файла More...
 
std::stringstream resultStream
 

Private Member Functions

void normalParser (char ch, std::string &str)
 Обработчик символа в режиме обычного состояния парcера More...
 
void inStringParser (char ch, std::string &str)
 Обработчик символа в режиме парсера строки (внутри двойных кавычек) More...
 
void inCharParser (char ch, std::string &str)
 Обработчик символа в режиме парсера символа (внутри одинарных кавычек) More...
 
void afterSlashParser (char ch, std::string &str)
 Обработчик символа в режиме парсера выражения после слэша More...
 
void inInlineCommentParser (char ch, std::string &str)
 Обработчик символа в режиме парсера однострочного комментария (после //) More...
 
void inMultilineCommentParser (char ch, std::string &str)
 Обработчик символа в режиме парсера многострочного комментария More...
 
char processSymbol (char ch)
 Базовая функция обработки символа В зависимости от входого символа возвращает на выход: More...
 

Private Attributes

bool inStringLastEscape
 Признак встречи слэша внутри строки (внутри двойных кавычек) More...
 
bool inCharLastEscape
 Признак встречи слэша внутри символа (внутри одинарных кавычек) More...
 
bool inInlineLastEscape
 Признак встречи слэша внутри однострочного комментария (после //) More...
 
bool inMultilineLastStar
 Признак встречи звездочки внутри многострочного комментария (после '/*') More...
 
void(Preprocessor::* currentParser )(char ch, std::string &str)
 Опредедение currentParser как указателя на функцию-члена класса More...
 

Detailed Description

Класс, позволяющий выполнять предварительную обработку файлов

Выполняет следующие действия:

  • Исключает из файла однострочные и многостройчные комментарии в стиле С/С++
  • Разрывы строк заменяет на пробелы
  • Точки с запятой заменяет на разрывы строк
Author
Марчевский Илья Константинович 1.12
Date
14 января 2024 г.

Definition at line 59 of file Preprocessor.h.

Constructor & Destructor Documentation

Preprocessor::Preprocessor ( const std::string &  fileName)

Конструктор, принимающий на вход имя обрабатываемого файла

После посимвольной обработки формирует промежуточный вывод intermediateOutput
Затем убирает из вывода пробелы и знаки табуляции и формирует окончательный поток вывода resultStream

Parameters
[in]fileNameконстантная ссылка на строку — имя обрабатываемого файла

Definition at line 44 of file Preprocessor.cpp.

45  :
46  inStringLastEscape(false),
47  inCharLastEscape(false),
48  inInlineLastEscape(false),
49  inMultilineLastStar(false),
51 {
52 #pragma warning (push)
53 #pragma warning (disable: 4996)
54  FILE * inputFile = fopen(fileName.c_str(), "r");
55 #pragma warning (pop)
56 
57  int symbol;
58 
59  while ((symbol = fgetc(inputFile)) != EOF)
60  {
61  initialInput.push_back(symbol);
62  (this->*currentParser)(symbol, intermediateOutput);
63  }
64 
65  fclose(inputFile);
66 
67  std::stringstream ss(intermediateOutput);
68 
69  std::string readline;
70 
71  while (ss.good())
72  {
73  getline(ss, readline);
74 
75  readline.erase(std::remove(readline.begin(), readline.end(), ' '), readline.end());
76  readline.erase(std::remove(readline.begin(), readline.end(), '\t'), readline.end());
77 
78 #if defined(_WIN32)
79 #else
80  readline.erase(std::remove(readline.begin(), readline.end(), 0x0D), readline.end());
81 #endif
82 
83  resultStream << readline << std::endl;
84  }
85 
86  resultString = resultStream.str();
87 }//Preprocessor(...)
std::string resultString
Строка, содержащая окончательный результат обработки файла
Definition: Preprocessor.h:159
bool inStringLastEscape
Признак встречи слэша внутри строки (внутри двойных кавычек)
Definition: Preprocessor.h:63
std::string initialInput
Строка, содержащая исходный файл в первоначальном виде
Definition: Preprocessor.h:143
void(Preprocessor::* currentParser)(char ch, std::string &str)
Опредедение currentParser как указателя на функцию-члена класса
Definition: Preprocessor.h:75
void normalParser(char ch, std::string &str)
Обработчик символа в режиме обычного состояния парcера
bool inCharLastEscape
Признак встречи слэша внутри символа (внутри одинарных кавычек)
Definition: Preprocessor.h:66
bool inMultilineLastStar
Признак встречи звездочки внутри многострочного комментария (после &#39;/*&#39;)
Definition: Preprocessor.h:72
bool inInlineLastEscape
Признак встречи слэша внутри однострочного комментария (после //)
Definition: Preprocessor.h:69
std::stringstream resultStream
Definition: Preprocessor.h:163
std::string intermediateOutput
Строка, содержащая результат промежуточной обработки файла
Definition: Preprocessor.h:146
VMlib::Preprocessor::~Preprocessor ( )
inline

Деструктор

Definition at line 159 of file Preprocessor.h.

159 { };

Member Function Documentation

void Preprocessor::afterSlashParser ( char  ch,
std::string &  str 
)
private

Обработчик символа в режиме парсера выражения после слэша

При появлении символов / или * переключает парсер в режим обработки однострочного или многострочного комментария
Отальные символы выводит в поток после его предварительной обработки фукцией Preprocessor::processSymbol

Parameters
[in]chобрабатываемый символ
[out]strссылка на строку, в которую сохряняется результат

Definition at line 149 of file Preprocessor.cpp.

150 {
151  switch (ch)
152  {
153  case '/':
155  return;
156 
157  case '*':
159  return;
160 
161  default:
162  str.push_back(processSymbol(ch));
163  }
164 }//afterSlashParser(...)
void inInlineCommentParser(char ch, std::string &str)
Обработчик символа в режиме парсера однострочного комментария (после //)
void(Preprocessor::* currentParser)(char ch, std::string &str)
Опредедение currentParser как указателя на функцию-члена класса
Definition: Preprocessor.h:75
void inMultilineCommentParser(char ch, std::string &str)
Обработчик символа в режиме парсера многострочного комментария
char processSymbol(char ch)
Базовая функция обработки символа В зависимости от входого символа возвращает на выход: ...

Here is the call graph for this function:

Here is the caller graph for this function:

void Preprocessor::inCharParser ( char  ch,
std::string &  str 
)
private

Обработчик символа в режиме парсера символа (внутри одинарных кавычек)

При появлении парного апострофа переводит парсер в обычный режим, обрабатываемый символ в неизменном виде передается в поток

Parameters
[in]chобрабатываемый символ
[out]strссылка на строку, в которую сохряняется результат

Definition at line 139 of file Preprocessor.cpp.

140 {
141  str.push_back(ch);
142  if (ch == '\'' && !inCharLastEscape)
144  inCharLastEscape = (ch == '\\') && !inCharLastEscape;
145 }//inCharParser(...)
void(Preprocessor::* currentParser)(char ch, std::string &str)
Опредедение currentParser как указателя на функцию-члена класса
Definition: Preprocessor.h:75
void normalParser(char ch, std::string &str)
Обработчик символа в режиме обычного состояния парcера
bool inCharLastEscape
Признак встречи слэша внутри символа (внутри одинарных кавычек)
Definition: Preprocessor.h:66

Here is the call graph for this function:

Here is the caller graph for this function:

void Preprocessor::inInlineCommentParser ( char  ch,
std::string &  str 
)
private

Обработчик символа в режиме парсера однострочного комментария (после //)

Игнорирует все симводы до появления конца строки.
При появлении конца строки переключает парсер в обычный режим и выводит конец строки в результирующую строчку

Parameters
[in]chобрабатываемый символ
[out]strссылка на строку, в которую сохряняется результат

Definition at line 168 of file Preprocessor.cpp.

169 {
170  if (ch == '\n' && !inInlineLastEscape)
171  {
172  str.push_back(processSymbol(ch));
174  }
175  inInlineLastEscape = (ch == '\\') && !inInlineLastEscape;
176 }//inInlineCommentParser(...)
void(Preprocessor::* currentParser)(char ch, std::string &str)
Опредедение currentParser как указателя на функцию-члена класса
Definition: Preprocessor.h:75
void normalParser(char ch, std::string &str)
Обработчик символа в режиме обычного состояния парcера
bool inInlineLastEscape
Признак встречи слэша внутри однострочного комментария (после //)
Definition: Preprocessor.h:69
char processSymbol(char ch)
Базовая функция обработки символа В зависимости от входого символа возвращает на выход: ...

Here is the call graph for this function:

Here is the caller graph for this function:

void Preprocessor::inMultilineCommentParser ( char  ch,
std::string &  str 
)
private

Обработчик символа в режиме парсера многострочного комментария

Игнорирует все симводы до появления сочетания, соответствующего окончанию комментария.

При появлении символов окончания комментария выводит в результирующую строку пробел и переключает парсер в обычный режим

Parameters
[in]chобрабатываемый символ
[out]strссылка на строку, в которую сохряняется результат

Definition at line 180 of file Preprocessor.cpp.

181 {
182  if (ch == '/' && inMultilineLastStar)
183  {
184  str.push_back(' ');
186  }
187  inMultilineLastStar = (ch == '*');
188 }
void(Preprocessor::* currentParser)(char ch, std::string &str)
Опредедение currentParser как указателя на функцию-члена класса
Definition: Preprocessor.h:75
void normalParser(char ch, std::string &str)
Обработчик символа в режиме обычного состояния парcера
bool inMultilineLastStar
Признак встречи звездочки внутри многострочного комментария (после &#39;/*&#39;)
Definition: Preprocessor.h:72

Here is the call graph for this function:

Here is the caller graph for this function:

void Preprocessor::inStringParser ( char  ch,
std::string &  str 
)
private

Обработчик символа в режиме парсера строки (внутри двойных кавычек)

При появлении парной кавычки переводит парсер в обычный режим, обрабатываемый символ в неизменном виде передается в поток

Parameters
[in]chобрабатываемый символ
[out]strссылка на строку, в которую сохряняется результат

Definition at line 129 of file Preprocessor.cpp.

130 {
131  str.push_back(ch);
132  if (ch == '\"' && !inStringLastEscape)
134  inStringLastEscape = (ch == '\\') && !inStringLastEscape;
135 }//inStringParser(...)
bool inStringLastEscape
Признак встречи слэша внутри строки (внутри двойных кавычек)
Definition: Preprocessor.h:63
void(Preprocessor::* currentParser)(char ch, std::string &str)
Опредедение currentParser как указателя на функцию-члена класса
Definition: Preprocessor.h:75
void normalParser(char ch, std::string &str)
Обработчик символа в режиме обычного состояния парcера

Here is the call graph for this function:

Here is the caller graph for this function:

void Preprocessor::normalParser ( char  ch,
std::string &  str 
)
private

Обработчик символа в режиме обычного состояния парcера

При появлении символов ", ', / переключает парсер в соответствующий режим Выводит обрабатываемый символ в поток (кроме слэша, который игнорируется) после его предварительной обработки фукцией Preprocessor::processSymbol

Parameters
[in]chобрабатываемый символ
[out]strссылка на строку, в которую сохряняется результат

Definition at line 108 of file Preprocessor.cpp.

109 {
110  switch (ch)
111  {
112  case '\"':
114  break;
115 
116  case '\'':
118  break;
119 
120  case '/':
122  return;
123  }
124  str.push_back(processSymbol(ch));
125 }//normalParser(...)
void inCharParser(char ch, std::string &str)
Обработчик символа в режиме парсера символа (внутри одинарных кавычек)
void(Preprocessor::* currentParser)(char ch, std::string &str)
Опредедение currentParser как указателя на функцию-члена класса
Definition: Preprocessor.h:75
void afterSlashParser(char ch, std::string &str)
Обработчик символа в режиме парсера выражения после слэша
char processSymbol(char ch)
Базовая функция обработки символа В зависимости от входого символа возвращает на выход: ...
void inStringParser(char ch, std::string &str)
Обработчик символа в режиме парсера строки (внутри двойных кавычек)

Here is the call graph for this function:

Here is the caller graph for this function:

char Preprocessor::processSymbol ( char  ch)
private

Базовая функция обработки символа В зависимости от входого символа возвращает на выход:


  • (конец строки) — пробел
  • ; (точка с зарятой) — конец строки
  • исходный символ в остальных случаях
Parameters
[in]chобрабатываемый символ return символ, который отправляется в обработанный файл

Definition at line 91 of file Preprocessor.cpp.

92 {
93  switch (ch)
94  {
95  case '\n':
96  return ' ';
97 
98  case ';':
99  return '\n';
100 
101  default:
102  return ch;
103  }
104 }//processSymbol(...)

Here is the caller graph for this function:

Member Data Documentation

void(Preprocessor::* VMlib::Preprocessor::currentParser) (char ch, std::string &str)
private

Опредедение currentParser как указателя на функцию-члена класса

Definition at line 75 of file Preprocessor.h.

bool VMlib::Preprocessor::inCharLastEscape
private

Признак встречи слэша внутри символа (внутри одинарных кавычек)

Definition at line 66 of file Preprocessor.h.

bool VMlib::Preprocessor::inInlineLastEscape
private

Признак встречи слэша внутри однострочного комментария (после //)

Definition at line 69 of file Preprocessor.h.

std::string VMlib::Preprocessor::initialInput

Строка, содержащая исходный файл в первоначальном виде

Definition at line 143 of file Preprocessor.h.

bool VMlib::Preprocessor::inMultilineLastStar
private

Признак встречи звездочки внутри многострочного комментария (после '/*')

Definition at line 72 of file Preprocessor.h.

bool VMlib::Preprocessor::inStringLastEscape
private

Признак встречи слэша внутри строки (внутри двойных кавычек)

Definition at line 63 of file Preprocessor.h.

std::string VMlib::Preprocessor::intermediateOutput

Строка, содержащая результат промежуточной обработки файла

Definition at line 146 of file Preprocessor.h.

std::stringstream VMlib::Preprocessor::resultStream

Definition at line 163 of file Preprocessor.h.

std::string VMlib::Preprocessor::resultString

Строка, содержащая окончательный результат обработки файла

Definition at line 159 of file Preprocessor.h.


The documentation for this class was generated from the following files: