fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. char input[100], stack[100];
  6. int top = -1;
  7.  
  8. void push(char c) {
  9. stack[++top] = c;
  10. stack[top + 1] = '\0';
  11. }
  12.  
  13. void reduce() {
  14. // E -> id
  15. if (top >= 0 && isalpha(stack[top])) {
  16. stack[top] = 'E';
  17. printf("Reduce: E -> id\n");
  18. }
  19.  
  20. // E -> (E)
  21. if (top >= 2 && stack[top] == ')' && stack[top - 1] == 'E' && stack[top - 2] == '(') {
  22. stack[top - 2] = 'E';
  23. top -= 2;
  24. stack[top + 1] = '\0';
  25. printf("Reduce: E -> (E)\n");
  26. }
  27.  
  28. // E -> E + E
  29. if (top >= 2 && stack[top] == 'E' && stack[top - 1] == '+' && stack[top - 2] == 'E') {
  30. stack[top - 2] = 'E';
  31. top -= 2;
  32. stack[top + 1] = '\0';
  33. printf("Reduce: E -> E + E\n");
  34. }
  35.  
  36. // E -> E * E
  37. if (top >= 2 && stack[top] == 'E' && stack[top - 1] == '*' && stack[top - 2] == 'E') {
  38. stack[top - 2] = 'E';
  39. top -= 2;
  40. stack[top + 1] = '\0';
  41. printf("Reduce: E -> E * E\n");
  42. }
  43. }
  44.  
  45. int main() {
  46. printf("Enter Expression: ");
  47.  
  48. scanf(" %[^\n]", input); // بدل fgets
  49.  
  50. for (int i = 0; input[i] != '\0'; i++) {
  51.  
  52. if (input[i] == ' ')
  53. continue;
  54.  
  55. push(input[i]);
  56. printf("Shift: %s\n", stack);
  57.  
  58. reduce();
  59. }
  60.  
  61. if (strcmp(stack, "E") == 0)
  62. printf("String Accepted\n");
  63. else
  64. printf("String Rejected\n");
  65.  
  66. return 0;
  67. }
Success #stdin #stdout 0s 5320KB
stdin
(a + (b*a))
stdout
Enter Expression: Shift: (
Shift: (a
Reduce: E -> id
Shift: (E+
Shift: (E+(
Shift: (E+(b
Reduce: E -> id
Shift: (E+(E*
Shift: (E+(E*a
Reduce: E -> id
Reduce: E -> E * E
Shift: (E+(E)
Reduce: E -> (E)
Reduce: E -> E + E
Shift: (E)
Reduce: E -> (E)
String Accepted