mutable
A Database System for Research and Fast Prototyping
Loading...
Searching...
No Matches
Parser.hpp
Go to the documentation of this file.
1#pragma once
2
3
4#include "lex/Lexer.hpp"
5#include <array>
10
11
12namespace m {
13
14namespace ast {
15
16struct M_EXPORT Parser
17{
18 using follow_set_t = std::array<bool, unsigned(TokenType::TokenType_MAX) + 1>;
19
20 public:
23
24 private:
25 std::array<Token, 2> lookahead_;
26
27 public:
28 explicit Parser(Lexer &lexer)
29 : lexer(lexer)
30 , diag(lexer.diag)
31 , lookahead_({Token::CreateArtificial(), Token::CreateArtificial()})
32 {
33 consume();
34 consume();
35 }
36
37 template<unsigned Idx = 0>
38 const Token & token() { return lookahead_[Idx]; }
39
40 bool is(const TokenType tt) { return token() == tt; }
41 bool no(const TokenType tt) { return token() != tt; }
42
44 auto old = token();
45 for (std::size_t i = 1; i != lookahead_.size(); ++i)
46 lookahead_[i - 1] = lookahead_[i];
47 lookahead_.back() = lexer.next();
48 return old;
49 }
50
51 bool accept(const TokenType tt) {
52 if (token() == tt or token() == TK_ERROR) {
53 consume();
54 return true;
55 }
56 return false;
57 }
58
59 bool expect(const TokenType tt) {
60 if (accept(tt)) return true;
61 diag.e(token().pos) << "expected " << tt << ", got " << token().text << '\n';
62 return false;
63 }
64
66 void recover(const follow_set_t &FS) { while (token() and not FS[token().type]) consume(); }
67
71 template<typename T>
72 std::unique_ptr<T> recover(Token start, const follow_set_t &FS) {
73 recover(FS);
74 return std::make_unique<T>(std::move(start));
75 }
76
77 std::unique_ptr<Command> parse();
78 std::unique_ptr<Instruction> parse_Instruction();
79 std::unique_ptr<Stmt> parse_Stmt();
80
81 /* Statements */
82 std::unique_ptr<Stmt> parse_CreateDatabaseStmt();
83 std::unique_ptr<Stmt> parse_DropDatabaseStmt();
84 std::unique_ptr<Stmt> parse_UseDatabaseStmt();
85 std::unique_ptr<Stmt> parse_CreateTableStmt();
86 std::unique_ptr<Stmt> parse_DropTableStmt();
87 std::unique_ptr<Stmt> parse_CreateIndexStmt();
88 std::unique_ptr<Stmt> parse_DropIndexStmt();
89 std::unique_ptr<Stmt> parse_SelectStmt();
90 std::unique_ptr<Stmt> parse_InsertStmt();
91 std::unique_ptr<Stmt> parse_UpdateStmt();
92 std::unique_ptr<Stmt> parse_DeleteStmt();
93 std::unique_ptr<Stmt> parse_ImportStmt();
94
95 /* Clauses */
96 std::unique_ptr<Clause> parse_SelectClause();
97 std::unique_ptr<Clause> parse_FromClause();
98 std::unique_ptr<Clause> parse_WhereClause();
99 std::unique_ptr<Clause> parse_GroupByClause();
100 std::unique_ptr<Clause> parse_HavingClause();
101 std::unique_ptr<Clause> parse_OrderByClause();
102 std::unique_ptr<Clause> parse_LimitClause();
103
104 /* Expressions */
105 std::unique_ptr<Expr> parse_Expr(int precedence_lhs = 0, std::unique_ptr<Expr> lhs = nullptr);
106 std::unique_ptr<Expr> parse_designator();
107 std::unique_ptr<Expr> expect_integer();
108
109 /* Types */
110 const Type * parse_data_type();
111};
112
113}
114
115}
and(sizeof(T)==4) U64x1 reinterpret_to_U64(m
Definition: WasmAlgo.cpp:266
‍mutable namespace
Definition: Backend.hpp:10
TokenType
Definition: TokenType.hpp:10
std::ostream & e(const Position pos)
Definition: Diagnostic.hpp:41
This class represents types in the SQL type system.
Definition: Type.hpp:46
Token next()
Obtains the next token from the input stream.
Definition: Lexer.cpp:20
std::array< bool, unsigned(TokenType::TokenType_MAX)+1 > follow_set_t
Definition: Parser.hpp:18
Lexer & lexer
Definition: Parser.hpp:21
bool accept(const TokenType tt)
Definition: Parser.hpp:51
bool is(const TokenType tt)
Definition: Parser.hpp:40
Token consume()
Definition: Parser.hpp:43
void recover(const follow_set_t &FS)
Consumes tokens until the first occurence of a token in the follow set FS is found.
Definition: Parser.hpp:66
bool expect(const TokenType tt)
Definition: Parser.hpp:59
Parser(Lexer &lexer)
Definition: Parser.hpp:28
const Token & token()
Definition: Parser.hpp:38
bool no(const TokenType tt)
Definition: Parser.hpp:41
Diagnostic & diag
Definition: Parser.hpp:22
std::array< Token, 2 > lookahead_
Definition: Parser.hpp:25
std::unique_ptr< T > recover(Token start, const follow_set_t &FS)
Consumes tokens until the first occurence of a token in the follow set FS is found.
Definition: Parser.hpp:72