VM2D  1.12
Vortex methods for 2D flows simulation
Preprocessor.cpp
Go to the documentation of this file.
1 /*--------------------------------*- VMlib -*----------------*---------------*\
2 | ## ## ## ## ## ## ## | | Version 1.12 |
3 | ## ## ### ### ## ## | VMlib: VM2D/VM3D Library | 2024/01/14 |
4 | ## ## ## # ## ## ## #### | Open Source Code *----------------*
5 | #### ## ## ## ## ## ## | https://www.github.com/vortexmethods/VM2D |
6 | ## ## ## #### ### #### | https://www.github.com/vortexmethods/VM3D |
7 | |
8 | Copyright (C) 2017-2024 Ilia Marchevsky |
9 *-----------------------------------------------------------------------------*
10 | File name: Preprocessor.cpp |
11 | Info: Source code of VMlib |
12 | |
13 | This file is part of VMlib. |
14 | VMLib is free software: you can redistribute it and/or modify it |
15 | under the terms of the GNU General Public License as published by |
16 | the Free Software Foundation, either version 3 of the License, or |
17 | (at your option) any later version. |
18 | |
19 | VMlib is distributed in the hope that it will be useful, but WITHOUT |
20 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
22 | for more details. |
23 | |
24 | You should have received a copy of the GNU General Public License |
25 | along with VMlib. If not, see <http://www.gnu.org/licenses/>. |
26 \*---------------------------------------------------------------------------*/
27 
28 
37 #include <algorithm>
38 
39 #include "Preprocessor.h"
40 
41 using namespace VMlib;
42 
43 // Конструктор
44 Preprocessor::Preprocessor(const std::string& fileName)
45  :
46  inStringLastEscape(false),
47  inCharLastEscape(false),
48  inInlineLastEscape(false),
49  inMultilineLastStar(false),
50  currentParser(&Preprocessor::normalParser)
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(...)
88 
89 
90 // Базовая функция обработки символа
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(...)
105 
106 
107 // Обработчик символа в режиме обычного состояния парcера
108 void Preprocessor::normalParser(char ch, std::string& str)
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(...)
126 
127 
128 // Обработчик символа в режиме парсера строки (внутри двойных кавычек)
129 void Preprocessor::inStringParser(char ch, std::string& str)
130 {
131  str.push_back(ch);
132  if (ch == '\"' && !inStringLastEscape)
134  inStringLastEscape = (ch == '\\') && !inStringLastEscape;
135 }//inStringParser(...)
136 
137 
138 // Обработчик символа в режиме парсера символа (внутри одинарных кавычек)
139 void Preprocessor::inCharParser(char ch, std::string& str)
140 {
141  str.push_back(ch);
142  if (ch == '\'' && !inCharLastEscape)
144  inCharLastEscape = (ch == '\\') && !inCharLastEscape;
145 }//inCharParser(...)
146 
147 
148 // Обработчик символа в режиме парсера выражения после слэша
149 void Preprocessor::afterSlashParser(char ch, std::string& str)
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(...)
165 
166 
167 // Обработчик символа в режиме парсера однострочного комментария (после //)
168 void Preprocessor::inInlineCommentParser(char ch, std::string& str)
169 {
170  if (ch == '\n' && !inInlineLastEscape)
171  {
172  str.push_back(processSymbol(ch));
174  }
175  inInlineLastEscape = (ch == '\\') && !inInlineLastEscape;
176 }//inInlineCommentParser(...)
177 
178 
179 // Обработчик символа в режиме парсера многотрочного комментария
180 void Preprocessor::inMultilineCommentParser(char ch, std::string& str)
181 {
182  if (ch == '/' && inMultilineLastStar)
183  {
184  str.push_back(' ');
186  }
187  inMultilineLastStar = (ch == '*');
188 }//inMultilineCommentParser(...)
void inCharParser(char ch, std::string &str)
Обработчик символа в режиме парсера символа (внутри одинарных кавычек)
Preprocessor(const std::string &fileName)
Конструктор, принимающий на вход имя обрабатываемого файла
std::string resultString
Строка, содержащая окончательный результат обработки файла
Definition: Preprocessor.h:159
bool inStringLastEscape
Признак встречи слэша внутри строки (внутри двойных кавычек)
Definition: Preprocessor.h:63
Заголовочный файл с описанием класса Preprocessor.
std::string initialInput
Строка, содержащая исходный файл в первоначальном виде
Definition: Preprocessor.h:143
Класс, позволяющий выполнять предварительную обработку файлов
Definition: Preprocessor.h:59
void inInlineCommentParser(char ch, std::string &str)
Обработчик символа в режиме парсера однострочного комментария (после //)
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
void afterSlashParser(char ch, std::string &str)
Обработчик символа в режиме парсера выражения после слэша
bool inMultilineLastStar
Признак встречи звездочки внутри многострочного комментария (после &#39;/*&#39;)
Definition: Preprocessor.h:72
void inMultilineCommentParser(char ch, std::string &str)
Обработчик символа в режиме парсера многострочного комментария
bool inInlineLastEscape
Признак встречи слэша внутри однострочного комментария (после //)
Definition: Preprocessor.h:69
char processSymbol(char ch)
Базовая функция обработки символа В зависимости от входого символа возвращает на выход: ...
std::stringstream resultStream
Definition: Preprocessor.h:163
std::string intermediateOutput
Строка, содержащая результат промежуточной обработки файла
Definition: Preprocessor.h:146
void inStringParser(char ch, std::string &str)
Обработчик символа в режиме парсера строки (внутри двойных кавычек)