您的位置:首页 > 其它

一个简单的自顶向下语法分析(表达式求值)

2010-07-14 10:23 513 查看
//一个简单的自顶向下语法分析
#include <cassert>
#include <cstdio>
using namespace std;
char str[1024];
long curpos;
int num()
{
int ret;
if (str[curpos] >= '0' && str[curpos] <= '9')
{
ret = str[curpos] - '0';
++curpos;
return ret;
}
printf("ERROR!not a num.pos=%d/r/n", curpos);
assert(0);
return 0;
}
void match(int c)
{
if (str[curpos] == c)
{
++curpos;
return;
}
printf("ERROR!not =%c/r/n", c);
assert(0);
}
int A();
int C()
{
int ret;
if (str[curpos] == '(')
{
match('(');
ret = A();
match(')');
}
else
{
ret = num();
}
return ret;
}
int B();
void B2(int& token, int& num)
{
if (str[curpos] == '*')
{
match('*');
token = '*';
num = B();
}
else
{
token = 0;
}
}
int B()
{
int ret = C();
int token, num;
B2(token, num);
if (token == '*')
{
return ret * num;
}
else if (token == '/')
{
return ret / num;
}
else
{
return ret;
}
}
void A2(int& token, int& num)
{
if (str[curpos] == '+')
{
match('+');
token = '+';
num = A();
}
else if (str[curpos] == '-')
{
match('-');
token = '-';
num = A();
}
}
int A()
{
int token, num;
int ret = B();
A2(token, num);
if (token == '+')
{
return ret + num;
}
else if (token == '-')
{
return ret - num;
}
else
{
return ret;
}
}
int main()
{
printf("请输入表达式:/r/n");
for (; ;)
{
scanf("%s", &str);
curpos = 0;
printf("结果为:%d/r/n", A());
match(0);
printf("Corrent!/r/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: