大家好,又见面了,我是全栈君。
今天在读《编译原理及实践》时。看到了一个简单的整数计算器的实现。
依照书上的思路,我略微进行了扩展:
1、从整数计算器扩展到小数计算器。
2、支持除法
3、支持空字符。
执行效果例如以下:
代码非常easy,例如以下:
cal.c:
#include <stdio.h> #include <stdlib.h> char token; double exp(void); double term(void); double factor(void); char getPrintableChar(void); void match(char expectedToken); void error(void); int main(void) { double result; for (;;) { token = getPrintableChar(); if (token == 'q') break; result = exp(); if (token == '\n') printf("Result is: %g\n", result); else error(); } return 0; } double exp(void) { double temp = term(); while (token == '+' || token == '-') switch(token) { case '+': match('+'); temp += term(); break; case '-': match('-'); temp -= term(); break; } return temp; } double term(void) { double temp = factor(); while (token == '*' || token == '/') switch(token) { case '*': match('*'); temp *= factor(); break; case '/': match('/'); temp /= factor(); break; } return temp; } double factor(void) { double temp; if (token == '(') { match('('); temp = exp(); match(')'); } else if (isdigit(token)) { ungetc(token, stdin); scanf("%lf", &temp); token = getPrintableChar(); } else error(); return temp; } void error(void) { fprintf(stderr, "Error!\n"); exit(EXIT_FAILURE); } void match(char expectedToken) { if (expectedToken == token) token = getPrintableChar(); else error(); } char getPrintableChar(void) { char temp; do temp = getchar(); while (isblank(temp)); return temp; }
程序实现的思路是依照EBNF规则实现,即:
<exp> -> <term> { <addop> <term> } <addop> -> + | - <term> -> <factor> { <mulop> <factor> } <mulop> -> * | / <factor> -> ( <exp> ) | Number
关于EBNF, 能够參考书上的内容。在这里就不赘述了。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116303.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...