一个C语言递归的问题!~(高手请进!~)

表达式语法从键盘输入一个表达式,判断它是否符合下面的语法规则:(1)表达式只能由单字母、运算符和括号构成,不能含有数字(2)运算符仅包括:+、–、*、/、%。(3)括号只... 表达式语法
从键盘输入一个表达式,判断它是否符合下面的语法规则:
(1) 表达式只能由单字母、运算符和括号构成,不能含有数字
(2) 运算符仅包括:+、–、*、/、%。
(3) 括号只能是圆括号,不允许有方括号和花括号
(4) 变量与运算符之间、变量与括号之间允许空格,且空格数不限
(5) 以下是表达式的递归式定义,除此之外都不是正确的表达式:
① 仅有一个字母是表达式
② “表达式 运算符 表达式”和“(表达式)”是表达式
如果判断结果是输入的的表达式不符合上述规则,则需要指出错误的位置,如有多个错误只需要指出第一个错误所在位置即可。例如:
输入:A
显示:right
输入:(A)
显示:right
输入:A + A * ( b + c )
显示:right
输入:A * + B
显示: error
输入:A * ( Ab + A / bc )
显示:error
输入: ( + A )
显示: error
输入: ( x+A ( / b
显示: error
输入:A+b*(a%b
显示: error
输入: ) B + A (
显示:error
怎么编程序啊 ?
什么四元式啊??没学过~能不能只用C做啊??
展开
 我来答
neu_sk
2007-08-05 · 超过31用户采纳过TA的回答
知道答主
回答量:112
采纳率:0%
帮助的人:0
展开全部
不就是编译里的四元式的生成吗,学一学编译就觉得简单了不少
① T:=newtemp;
② QT[j]=(SYN[k],SEM[s-1],SEM[s],T);j++;
③ pop(SYN,_);pop(SEM,_);pop(SEM,_); push(SEM,T);
E  TE`
E` +TE` | -TE` | e
T  FT`
T` *FT` | /FT` | e
F  i| (E)

原码如下:
#include "iostream"
using namespace std;
char line[30]={""}; //存放输入表达式
char load[20]={""}; //存放生成四元式
int i=0,j=0;
char w,A='A',temp,temp1; //定义中间变量
char getnextchar(void); //返回下一个字符
void loadchar(char tmp);
char outchar(void);
void getE(void); //E  TE1
void getE1(void); //E1 +TE1 | -TE1 | e
void getT(void); //T  FT1
void getT1(void); //T1 *FT1 | /FT1 | e
void getF(void); //F  i| (E)

int main() //主程序
{
cout<<"Please input the line:"<<endl;
cin>>line; //接收表达式
w=getnextchar();
getE();
return 0;
}

char getnextchar(void)
{
//cout<<"get"<<endl;
return line[i++];
}
void loadchar(char tmp)
{
load[j++]=tmp;
return;
}
char outchar(void)
{
return load[--j];
}

void getE(void) //E  TE1
{
getT();
getE1();
return;
}
void getE1(void) //E1 +TE1 | -TE1 | e
{
if(w=='+'||w=='-')
{
loadchar(w);
w=getnextchar();
getT();
temp=outchar();
temp1=outchar();
cout<<"( "<<temp1<<" "<<outchar()<<" "<<temp<<" "<<A<<" )"<<endl;
loadchar(A);
A++;
getE1();
}
else return;
return;
}
void getT(void) //T  FT1
{
getF();
getT1();
return;
}
void getT1(void) //T1 *FT1 | /FT1 | e
{
if(w=='*'||w=='/')
{
loadchar(w);
w=getnextchar();
getF();
temp=outchar();
temp1=outchar();
cout<<"( "<<temp1<<" "<<outchar()<<" "<<temp<<" "<<A<<" )"<<endl;
loadchar(A);
A++;
getT1();
}
else return;
return;
}
void getF(void) //F  i| (E)
{
if(w>='a'&&w<='z'||w>='A'&&w<='Z')
{
loadchar(w);
w=getnextchar();
return;
}
else if(w=='(')
{
//loadchar(w);
w=getnextchar();
getE();
if(w==')')
{
w=getnextchar();
return;
}
else cout<<"Err\')\'"<<endl;
}
else cout<<"Err\'(\'"<<endl;
}
淼焱洞见
2007-08-05 · 超过22用户采纳过TA的回答
知道答主
回答量:124
采纳率:0%
帮助的人:59.4万
展开全部
Is there any contradictory on (4) and (5)??file:///usr/share/ubuntu-artwork/home/index.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
榆浅2459
2007-08-04 · TA获得超过388个赞
知道答主
回答量:338
采纳率:0%
帮助的人:259万
展开全部
有点像考智商的题目,找规律吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
netbowayzhao
2007-08-04
知道答主
回答量:58
采纳率:0%
帮助的人:0
展开全部
你差不多编出来了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式