-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSyntaxAnalyzer.h
More file actions
83 lines (70 loc) · 3.39 KB
/
Copy pathSyntaxAnalyzer.h
File metadata and controls
83 lines (70 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*!
* \file
* \brief Заголовочный файл синтаксического анализатора
* \author InvalidPointer
*
* Данный файл содержит в себе определение класса синтаксического анализатора
*
* Грамматика, которую использует анализатор:
* E -> (E)O | EE | {literal}O | E\|E
* O -> *O | {,n}O | {m,}O | _
*/
#ifndef MYGREP_SYNTAXANALYZER_H
#define MYGREP_SYNTAXANALYZER_H
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
#include <stdexcept>
#include "token.h"
using namespace std;
/*!
* \brief Синтаксический анализатор
*
* Синтаксический анализатор преобразует последовательность лексем, полученную от лексического анализатора,
* в префиксную форму, проверяя синтаксис регулярного выражения
*/
class SyntaxAnalyzer
{
private:
vector<token> raw_tokens; ///< Вектор исходных лексем
vector<token> pf_tokens; ///< Вектор с преобразованными лексемами
vector<token>::iterator it; ///< Итератор, используемый для обхода вектора исходных лексем
int brackets_count; ///< Количество незакрытых скобок
string buf; ///< Буфер, используемый для объединения подряд идущих последовательностей литералов
///Инициализирует анализатор
void init();
/*!
* Проверяет выражение и преобразовывает его в префиксную форму
* \param[in] last Показывает, надо ли останавливаться перед проверкой бинарной операции перечисления
*/
void E(bool last = false);
/*!
* Проверяет наличие операций и добавляет их в вектор лексем
* \param[in] pos Позиция, куда необходимо вставить операции
*
* \return Наличие операций
*/
bool O(int pos = -1);
/*!
* Очищает буфер, занося его содержимое в вектор преобразованных лексем
* \param[in] pos Позиция, куда необходимо вставить содержимое буфера
*
* \return Заполненность буфера на момент вызова
*/
bool flush_buf(int pos = -1);
public:
/*!
* Конструктор синтаксического анализатора
* \param[in] tokens Вектор лексем, подлежащий обработке
*/
SyntaxAnalyzer(const vector<token> &tokens);
~SyntaxAnalyzer() {}
/*!
* Производит синтаксический анализ регулярного выражения
*
* \return Вектор из лексем, который является префиксной записью регулярного выражения
*/
vector<token> analyze();
};
#endif //MYGREP_SYNTAXANALYZER_H