1
0

yacc.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include <stdio.h>
  2. #include"lex.c"
  3. #include<setjmp.h>
  4. // Token old_token;
  5. int need_TOOKEN = 1;
  6. int jup_number = 0;
  7. void safe_get_token(Token *token){
  8. if (need_TOOKEN){
  9. while (1)
  10. {
  11. get_token(token);
  12. if (token->type != NULL_TOKEN){ // 忽略空语句
  13. break;
  14. }
  15. }
  16. }
  17. else{
  18. need_TOOKEN = 1;
  19. }
  20. }
  21. void unget_token(){
  22. need_TOOKEN = 0;
  23. }
  24. double base(int jmp, jmp_buf *self_env){
  25. double polynomial(); // 声明
  26. safe_get_token(&token);
  27. if (token.type == NUM){
  28. return token.NUMBER;
  29. }
  30. else if (token.type == LB){ // 遇到括号
  31. double value = polynomial();
  32. safe_get_token(&token);
  33. if (token.type = RB){ // 右括号
  34. return value;
  35. }
  36. longjmp(*self_env, jmp);
  37. }
  38. else{
  39. longjmp(*self_env, jmp);
  40. }
  41. }
  42. double term(int jmp, jmp_buf *self_env){
  43. jmp_buf env;
  44. jup_number = setjmp(env);
  45. if (jup_number == 1){
  46. unget_token();
  47. goto returnZero;
  48. }
  49. else if (jup_number == 2){
  50. unget_token();
  51. goto returnV1;
  52. }
  53. double v1 = base(1, &env);
  54. while (1){
  55. safe_get_token(&token);
  56. if (token.type == MUL){
  57. double v2 = base(2, &env);
  58. v1 *= v2;
  59. }
  60. else if (token.type == DIV){
  61. double v2 = base(2, &env);
  62. v1 /= v2;
  63. }
  64. else{
  65. unget_token();
  66. break;
  67. }
  68. }
  69. returnV1:return v1;
  70. returnZero:longjmp(*self_env, jmp);
  71. }
  72. double polynomial(int jmp, jmp_buf *self_env){
  73. jmp_buf env;
  74. jup_number = setjmp(env);
  75. if (jup_number == 1){
  76. unget_token();
  77. goto returnZero;
  78. }
  79. else if (jup_number == 2){
  80. unget_token();
  81. goto returnV1;
  82. }
  83. double v1 = term(1, &env);
  84. while (1){
  85. safe_get_token(&token);
  86. if (token.type == ADD){
  87. double v2 = term(2, &env);
  88. v1 += v2;
  89. }
  90. else if (token.type == SUB){
  91. double v2 = term(2, &env);
  92. v1 -= v2;
  93. }
  94. else{
  95. unget_token();
  96. break;
  97. }
  98. }
  99. returnV1:return v1;
  100. returnZero:longjmp(*self_env, jmp);
  101. }
  102. double expression(){ // 收集STOP的
  103. jmp_buf env;
  104. jup_number = setjmp(env);
  105. if (jup_number == 1){
  106. safe_get_token(&token);
  107. if (token.type == EXIT){
  108. puts("Bye bye!");
  109. exit(1);
  110. }
  111. return 0;
  112. }
  113. double v1 = polynomial(1, &env);
  114. safe_get_token(&token);
  115. if ((token.type != STOP) && (token.type != EXIT)){
  116. unget_token();
  117. }
  118. return v1;
  119. }
  120. void show_answer(){
  121. while (token.type != EXIT){
  122. printf("answer = %f\n", expression());
  123. }
  124. }
  125. void close(){
  126. fclose(fp);
  127. }
  128. int main(int argc,char *argv[]){
  129. int atexit (void (*function) (void));
  130. if (argc == 2){
  131. printf("from %s >>>\n", argv[1]);
  132. fp = fopen(argv[1], "r");
  133. atexit(&close);
  134. }
  135. else{
  136. fp = stdin;
  137. fflush(fp);
  138. }
  139. show_answer();
  140. return 0;
  141. }