xiiregexbuilder
FPGA-Accelerated Regular Expression Matching Enginesrc/parser.h (2722B)
1#ifndef PARSER_H
2#define PARSER_H
3
4#include <memory>
5#include <vector>
6#include <set>
7#include "lexer.h"
8
9enum class ASTNodeType {
10 LITERAL,
11 DOT,
12 CONCATENATION,
13 UNION,
14 STAR,
15 PLUS,
16 OPTIONAL,
17 CHAR_CLASS
18};
19
20class ASTNode {
21public:
22 ASTNodeType type;
23 virtual ~ASTNode() = default;
24
25 bool nullable = false;
26 std::set<int> firstpos;
27 std::set<int> lastpos;
28
29 explicit ASTNode(ASTNodeType t) : type(t) {}
30};
31
32std::string nodeTypeToString(ASTNodeType type);
33
34class LiteralNode : public ASTNode {
35public:
36 char value;
37 int position;
38 explicit LiteralNode(char v) : ASTNode(ASTNodeType::LITERAL), value(v), position(-1) {}
39};
40
41class CharClassNode : public ASTNode {
42public:
43 std::set<unsigned char> characters;
44 int position;
45 CharClassNode() : ASTNode(ASTNodeType::CHAR_CLASS), position(-1) {}
46};
47
48class DotNode : public ASTNode {
49public:
50 int position;
51 DotNode() : ASTNode(ASTNodeType::DOT), position(-1) {}
52};
53
54class ConcatenationNode : public ASTNode {
55public:
56 std::unique_ptr<ASTNode> left;
57 std::unique_ptr<ASTNode> right;
58 ConcatenationNode(std::unique_ptr<ASTNode> l, std::unique_ptr<ASTNode> r)
59 : ASTNode(ASTNodeType::CONCATENATION), left(std::move(l)), right(std::move(r)) {}
60};
61
62class UnionNode : public ASTNode {
63public:
64 std::unique_ptr<ASTNode> left;
65 std::unique_ptr<ASTNode> right;
66 UnionNode(std::unique_ptr<ASTNode> l, std::unique_ptr<ASTNode> r)
67 : ASTNode(ASTNodeType::UNION), left(std::move(l)), right(std::move(r)) {}
68};
69
70class StarNode : public ASTNode {
71public:
72 std::unique_ptr<ASTNode> inner;
73 explicit StarNode(std::unique_ptr<ASTNode> i)
74 : ASTNode(ASTNodeType::STAR), inner(std::move(i)) {}
75};
76
77class PlusNode : public ASTNode {
78public:
79 std::unique_ptr<ASTNode> inner;
80 explicit PlusNode(std::unique_ptr<ASTNode> i)
81 : ASTNode(ASTNodeType::PLUS), inner(std::move(i)) {}
82};
83
84class OptionalNode : public ASTNode {
85public:
86 std::unique_ptr<ASTNode> inner;
87 explicit OptionalNode(std::unique_ptr<ASTNode> i)
88 : ASTNode(ASTNodeType::OPTIONAL), inner(std::move(i)) {}
89};
90
91class Parser {
92public:
93 explicit Parser(const std::vector<Token>& tokens);
94 std::unique_ptr<ASTNode> parse();
95
96private:
97 const std::vector<Token>& tokens;
98 size_t pos;
99
100 std::unique_ptr<ASTNode> parseExpression();
101 std::unique_ptr<ASTNode> parseTerm();
102 std::unique_ptr<ASTNode> parseFactor();
103 std::unique_ptr<ASTNode> parseAtom();
104
105 const Token& peek() const;
106 const Token& advance();
107 bool match(TokenType type);
108 bool check(TokenType type) const;
109 bool isAtEnd() const;
110
111 void error(const std::string& message) const;
112};
113
114#endif // PARSER_H