18 using follow_set_t = std::array<bool, unsigned(TokenType::TokenType_MAX) + 1>;
31 , lookahead_({Token::CreateArtificial(), Token::CreateArtificial()})
37 template<
unsigned Idx = 0>
45 for (std::size_t i = 1; i != lookahead_.size(); ++i)
46 lookahead_[i - 1] = lookahead_[i];
47 lookahead_.back() = lexer.
next();
52 if (token() == tt or token() == TK_ERROR) {
60 if (accept(tt))
return true;
61 diag.
e(token().pos) <<
"expected " << tt <<
", got " << token().text <<
'\n';
74 return std::make_unique<T>(std::move(start));
77 std::unique_ptr<Command> parse();
78 std::unique_ptr<Instruction> parse_Instruction();
79 std::unique_ptr<Stmt> parse_Stmt();
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();
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();
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();
110 const Type * parse_data_type();
and(sizeof(T)==4) U64x1 reinterpret_to_U64(m
std::ostream & e(const Position pos)
This class represents types in the SQL type system.
Token next()
Obtains the next token from the input stream.
std::array< bool, unsigned(TokenType::TokenType_MAX)+1 > follow_set_t
bool accept(const TokenType tt)
bool is(const TokenType tt)
void recover(const follow_set_t &FS)
Consumes tokens until the first occurence of a token in the follow set FS is found.
bool expect(const TokenType tt)
bool no(const TokenType tt)
std::array< Token, 2 > lookahead_
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.