buffalo
Loading...
Searching...
No Matches
calculator.cpp
Go to the documentation of this file.
1#include <buffalo/buffalo.h>
2#include <cmath>
3#include "Parser.h"
4
5/*
6 * Grammar Definition
7 */
9
10/*
11 * Terminals
12 */
13static bf::DefineTerminal<G, R"(\d+(\.\d+)?)", double> NUMBER([](auto const &tok) {
14 return std::stod(std::string(tok.raw));
15});
16
17static bf::DefineTerminal<G, R"(\^)"> OP_EXP(bf::Right);
18
19static bf::DefineTerminal<G, R"(\*)"> OP_MUL(bf::Left);
20static bf::DefineTerminal<G, R"(\/)"> OP_DIV(bf::Left);
21static bf::DefineTerminal<G, R"(\+)"> OP_ADD(bf::Left);
22static bf::DefineTerminal<G, R"(\-)"> OP_SUB(bf::Left);
23static bf::DefineTerminal<G, R"(\‍()"> PAR_OPEN;
24static bf::DefineTerminal<G, R"(\))"> PAR_CLOSE;
25
26/*
27 * Non-Terminals
28 */
29static bf::DefineNonTerminal<G, "expression"> expression
30 = bf::PR<G>(NUMBER)
31 | (PAR_OPEN + expression + PAR_CLOSE)<=>[](auto &$) { $ = $[1]; }
32 | (expression + OP_EXP + expression)<=>[](auto &$) { $ = std::pow($[0], $[2]); }
33 | (expression + OP_MUL + expression)<=>[](auto &$) { $ = $[0] * $[2]; }
34 | (expression + OP_DIV + expression)<=>[](auto &$) { $ = $[0] / $[2]; }
35 | (expression + OP_ADD + expression)<=>[](auto &$) { $ = $[0] + $[2]; }
36 | (expression + OP_SUB + expression)<=>[](auto &$) { $ = $[0] - $[2]; }
37 ;
38
40 = bf::PR<G>(expression)
41 ;
bf::test::CalculatorG G
Definition calculator.cpp:8
bf::DefineNonTerminal< CalculatorG > calculator
bf::GrammarDefinition< double > CalculatorG
Definition Parser.h:8
constexpr bool always_false_v
Definition buffalo.h:28
@ Left
Definition buffalo.h:398
@ Right
Definition buffalo.h:399