Guest User

Untitled

a guest
Dec 17th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.44 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4.  
  5. using bin = int(*)(int, int);
  6. using un = int(*)(int);
  7.  
  8. struct {
  9. int prec;
  10. bin fn;
  11. } bin_table[256];
  12.  
  13. struct {
  14. int prec;
  15. un fn;
  16. } un_table[256];
  17.  
  18. const char *src;
  19.  
  20. bool is_digit(char ch) {
  21. return ch >= '0' && ch <= '9';
  22. }
  23.  
  24. int pratt(int prec = 0) {
  25. int left = 0;
  26.  
  27. if (is_digit(*src)) {
  28. while (is_digit(*src)) {
  29. left = left*10 + *src - '0';
  30. src++;
  31. }
  32. } else if (un_table[*src].fn != nullptr) {
  33. char op = *src++;
  34. left = pratt(un_table[op].prec);
  35. left = un_table[op].fn(left);
  36. } else {
  37. fprintf(stderr, "unknown character: %c\n", *src);
  38. exit(1);
  39. }
  40.  
  41. while (prec < bin_table[*src].prec) {
  42. char op = *src++;
  43. left = bin_table[op].fn(left, pratt(bin_table[op].prec));
  44. }
  45.  
  46. return left;
  47. }
  48.  
  49. int main(int argc, char **argv) {
  50. if (argc < 2) {
  51. printf("usage: pratt expr\n");
  52. return 1;
  53. }
  54. src = argv[1];
  55. memset(bin_table, 0, sizeof(bin_table));
  56. memset(un_table, 0, sizeof(un_table));
  57. un_table['\0'] = {0, nullptr};
  58. un_table['-'] = {50, [](int a) {return -a;}};
  59. un_table['+'] = {50, [](int a) {return a;}};
  60. bin_table['\0'] = {0, nullptr};
  61. bin_table['+'] = {10, [](int a, int b){return a + b;}};
  62. bin_table['-'] = {10, [](int a, int b){return a - b;}};
  63. bin_table['*'] = {20, [](int a, int b){return a * b;}};
  64. bin_table['/'] = {20, [](int a, int b){return a / b;}};
  65. bin_table['%'] = {20, [](int a, int b){return a % b;}};
  66. printf("%d\n", pratt());
  67.  
  68. return 0;
  69. }
Add Comment
Please, Sign In to add comment