c语言编写的简单的计算器实例源码



c语言编写的简单的计算器实例源码,c计算机示例:

/*
filename : cal.c
context free grammar(EBNF) :

<expr> -> <term> { <addop> <term> }

<addop> -> + | -
<term> -> <factor> { <mulop> <factor> }
<mulop> -> *
<factor> -> ( <expr> ) | NUMBER
method : recursive-descent parsing
source : 《Compiler Construction : Principles and Practice》by Kenneth C. Louden
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char token;
int expr();
int term();
int factor();
void error()
{
fprintf(stderr, “Error\n”);
exit(1);
}
void match(char expectedToken)
{
if(token == expectedToken)
{
token = getchar();
}
else
{
error();
}
}
int main(int argc, char *argv[])
{
int result;
token = getchar();
result = expr();
if(token ==’\n’)
{
printf(“Result = %d\n”, result);
}
else
{
error();
}
return 0;
}
int expr()
{
int temp = term();
while((token==’+')||(token==’-'))
{
switch(token)
{
case ‘+’:
match(‘+’);
temp += term();
break;
case ‘-’:
match(‘-’);
temp -= term();
break;
}
}
return temp;
}
int term()
{
int temp = factor();
while(token == ‘*’)
{
match(‘*’);
temp *= factor();
}
return temp;
}
int factor()
{
int temp;
if(token == ‘(‘)
{
match(‘(‘);
temp = expr();
match(‘)’);
}
else if(isdigit(token))
{
ungetc(token, stdin);
scanf(“%d”, &temp);
token = getchar();
}
else
{
error();
}
return temp;
}