1#include <vkdb/parser.h>
6 const std::vector<Token>& tokens,
7 error_callback callback
9 : tokens_{tokens}, callback_{callback}, position_{0} {}
13 return parse_expression();
20 callback_(token, message);
24void Parser::synchronise() {
26 while (tokens_remaining()) {
27 if (peek_back().type() == TokenType::SEMICOLON) {
30 if (QUERY_BASE_WORDS.contains(peek().type())) {
37bool Parser::tokens_remaining() const noexcept {
38 return position_ < tokens_.size();
41Token Parser::peek_back()
const {
42 return tokens_[position_ - 1];
45Token Parser::peek()
const {
46 return tokens_[position_];
49Token Parser::advance() noexcept {
50 if (tokens_remaining()) {
56bool Parser::check(TokenType type)
const noexcept {
57 if (!tokens_remaining()) {
60 return peek().type() == type;
63template <AllSameNoCVRefQuals<TokenType>... TokenTypes>
64bool Parser::match(TokenTypes... types)
noexcept {
65 for (
const auto& type : {types...}) {
74Token Parser::consume(TokenType type,
const std::string& message) {
78 throw error(peek(), message);
81Expr Parser::parse_expression() {
84 expr.push_back(parse_query());
85 consume(TokenType::SEMICOLON,
"Expected semicolon.");
86 }
while (tokens_remaining() && !check(TokenType::END_OF_FILE));
90Query Parser::parse_query() {
91 switch (peek().type()) {
92 case TokenType::SELECT:
93 return parse_select_query();
95 return parse_put_query();
96 case TokenType::DELETE:
97 return parse_delete_query();
98 case TokenType::CREATE:
99 return parse_create_query();
100 case TokenType::DROP:
101 return parse_drop_query();
103 return parse_add_query();
104 case TokenType::REMOVE:
105 return parse_remove_query();
106 case TokenType::TABLES:
107 return parse_tables_query();
109 throw error(peek(),
"Expected query base word.");
113SelectQuery Parser::parse_select_query() {
114 consume(TokenType::SELECT,
"Expected SELECT.");
115 auto select_type{parse_select_type()};
116 auto metric{parse_metric()};
117 consume(TokenType::FROM,
"Expected FROM.");
118 auto table_name{parse_table_name()};
119 auto select_clause{parse_select_clause()};
128PutQuery Parser::parse_put_query() {
129 consume(TokenType::PUT,
"Expected PUT");
130 auto metric{parse_metric()};
131 auto timestamp{parse_timestamp()};
132 auto value{parse_value()};
133 consume(TokenType::INTO,
"Expected INTO.");
134 auto table_name{parse_table_name()};
135 TagListExpr tag_list;
136 if (match(TokenType::TAGS)) {
137 tag_list = parse_tag_list();
148DeleteQuery Parser::parse_delete_query() {
149 consume(TokenType::DELETE,
"Expected DELETE.");
150 auto metric{parse_metric()};
151 auto timestamp{parse_timestamp()};
152 consume(TokenType::FROM,
"Expected FROM.");
153 auto table_name{parse_table_name()};
154 TagListExpr tag_list;
155 if (match(TokenType::TAGS)) {
156 tag_list = parse_tag_list();
166CreateQuery Parser::parse_create_query() {
167 consume(TokenType::CREATE,
"Expected CREATE.");
168 consume(TokenType::TABLE,
"Expected TABLE.");
169 auto table_name{parse_table_name()};
170 TagColumnsExpr tag_columns;
171 if (match(TokenType::TAGS)) {
172 tag_columns = parse_tag_columns();
180DropQuery Parser::parse_drop_query() {
181 consume(TokenType::DROP,
"Expected DROP.");
182 consume(TokenType::TABLE,
"Expected TABLE.");
183 auto table_name{parse_table_name()};
187AddQuery Parser::parse_add_query() {
188 consume(TokenType::ADD,
"Expected ADD.");
189 consume(TokenType::TAGS,
"Expected TAGS.");
190 auto tag_columns{parse_tag_columns()};
191 consume(TokenType::TO,
"Expected TO.");
192 auto table_name{parse_table_name()};
199RemoveQuery Parser::parse_remove_query() {
200 consume(TokenType::REMOVE,
"Expected REMOVE.");
201 consume(TokenType::TAGS,
"Expected TAGS.");
202 auto tag_columns{parse_tag_columns()};
203 consume(TokenType::FROM,
"Expected FROM.");
204 auto table_name{parse_table_name()};
211TablesQuery Parser::parse_tables_query() {
212 auto tables{consume(TokenType::TABLES,
"Expected TABLES.")};
216SelectType Parser::parse_select_type() {
217 auto select_type{[
this]() -> SelectType {
218 switch (peek().type()) {
219 case TokenType::DATA:
221 return SelectTypeDataExpr{peek()};
222 case TokenType::COUNT:
224 return SelectTypeCountExpr{peek()};
227 return SelectTypeAvgExpr{peek()};
230 return SelectTypeSumExpr{peek()};
233 return SelectTypeMinExpr{peek()};
236 return SelectTypeMaxExpr{peek()};
238 throw error(peek(),
"Expected select type.");
244SelectClause Parser::parse_select_clause() {
245 switch (peek().type()) {
247 return parse_all_clause();
248 case TokenType::BETWEEN:
249 return parse_between_clause();
251 return parse_at_clause();
253 throw error(peek(),
"Expected select clause.");
257AllClause Parser::parse_all_clause() {
258 consume(TokenType::ALL,
"Expected ALL.");
259 WhereClause where_clause;
260 if (check(TokenType::WHERE)) {
261 where_clause = parse_where_clause();
263 return {where_clause};
266BetweenClause Parser::parse_between_clause() {
267 consume(TokenType::BETWEEN,
"Expected BETWEEN.");
268 auto start_timestamp{parse_timestamp()};
269 consume(TokenType::AND,
"Expected AND.");
270 auto end_timestamp{parse_timestamp()};
271 WhereClause where_clause;
272 if (check(TokenType::WHERE)) {
273 where_clause = parse_where_clause();
282AtClause Parser::parse_at_clause() {
283 consume(TokenType::AT,
"Expected AT.");
284 auto timestamp{parse_timestamp()};
285 WhereClause where_clause;
286 if (check(TokenType::WHERE)) {
287 where_clause = parse_where_clause();
295WhereClause Parser::parse_where_clause() {
296 consume(TokenType::WHERE,
"Expected WHERE.");
297 auto tag_list{parse_tag_list()};
301TagListExpr Parser::parse_tag_list() {
302 std::vector<TagExpr> tags;
304 tags.push_back(parse_tag());
305 }
while (match(TokenType::COMMA));
309TagExpr Parser::parse_tag() {
310 auto tag_key{parse_tag_key()};
311 consume(TokenType::EQUAL,
"Expected '='.");
312 auto tag_value{parse_tag_value()};
319TagColumnsExpr Parser::parse_tag_columns() {
320 std::vector<TagKeyExpr> keys;
322 keys.push_back(parse_tag_key());
323 }
while (match(TokenType::COMMA));
327TagKeyExpr Parser::parse_tag_key() {
328 auto tag_key{consume(TokenType::IDENTIFIER,
"Expected tag key.")};
332TagValueExpr Parser::parse_tag_value() {
333 auto tag_value{consume(TokenType::IDENTIFIER,
"Expected tag value.")};
337MetricExpr Parser::parse_metric() {
338 auto metric{consume(TokenType::IDENTIFIER,
"Expected metric.")};
342TableNameExpr Parser::parse_table_name() {
343 auto table_name{consume(TokenType::IDENTIFIER,
"Expected table name.")};
347TimestampExpr Parser::parse_timestamp() {
348 auto timestamp{consume(TokenType::NUMBER,
"Expected timestamp.")};
352ValueExpr Parser::parse_value() {
353 auto value{consume(TokenType::NUMBER,
"Expected value.")};
Exception class for parse errors.
Parser()=delete
Deleted default constructor.
std::optional< Expr > parse() noexcept
Parses the tokens into an expression.