littlec递归下降的语法分析及词法分析Word格式文档下载.docx
- 文档编号:17240699
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:25
- 大小:225.37KB
littlec递归下降的语法分析及词法分析Word格式文档下载.docx
《littlec递归下降的语法分析及词法分析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《littlec递归下降的语法分析及词法分析Word格式文档下载.docx(25页珍藏版)》请在冰豆网上搜索。
因子>
{*<
|/<
=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();
读取下一个单词
四.符号表
单词符号
种别码
种别码
main
1
17
If
2
==
18
else
3
20
wile
4
!
21
int
5
22
char
6
>
23
标识符
10
24
数字
11
25
+
13
;
26
—
14
(
27
*
15
28
/
16
{
29
30
五.结果测试:
正确结果测试:
1.只含main函数:
main(){
inty;
intx;
x=3;
y=1;
if(x>
y)
x=x-y;
elsex=y-x;
while(x>
;
}#
2.含外部函数
intcal(){
inta;
intb;
intc;
a=0;
b=3;
c=a+b;
cal();
3.含外部数据说明以及外部函数
intm;
intn;
错误结果测试:
1.main后缺‘{’:
main()
while(x>
2.声明变量缺少“int”
y;
3.赋值符号‘=’误写成‘==’
x==3;
4.关键字写错
源代码:
#include"
stdio.h"
string.h"
stdlib.h"
windows.h"
charprog[2000],token[8],ch;
char*rwtab[6]={"
main"
"
if"
else"
while"
int"
char"
};
intsyn,p,m,n,sum;
intkk;
relexp();
{FILE*fp1;
charfilename[10];
p=kk=0;
printf("
请输入文件名(含路径):
"
);
gets(filename);
if((fp1=fopen(filename,"
r"
))==NULL)
无法打开此文件"
exit(0);
elsewhile(!
feof(fp1)){
prog[p++]=fgetc(fp1);
puts(prog);
fclose(fp1);
p=0;
scaner();
parser();
getchar();
/*========================语法分析=======================*/
parser()
if(syn==1){
mainfunc();
}
else{
if(syn==5||syn==6)
无效的littleC程序\n"
kk=1;
}
if((syn==0)&
&
(kk==0))
成功!
\n"
return;
/*===============主函数处理函数====================*/
mainfunc(){
if(syn==1)
没有main函数\n"
if(syn==27)
else
{printf("
main后需要一个‘(’\n"
kk=1;
if(syn==28)
else{
printf("
main函数中‘(’后需要一个‘)’\n"
funcbody();
/*===============函数体处理函数==================*/
funcbody(){
if(syn==29)
函数需要一个‘{’\n"
vardef();
yjc();
if(syn==30){
if(syn==0)
分析完\n"
return;
else
{
函数后未匹配的‘{’\n"
/*===============外部定义处理函数==================*/
outdef(){
outfunc();
/*================变量声明处理函数==================*/
vardef(){
if(syn==5||syn==6){
if(syn==10)
while(syn==26)
{scaner();
if(syn==5||syn==6)
{
scaner();
}
elsebreak;
else{
datatype后需要一个标识符\n"
elseif(syn==2||syn==4||syn==10||syn==26)
else{
未声明的变量\n"
/*===================外部函数处理函数=======================*/
outfunc(){
if(syn==27)
else
{printf("
外部函数名后需要一个‘(’\n"
if(syn==28)
外部函数中未匹配的‘(’\n"
/*======语句串处理程序========*/
yjc()
{
/*调用函数statement();
*/
/*读下一个单词符号*/
if(syn!
=30)
statement();
*/
}
/*==========语句处理程序===================*/
statement()
if(syn==10)
if(syn==25)
assignstmt();
elseif(syn==27)
funcall();
期待一个‘=’或‘(’\n"
elseif(syn==2){
conditstmt();
elseif(syn==4)
elseif(syn=26)
{return;
{printf("
非法的语句!
/*===================赋值语句处理函数=====================*/
assignstmt(){
expression();
/*============函数调用语句处理函数==============*/
funcall(){
函数调用语句需要一个‘(’\n"
/*============条件语句处理函数============*/
conditstmt(){
if语句中未匹配的‘(’\n"
if(syn==26)
if(syn==3)
if((syn==10)||(syn==2)||(syn==4)||(syn==26))
if后非法的的语句\n"
if语句中需要一个‘;
’\n"
if语句中需要一个‘(’\n"
/*==============循环语句处理函数===============*/
loopstmt(){
if(syn==27){
while语句中需要一个‘)’\n"
while语句中需要一个‘(’\n"
/*=====================关系表达式处理函数========================*/
relexp(){
if((syn==18)||(syn==20)||(syn==22)||(syn==21)||(syn==23)||(syn==24))
关系表达式中需要一个关系运算符\n"
/*============算术表达式处理程序=============*/
expression()
{term();
while((syn==13)||(syn==14))
term();
/*调用函数term();
/*==============项处理程序================*/
term()
{factor();
while((syn==15)||(syn==16))
factor();
/*调用函数factor();
*/
/*===============因子处理程序=================*/
factor()
{if((syn==10)||(syn==11))scaner();
if(syn==28)
else{printf("
theerroron'
('
theexpressionerror!
/*==================读下一个字符进行词法分析=================*/
scaner()
{sum=0;
for(m=0;
m<
8;
m++)
token[m]=NULL;
m=0;
ch=prog[p++];
while((ch=='
'
)||(ch=='
\n'
))ch=prog[p++];
if(((ch<
='
z'
)&
(ch>
a'
))||((ch<
Z'
A'
)))
{while(((ch<
))||((ch>
0'
(ch<
9'
{token[m++]=ch;
p--;
syn=10;
token[m++]='
\0'
for(n=0;
n<
6;
n++)
if(strcmp(token,rwtab[n])==0)
{syn=n+1;
break;
elseif((ch>
))
{while((ch>
{sum=sum*10+ch-'
syn=11;
elseswitch(ch)
{
case'
'
m=0;
if(ch=='
{syn=22;
{syn=20;
{syn=24;
{syn=23;
case'
){syn=18;
else{syn=25;
){syn=21;
+'
syn=13;
-'
syn=14;
*'
syn=15;
break;
syn=17;
syn=27;
)'
syn=28;
syn=26;
#'
syn=0;
{'
syn=29;
}'
syn=30;
/'
syn=16;
default:
syn=-1;
测试代码:
正确
错误
elsx=y-x;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- littlec 递归 下降 语法分析 词法 分析