概述
之前笔者大一寒假闲来无事基于波兰表达式和平衡符号做了一个功能强大的计算器
上一篇文章点这里--“C++实现计算器”
最近编译原理的老师要求用递归下降的思想对表达式进行语法分析,笔者顺带完善了一点点计算的小功能---在这里笔者非常感谢 编译原理及实践 这本书
代码注释清晰,加之递归下降的思路也不难,笔者就去睡觉啦~
#define _CRT_SECURE_NO_WARNINGS
/*Simple integer/float arithmetic calculator
according to the EBNF:
<exp> -> <modexp> { <addop> <modexp> }
<addop> -> + | -
<modexp> -> <mulexp> { <modop> <mulexp> }
<modop> -> %
<mulexp> -> <brkexp> { <mulop> <brkexp> }
<mulop> -> * | /
<brkexp> -> ( <exp> ) | Number
Inputs a line of text from stdin
Outputs "Error" or the result.
*/
#include <stdlib.h>
#include <stdio.h>
FILE* in;
char token; /* global token variable */
int right = 1; /* 0 for false, 1 for right */
/* function prototypes for recursive calls */
float exp(void);
float modexp(void);
float mulexp(void);
float brkexp(void);
void error(void) {
fprintf(stderr, "Errorn");
}
void match(char expectedToken) {
if (token == expectedToken)
while ((token = getc(in)) == ' ') {}
else {
right = 0;
}
}
main()
{
in = fopen("test.txt", "r");
float result;
while ((token = getc(in)) != EOF) { /* end with '#' */
result = exp();
if (token == 'n' && right) /* right is to prevent errors in the middle */
printf("Result = %fn", result);
else {
error();
right = 1;
if (token == 'n')
continue;
else {
while ((token = getc(in)) != 'n') {} /* traverse to the end */
}
}
}
return 0;
}
float exp(void) {
float tmp = modexp();
while (token == '+' || token == '-') {
switch (token) {
case '+':
match('+');
tmp += modexp();
break;
case '-':
match('-');
tmp -= modexp();
break;
}
}
return tmp;
}
float modexp(void) {
float tmp = mulexp();
while (token == '%') {
match('%');
float TMP = mulexp();
tmp = tmp - (int)(tmp / TMP) * TMP;
}
return tmp;
}
float mulexp(void) {
float tmp = brkexp();
while (token == '*' || token == '/') {
switch (token) {
case '*':
match('*');
tmp *= brkexp();
break;
case '/':
match('/');
tmp /= brkexp();
break;
}
}
return tmp;
}
float brkexp(void) {
float tmp = 0;
if (token == '(') {
match('(');
tmp = exp();
match(')');
}
else if (isdigit(token)) {
ungetc(token, in);
fscanf(in, "%f", &tmp);
while ((token = getc(in)) == ' ') {}
}
else {
right = 0;
}
return tmp;
}
最后
以上就是欣喜水杯为你收集整理的C语言实现计算器(基于EBNF表达式和递归下降思想)的全部内容,希望文章能够帮你解决C语言实现计算器(基于EBNF表达式和递归下降思想)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复