-
Notifications
You must be signed in to change notification settings - Fork 0
/
RegexObject.cpp
116 lines (108 loc) · 2.21 KB
/
RegexObject.cpp
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "RegexObject.h"
#include "Expression.h"
#include "Regex.h"
RegexObject::RegexObject()
{
value = '\0';
charSet = NULL;
expression = NULL;
type = RegexObjectType::CHARACTER;
}
RegexObject::RegexObject(const RegexObject& rhs)
{
value = rhs.value;
type = rhs.type;
if (rhs.expression != NULL)
expression = new Expression(*rhs.expression);
else expression = NULL;
if (rhs.charSet != NULL)
charSet = new CharacterSet(*rhs.charSet);
else charSet = NULL;
}
RegexObject::~RegexObject()
{
if (expression != NULL) delete expression;
if (charSet != NULL) delete charSet;
}
void RegexObject::parse(Regex* rgx)
{
char c = rgx->src.get();
if (c == '(')
{
rgx->src.moveBack();
type = RegexObjectType::EXPRESSION;
expression = new Expression;
expression->parse(rgx);
rgx->src.get();
}
else if (c == '[')
{
type = RegexObjectType::CHARACTER_SET;
charSet = new CharacterSet;
charSet->parse(rgx);
rgx->src.get();
}
else if (c == '\\')
{
c = rgx->src.get();
char C = (c >= 'a' && c <= 'z') ? c - 32 : c;
if (C == 'D' || C == 'S' || C == 'W')
{
type = RegexObjectType::CHARACTER_SET;
charSet = new CharacterSet(c);
}
else
{
type = RegexObjectType::CHARACTER;
value = Utility::getEquivalentCharacter(c);
}
}
else
{
type = RegexObjectType::CHARACTER;
value = c;
}
}
RegexObject& RegexObject::operator=(const RegexObject& rhs)
{
if (this != &rhs)
{
if (expression != NULL) delete expression;
if (charSet != NULL) delete charSet;
value = rhs.value;
type = rhs.type;
if (rhs.expression != NULL)
expression = new Expression(*rhs.expression);
else expression = NULL;
if (rhs.charSet != NULL)
charSet = new CharacterSet(*rhs.charSet);
else charSet = NULL;
}
return *this;
}
bool RegexObject::matches(Regex* rgx)
{
if (type == RegexObjectType::CHARACTER)
{
if (value == rgx->matchString.peek())
{
rgx->matchString.moveForward();
return true;
}
else return false;
}
else if (type == RegexObjectType::CHARACTER_SET)
{
if (charSet->contains(rgx->matchString.peek()))
{
rgx->matchString.moveForward();
return true;
}
else return false;
}
else if (type == RegexObjectType::EXPRESSION)
{
return (expression->matches(rgx));
}
return true;
}