blob: e7bedd3be260fe1118cb734308dea6db165267ed [file] [log] [blame]
Václav Kubernát9ae8cc42020-03-25 19:17:41 +01001/*
2 * Copyright (C) 2020 CESNET, https://photonics.cesnet.cz/
3 *
4 * Written by Václav Kubernát <kubernat@cesnet.cz>
5 *
6*/
7
8#pragma once
9#include <boost/spirit/home/x3.hpp>
10#include "ast_handlers.hpp"
11x3::rule<module_identifier_class, std::string> const module_identifier = "module_identifier";
12x3::rule<module_class, module_> const module = "module";
13x3::rule<node_identifier_class, std::string> const node_identifier = "node_identifier";
Václav Kubernátd0ea9b22020-04-24 00:44:15 +020014x3::rule<space_separator_class, x3::unused_type> const space_separator = "a space";
15x3::rule<completing_class, x3::unused_type> const completing = "completing";
16
17// This is a pseudo-parser, that fails if we're not completing a command
18auto const completing_def =
Václav Kubernát76bb8c22022-01-19 01:32:31 +010019 x3::eps;
Václav Kubernátd0ea9b22020-04-24 00:44:15 +020020
Václav Kubernát9ae8cc42020-03-25 19:17:41 +010021auto const node_identifier_def =
Václav Kubernát76bb8c22022-01-19 01:32:31 +010022 ((x3::alpha | x3::char_("_")) >> *(x3::alnum | x3::char_("_") | x3::char_("-") | x3::char_(".")));
Václav Kubernát9ae8cc42020-03-25 19:17:41 +010023
24auto const module_def =
Václav Kubernát76bb8c22022-01-19 01:32:31 +010025 module_identifier >> ':' >> !x3::space;
Václav Kubernát9ae8cc42020-03-25 19:17:41 +010026
27auto const module_identifier_def =
Václav Kubernát76bb8c22022-01-19 01:32:31 +010028 ((x3::alpha | x3::char_("_")) >> *(x3::alnum | x3::char_("_") | x3::char_("-") | x3::char_(".")));
Václav Kubernát9ae8cc42020-03-25 19:17:41 +010029
Václav Kubernátd0ea9b22020-04-24 00:44:15 +020030auto const space_separator_def =
Václav Kubernát76bb8c22022-01-19 01:32:31 +010031 x3::omit[+x3::space];
Václav Kubernátd0ea9b22020-04-24 00:44:15 +020032
Václav Kubernáte118f002020-05-14 22:54:13 +020033template <typename CoerceTo>
34struct as_type {
35 template <typename...> struct Tag{};
36
37 template <typename ParserType>
38 auto operator[](ParserType p) const {
39 return x3::rule<Tag<CoerceTo, ParserType>, CoerceTo> {"as"} = x3::as_parser(p);
40 }
41};
42
43// The `as` parser creates an ad-hoc x3::rule with the attribute specified with `CoerceTo`.
44// Example usage: as<std::string>[someParser]
45// someParser will have its attribute coerced to std::string
46// https://github.com/boostorg/spirit/issues/530#issuecomment-584836532
47template <typename CoerceTo> const as_type<CoerceTo> as{};
48
Václav Kubernát9ae8cc42020-03-25 19:17:41 +010049BOOST_SPIRIT_DEFINE(node_identifier)
50BOOST_SPIRIT_DEFINE(module)
51BOOST_SPIRIT_DEFINE(module_identifier)
Václav Kubernátd0ea9b22020-04-24 00:44:15 +020052BOOST_SPIRIT_DEFINE(space_separator)
53BOOST_SPIRIT_DEFINE(completing)