Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- using bin = int(*)(int, int);
- using un = int(*)(int);
- struct {
- int prec;
- bin fn;
- } bin_table[256];
- struct {
- int prec;
- un fn;
- } un_table[256];
- const char *src;
- bool is_digit(char ch) {
- return ch >= '0' && ch <= '9';
- }
- int pratt(int prec = 0) {
- int left = 0;
- if (is_digit(*src)) {
- while (is_digit(*src)) {
- left = left*10 + *src - '0';
- src++;
- }
- } else if (un_table[*src].fn != nullptr) {
- char op = *src++;
- left = pratt(un_table[op].prec);
- left = un_table[op].fn(left);
- } else {
- fprintf(stderr, "unknown character: %c\n", *src);
- exit(1);
- }
- while (prec < bin_table[*src].prec) {
- char op = *src++;
- left = bin_table[op].fn(left, pratt(bin_table[op].prec));
- }
- return left;
- }
- int main(int argc, char **argv) {
- if (argc < 2) {
- printf("usage: pratt expr\n");
- return 1;
- }
- src = argv[1];
- memset(bin_table, 0, sizeof(bin_table));
- memset(un_table, 0, sizeof(un_table));
- un_table['\0'] = {0, nullptr};
- un_table['-'] = {50, [](int a) {return -a;}};
- un_table['+'] = {50, [](int a) {return a;}};
- bin_table['\0'] = {0, nullptr};
- bin_table['+'] = {10, [](int a, int b){return a + b;}};
- bin_table['-'] = {10, [](int a, int b){return a - b;}};
- bin_table['*'] = {20, [](int a, int b){return a * b;}};
- bin_table['/'] = {20, [](int a, int b){return a / b;}};
- bin_table['%'] = {20, [](int a, int b){return a % b;}};
- printf("%d\n", pratt());
- return 0;
- }
Add Comment
Please, Sign In to add comment