littlec递归下降的语法分析及词法分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Little c 递归下降的语法分析实验报
告
一.语法分析对应little c文法
<小c程序>::= <主函数>#|<外部定义><主函数>#
注:其中‘#’为语法分析时分析结束的标志,无实际意义
<主函数>::=main()<函数体>
<外部定义>::=<变量声明><外部函数定义>
<变量声明>::=null|<类型区分符><标识符>{;<类型区分符><标识符>}
注:大括号内为一个循环体,表示可出现多次,下同。
<外部函数定义>::=<类型区分符><函数说明符><函数体>
<类型区分符>::=int|char
<函数说明符>::=<函数名>()
<函数名>::=<标识符>
<函数体>::={<变量声明><语句表>}
<语句表>::=<语句>{;<语句>}
<语句>::=<赋值语句>|<条件语句> |<循环语句>|<函数调用语句>|;
<赋值语句>::= <左部>=<右部>
<左部>::= <变量名>
<右部>::= <算术表达式>
<算术表达式>::=<项>{+<项> | -<项>}
<项>::=<因子>{*<因子> | /<因子>
<因子>::=ID | NUM | (<算术表达式>)
<条件语句>::=if(<关系表达式>)<语句>|if(<关系表达式>)<语句>else<语句>
<关系表达式> →〈算术表达式〉〈关系运算符〉〈算术表达式〉
<变量名>::=<标识符>
<关系运算符>::= <|>|!=|==|>=|<=
<加运算符>::= +|-
<乘运算符>::= *|/
<循环语句>::=while(<关系表达式>)<语句>
二.实验简介
本实验采用递归子程序法完成了上述语言文法的语法分析,正确的程序经过分析显示“分析完毕,正确”,错误的程序经过分析,对其进行报错,虽不能准确定位错误,但是大致可以确定错误类型。因上次词法分析被误删,所以本程序结合词法分析与语法分析于一体,同时对源程序进行词法与语法分析。但由于个人能力有限,故没有生成语法树,也没有错误恢复处理。本程序只是完成了对含有外部数据定义,外部函数,main函数的c程序的语法分析,并且对if语句,while
语句,函数调用语句,空语句(;),表达式进行了相应的分析。三.函数功能及全局变量简介
Syn:经词法分析后,每个单词对应的标识
Kk:出错的标识,有错置一
mainfunc(); main函数处理程序。
funcbody();函数体处理程序。
outdef();外部定义处理函数
vardef();变量声明处理函数
outfunc();外部函数处理函数
yjc();语句串处理函数
statement();语句处理函数
assignstmt();赋值语句处理函数
funcall();函数调用处理语句
conditstmt();条件语句处理函数
loopstmt();循环语句处理函数
relexp();关系表达式处理函数
expression();算术表达式处理函数
factor();因子处理函数
term();项处理函数
parser();语法分析
scaner();读取下一个单词
四.符号表
五.结果测试:正确结果测试:1.只含main函数:main(){
int y;
int x;
x=3;
y=1;
if(x>y)
x=x-y;
else x=y-x;
while(x>y) x=x-y;
;
}#
2.含外部函数int cal(){ int a;
int b;
int c;
a=0;
b=3;
c=a+b;
}
main(){
int y;
int x;
x=3;
y=1;
if(x>y)
x=x-y;
else x=y-x; while(x>y) x=x-y;
cal();
;
}#
3.含外部数据说明以及外部函数int m;
int n;
int cal(){
int a;
int b;
int c;
a=0;
b=3;
c=a+b;
}
main(){
int y;
int x;
x=3;
y=1;
if(x>y)
x=x-y;
else x=y-x; while(x>y) x=x-y;
cal();
;
}#
错误结果测试:1.main后缺‘{’:main()
int y;
int x;
x=3;
y=1;
if(x>y)
x=x-y;
else x=y-x; while (x>y)
x=x-y;
;
}#
2.声明变量缺少“int”main(){
y;
int x;
x=3;
y=1;
if(x>y)
x=x-y;
else x=y-x;
while (x>y)
x=x-y;
;
}#