-
-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathreadme-example.cpp
46 lines (39 loc) · 1.04 KB
/
readme-example.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <ctpg/ctpg.hpp>
#include <iostream>
using namespace ctpg;
using namespace ctpg::buffers;
constexpr nterm<int> list("list");
constexpr char number_pattern[] = "[1-9][0-9]*";
constexpr regex_term<number_pattern> number("number");
constexpr int to_int(std::string_view sv)
{
int sum = 0;
for (auto c : sv) { sum *= 10; sum += c - '0'; }
return sum;
}
constexpr parser p(
list,
terms(',', number),
nterms(list),
rules(
list(number)
>= to_int,
list(list, ',', number)
>= [](int sum, char, const auto& n){ return sum + to_int(n); }
)
);
int main(int argc, char* argv[])
{
if (argc < 2)
{
constexpr char example_text[] = "1, 2, 3";
constexpr auto cres = p.parse(cstring_buffer(example_text));
std::cout << cres.value() << std::endl;
return 0;
}
auto res = p.parse(string_buffer(argv[1]), std::cerr);
bool success = res.has_value();
if (success)
std::cout << res.value() << std::endl;
return success ? 0 : -1;
}