File: calculator.cpp

package info (click to toggle)
libpog 0.5.3-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 3,644 kB
  • sloc: cpp: 51,038; ansic: 239; makefile: 14; python: 11; sh: 11
file content (55 lines) | stat: -rw-r--r-- 1,326 bytes parent folder | download
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());
}