regex.h 2.57 KB
Newer Older
1
2
3
4
#pragma once

#include <vector>
#include <string>
5
#include <ios>
6
7

namespace YAML
8
9
10
{
	class Stream;

11
	enum REGEX_OP { REGEX_EMPTY, REGEX_MATCH, REGEX_RANGE, REGEX_OR, REGEX_AND, REGEX_NOT, REGEX_SEQ };
12
13
14
15

	// simplified regular expressions
	// . Only straightforward matches (no repeated characters)
	// . Only matches from start of string
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
	class RegEx
	{
	private:
		struct Operator {
			virtual ~Operator() {}
			virtual int Match(const std::string& str, const RegEx& regex) const = 0;
			virtual int Match(std::istream& in, const RegEx& regex) const = 0;
		};

		struct MatchOperator: public Operator {
			virtual int Match(const std::string& str, const RegEx& regex) const;
			virtual int Match(std::istream& in, const RegEx& regex) const;
		};

		struct RangeOperator: public Operator {
			virtual int Match(const std::string& str, const RegEx& regex) const;
			virtual int Match(std::istream& in, const RegEx& regex) const;
		};

		struct OrOperator: public Operator {
			virtual int Match(const std::string& str, const RegEx& regex) const;
			virtual int Match(std::istream& in, const RegEx& regex) const;
		};

40
41
42
43
44
		struct AndOperator: public Operator {
			virtual int Match(const std::string& str, const RegEx& regex) const;
			virtual int Match(std::istream& in, const RegEx& regex) const;
		};

45
46
47
48
49
50
51
52
53
54
		struct NotOperator: public Operator {
			virtual int Match(const std::string& str, const RegEx& regex) const;
			virtual int Match(std::istream& in, const RegEx& regex) const;
		};

		struct SeqOperator: public Operator {
			virtual int Match(const std::string& str, const RegEx& regex) const;
			virtual int Match(std::istream& in, const RegEx& regex) const;
		};

55
	public:
56
57
		friend struct Operator;

58
59
60
		RegEx();
		RegEx(char ch);
		RegEx(char a, char z);
61
62
		RegEx(const std::string& str, REGEX_OP op = REGEX_SEQ);
		RegEx(const RegEx& rhs);
63
64
		~RegEx();

65
66
		RegEx& operator = (const RegEx& rhs);

67
68
		bool Matches(char ch) const;
		bool Matches(const std::string& str) const;
69
70
		bool Matches(std::istream& in) const;
		bool Matches(Stream& in) const;
71
		int Match(const std::string& str) const;
72
73
		int Match(std::istream& in) const;
		int Match(Stream& in) const;
74
75
76

		friend RegEx operator ! (const RegEx& ex);
		friend RegEx operator || (const RegEx& ex1, const RegEx& ex2);
77
		friend RegEx operator && (const RegEx& ex1, const RegEx& ex2);
78
79
80
81
		friend RegEx operator + (const RegEx& ex1, const RegEx& ex2);

	private:
		RegEx(REGEX_OP op);
82
		void SetOp();
83
84
85

	private:
		REGEX_OP m_op;
86
		Operator *m_pOp;
87
88
89
90
		char m_a, m_z;
		std::vector <RegEx> m_params;
	};
}