大家好,又见面了,我是全栈君。
该算术表达式的上下文无关文法是:
E -> E + T
| E – T
| T
T -> T * F
| T / F
| F
F -> num
| (E)
部分代码来自MOOC
#include <ctype.h> #include <stdio.h> #include <stdlib.h> void parse_F(); void parse_T(); void parse_E(); void error (char *want, char got); int i; char *str = 0; void error (char *want, char got) { fprintf (stderr, "Compling this expression:\n%s\n", str); int j = i; while (j--) fprintf (stderr, " "); fprintf (stderr, "^\n"); fprintf (stderr, "Syntax error at position: %d\n" "\texpecting: %s\n" "\tbut got : %c\n", i, want, got); exit (0); return; } void parse_F() { char c = str[i]; if (isdigit(c)){ i++; return; } if (c=='('){ i++; parse_E(); c = str[i]; if (c==')'){ i++; return; } error ("\')\'", c); return; } error ("\'0-9\' or \'(\'", c); return; } void parse_T() { parse_F(); char c = str[i]; while (c=='*' || c =='/'){ i++; parse_F(); c = str[i]; } return; } void parse_E() { parse_T(); char c = str[i]; while (c=='+' || c == '-'){ i++; parse_T(); c = str[i]; } return; } void parse (char *e) { str = e; i = 0; parse_E(); if (str[i]=='\0') return; error ("\'+\' or '\\0\'", str[i]); return; } /////////////////////////////////////////////// // Your job: // Add some code into the function parse_E() and // parse_T to parse "-" and "/" correctly. // When you finish your task, NO error message // should be generated. // Enjoy! :-P int main (char argc, char **argv) { // There are the following rules on an expression: // 1. Every expression is represented as a string; // 2. integers are non-negative; // 3. integers are between 0-9. char *e; e = "(2)"; parse(e); e = "(3+4*5))"; parse(e); e = "(8-2)*3"; parse(e); e = "(8-2)/3"; parse(e); return 0; }
与君共勉
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116060.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...