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 47 48 49 50 51 52 53 54 55
|
#include <iostream>
#include <vector>
#include <sstream>
#include <pog/parser.h>
using namespace pog;
int main()
{
Parser<int> p;
p.token(R"(\s+)");
p.token(R"(\+)").symbol("+").precedence(1, Associativity::Left);
p.token(R"(\*)").symbol("*").precedence(2, Associativity::Left);
p.token(R"(-)").symbol("-").precedence(1, Associativity::Left);
p.token("\\(").symbol("(");
p.token("\\)").symbol(")");
p.token("[0-9]+").symbol("num").action([](std::string_view str) {
return std::stoi(std::string{str});
});
p.set_start_symbol("E");
p.rule("E") // E ->
.production("E", "+", "E", [](auto&& args) { // E + E
return args[0] + args[2];
})
.production("E", "-", "E", [](auto&& args) { // E - E
return args[0] - args[2];
})
.production("E", "*", "E", [](auto&& args) { // E * E
return args[0] * args[2];
})
.production("(", "E", ")", [](auto&& args) { // ( E )
return args[1];
})
.production("num", [](auto&& args) { // num
return args[0];
})
.production("-", "E", [](auto&& args) { // - E
return -args[1];
}).precedence(3, Associativity::Right);
auto report = p.prepare();
if (!report)
{
fmt::print("{}\n", report.to_string());
return 1;
}
std::stringstream input("11 + 4 * 3 + 2");
auto result = p.parse(input);
fmt::print("Result: {}\n", result.value());
}
|