xiiregexbuilder

FPGA-Accelerated Regular Expression Matching Engine

src/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