算术表达式语法检查 实验报告Word文件下载.docx
- 文档编号:8204456
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:21
- 大小:22.57KB
算术表达式语法检查 实验报告Word文件下载.docx
《算术表达式语法检查 实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《算术表达式语法检查 实验报告Word文件下载.docx(21页珍藏版)》请在冰点文库上搜索。
5、写出规范的课程设计报告,具体要求见相关说明文档。
二、课程设计的主要内容
【问题描述】
算术表达式语法检查。
【功能要求】
(1)键盘读入一个四则运算算术表达式,对其进行语法检查;
(2)算术表达式允许嵌套,如果出错,指出出错位置;
(3)不需要计算结果;
(4)尽量不使用栈。
程序:
(其余的你们自己写)
voidmain()//主函数
{
intlen;
intf=1;
cout<
<
endl<
"
请输入一个算术表达式(请在一行内完成输入且每个项的长度不大于10):
endl;
gets(str);
len=strlen(str);
str[len]='
^'
;
system("
pause"
);
***********************词法分析开始*****************"
f=cifa_main();
if(f==0)return;
***********************语法分析开始*****************"
f=yufa_main();
if(f==0)return;
}
intF1()//F->
(E)|标识符|无符号整数
{
if((strcmp(cifa_p->
word,"
("
)==0))
{
advance();
strcpy(F_name,cifa_p->
word);
strcpy(E_name,F_name);
E1();
)"
strcpy(F_name,E_name);
return
(1);
}
else
ERROR"
return(0);
elseif(cifa_p->
type==1||cifa_p->
type==2)
elsereturn0;
intT1()//T->
F*T|F/T|F
yuyi*p=newyuyi;
F1();
strcpy(p->
op1,F_name);
if(strcmp(cifa_p->
*"
)==0)
T1();
p->
next=NULL;
op='
*'
op2,T_name);
T_name[0]='
t'
T_name[1]=++count;
T_name[2]='
\0'
result,T_name);
yuyi_add(p);
return
(1);
elseif(strcmp(cifa_p->
/"
/'
else
strcpy(T_name,F_name);
intE1()//E->
T+E|T-E|T
op1,T_name);
+"
+'
op2,E_name);
E_name[0]='
E_name[1]=++count;
E_name[2]='
result,E_name);
-"
-'
strcpy(E_name,T_name);
intyufa_main()//语法分析主程序
intn;
cifa*p=newcifa;
strcpy(p->
word,"
#"
//对词法分析产生的结果链表进行处理
p->
type=-1;
next=NULL;
cifa_add(p);
cifa_p=cifa_head;
yufa_zfc_disp(cifa_head->
next);
的递归分析过程如下:
-------------------------------------------------"
'
\t'
步骤\t"
产生式"
n=E();
if(n==0)
f<
输入串不是该文法的一个句子!
------------------语法分析结束------------------"
elseif(n==1)
输入串是该文法的一个句子!
------------------语法分析结束--------------"
//**********************语义分析***************************************
yuyi*yuyi_add(yuyi*p)//在四元式链表末添加一个结点
yuyi_end->
next=p;
yuyi_end=p;
returnyuyi_head;
voidyuyi_sys_disp()//输出四元式链表
yuyi*p;
p=yuyi_head->
next;
while(p!
=NULL)
{cout<
('
p->
op<
'
op1<
op2<
result<
)'
p=p->
intF()//F->
(E)|标识符|无符号整数子函数
intm;
f++<
F->
(E)"
m=E();
if(m==0)return(0);
type==2)//数字或是标识符
标识符|无符号整数"
intS()//S->
*FS|/FS|ε子函数
intt,g;
S->
*FS"
t=F();
if(t==0)return0;
g=S();
if(g==0)return0;
/FS"
)==0||(strcmp(cifa_p->
)==0)||(strcmp(cifa_p->
)==0))
ε"
intT()//T->
FS子函数
T->
FS"
intG()//G-〉+TG|-TG|ε子函数
G->
+TG"
t=T();
if(t==0)return(0);
g=G();
if(g==0)return(0);
-TG"
if(g==0)return(0);
)==0||strcmp(cifa_p->
intE()//E->
[+|-]TG子函数
)==0)||(strcmp(cifa_p->
)==0))advance();
E->
[+|-]TG"
t=T();
if(t==0)return(0);
g=G();
elsereturn
(1);
voidyufa_zfc_disp(cifa*p)//输出字符串
word;
//cout<
//************************语法分析部分***************************************
voidadvance()//取词法分析产生列表中的结点作语法分析
cifa_p=cifa_p->
next;
inttest(void)//识别相关符号
chartemp[3];
inti=0;
inttype;
switch(ch)
case'
:
//识别'
temp[i++]=ch;
GetChar();
if(ch=='
'
)temp[i++]='
temp[i]='
type=4;
break;
type=3;
)
temp[i++]='
//识别'
default:
ch;
无法识别,出错!
if(ch=='
)notock();
//空格跳过
cifa*p;
p=newcifa;
type=type;
word,temp);
}
intcifa_main()//词法分析主函数
intf;
cifa_head=newcifa;
cifa_head->
type=-1;
cifa_end=cifa_head;
单词种类定义如下:
标识符的种类编码1:
常数的种类编码2:
运算的种类编码3:
+,-,*,/"
界限符的种类编码4:
(,),;
notock();
--------------------------------------------------------"
词法分析结果如下:
while(nn<
100&
&
ch!
='
)
if((ch>
a'
&
ch<
z'
)||(ch>
A'
Z'
))
f=alph();
//字母串
elseif(ch>
0'
9'
)f=number();
//数字串
elsef=test();
//其他符号
if(f==0)return(0);
}
cifa_disp(cifa_head);
--------------词法分析结束---------------------"
intnumber(void)//识别数字
inttype=2;
chartemp[10];
while('
=ch&
temp[i]=ch;
i++;
temp[i]='
elseif(ch!
temp<
接错误后缀,出错"
intalph(void)//识别标识符
inttype=1;
while((ch>
)||
(ch>
))
return0;
cifa*cifa_add(cifa*p)//在分析结果列表尾添加一个新
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算术表达式语法检查 实验报告 算术 表达式 语法 检查 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)