fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. char input[100];
  6. int i = 0;
  7.  
  8. void shift(char c) {
  9. printf("Shift: %c\n", c);
  10. }
  11.  
  12. void reduce(const char* rule) {
  13. printf("Reduce: %s\n", rule);
  14. }
  15.  
  16. void parse() {
  17. char stack[100];
  18. int top = -1;
  19. int len = strlen(input);
  20.  
  21. while (i < len) {
  22. if (isspace(input[i])) {
  23. i++;
  24. continue;
  25. }
  26.  
  27. stack[++top] = input[i];
  28. shift(input[i]);
  29. i++;
  30.  
  31. int change;
  32. do {
  33. change = 0;
  34.  
  35. if (top >= 2 && stack[top] == ')' && stack[top - 2] == '(' && stack[top - 1] == 'E') {
  36. top -= 2;
  37. stack[top] = 'E';
  38. reduce("E → (E)");
  39. change = 1;
  40. }
  41. else if (top >= 2 && stack[top] == 'E' && stack[top - 1] == '+' && stack[top - 2] == 'E') {
  42. top -= 2;
  43. stack[top] = 'E';
  44. reduce("E → E+E");
  45. change = 1;
  46. }
  47. else if (top >= 2 && stack[top] == 'E' && stack[top - 1] == '*' && stack[top - 2] == 'E') {
  48. top -= 2;
  49. stack[top] = 'E';
  50. reduce("E → E*E");
  51. change = 1;
  52. }
  53. else if (top >= 0 && islower(stack[top])) {
  54. stack[top] = 'E';
  55. reduce("E → id");
  56. change = 1;
  57. }
  58.  
  59. } while (change);
  60. }
  61.  
  62. if (top == 0 && stack[top] == 'E') {
  63. printf("String Accepted \n");
  64. }
  65. else {
  66. printf("String Rejected \n");
  67. }
  68. }
  69.  
  70. int main() {
  71. printf("Enter an Expression: ");
  72. fgets(input, sizeof(input), stdin);
  73. input[strcspn(input, "\n")] = 0;
  74.  
  75. parse();
  76.  
  77. return 0;
  78. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Enter an Expression: String Rejected