-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
35 lines (28 loc) · 948 Bytes
/
Copy pathmain.cpp
File metadata and controls
35 lines (28 loc) · 948 Bytes
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
#include <iostream>
#include <Parser.h>
#include <BasicParsers.h>
int main() {
auto is_digit = [](char c) {return (bool)std::isdigit(c); };
auto to_int = [](std::string s) {return std::stoi(s);};
Parser parseInt = pwhile(is_digit).map<int>(to_int);
Parser parseSum = Parser<int>::combine([parseInt](auto &ss) {
auto n1 = parseInt[ss];
pchar('+')[ss];
auto n2 = parseInt[ss];
return n1 + n2;
});
Parser parseMult = Parser<int>::combine([parseInt](auto &ss) {
auto n1 = parseInt[ss];
pchar('*')[ss];
auto n2 = parseInt[ss];
return n1 * n2;
});
Parser parseSumOrMult = parseSum | parseMult;
std::string input1 = "123+456";
std::string input2 = "8*1023";
SStream ss1(input1);
SStream ss2(input2);
std::cout << parseSumOrMult.runParser(ss1).obj << "\n";
std::cout << parseSumOrMult.runParser(ss2).obj << "\n";
return 0;
}