编译原理词法分析和语法分析报告+代码[C语言版]
![编译原理词法分析和语法分析报告+代码[C语言版]_第1页](https://file3.zhuangpeitu.com/fileroot3/2022-4/15/35e1a4a2-893a-465a-bce2-9e79c9474934/35e1a4a2-893a-465a-bce2-9e79c94749341.gif)
![编译原理词法分析和语法分析报告+代码[C语言版]_第2页](/images/s.gif)
![编译原理词法分析和语法分析报告+代码[C语言版]_第3页](/images/s.gif)
《编译原理词法分析和语法分析报告+代码[C语言版]》由会员分享,可在线阅读,更多相关《编译原理词法分析和语法分析报告+代码[C语言版](42页珍藏版)》请在装配图网上搜索。
1、word 格式文档 词法分析 一、实验目的 设计 、编制并调试一个词法分析程序 ,加深对词法分析原理的理解 。 二、实验要求 2.1 待分析的简单的词法 ( 1)关键字 : begin if then while do end 所有的关键字都是小写 。 ( 2)运算符和界符 := + - * / < <= <> > >= = ;( ) # ( 3)其他单词是标识符 ( ID )和整型常数 ( SUM ), 通过以下正规式定义 : ID
2、= letter (letter | digit)* NUM = digit digit* ( 4)空格有空白 、制表符和换行符组成 。空格一般用来分隔 ID 、 SUM 、运算符 、界 符和关键字 ,词法分析阶段通常被忽略 。 2.2 各种单词符号对应的种别码 : 表 2.1 各种单词符号对应的种别码 单词符号 种别码 单词符号 种别码 bgin 1 : 17 If 2 : = 18 Then 3 < 20 wile 4 <> 21
3、 专业整理 word 格式文档 do 5 <= 22 end 6 > 23 lettet 10 >= 24 ( letter|digit ) * dight dight* 11 = 25 + 13 ; 26 — 14 ( 27 * 15 ) 28 / 16 # 0 2.3 词法分析程序的功能 : 输入 :所给文法的源程序字符串 。 输出 :二元组 (syn,token 或 sum )构成的序列 。 其中 :syn 为单词种别码 ; toke
4、n 为存放的单词自身字符串 ; sum 为整型常数 。 例如 :对源程序 begin x:=9: if x>9 then x:=2*x+1/3; end # 的源文件 ,经过词法分析后输 出如下序列 : (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if) 三、词法分析程序的算法思想 : 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号 ,其基本思 想是根据扫描到单词符号的第一个字符的种类 ,拼出相应的单词符号 。 3.1 主程序示意图 :
5、 专业整理 word 格式文档 主程序示意图如图 3-1 所示 。 其中初始包括以下两个方面 : ⑴ 关键字表的初值 。 关键字作为特殊标识符处理 ,把它们预先安排在一张表格中 (称为关键字表 ), 当扫描 程序识别出标识符时 ,查关键字表 。 如能查到匹配的单词 ,则该单词为关键字 ,否则为一 般标识符 。关键字表为一个字符串数组 ,其描述如下 : Char *rwtab[6] = { “begin ”,“if”,“then ”,“while ”,“do ”,“end ”,}
6、; 置初值 调用扫描子程序 输出单词二元组 否 输入串结束 是 专业整理 word 格式文档 结束 图 3-1 (2 )程序中需要用到的主要变量为 syn,token 和 sum 3
7、.2 扫描子程序的算法思想 : 首先设置 3 个变量 :① token 用来存放构成单词符号的字符串 ;② sum 用来整型单词 ;③ syn 用来存放单词符号的种别码 。扫描子程序主要部分流程如图 3-2 所示 。 变量初始化 忽略空格 是否文件结束? 是 是 返回 专业整理 w
8、ord 格式文档 否 字母 拼字符串 数字 其他 运算符 、 符号 界符等符号 拼数 是否关键字? 否 对不同符号给 报错 出相应的 syn 值 是 syn=10 syn 为对应关键字的 单词种别码 syn=11 返回
9、
图 3-2
四 、词法分析程序的 C 语言程序源代码 :
专业整理
word 格式文档
#include
10、 scaner(); main() {p=0; printf("\n please input a string(end with '#'):\n"); do{ scanf("%c",&ch); prog[p++]=ch; }while(ch!='#'); p=0; do{ scaner(); switch(syn) {case 11:printf("( %-10d%5d )\n",sum,syn);
11、break; case -1:printf("you have input a wrong string\n"); 专业整理 word 格式文档 getch(); exit(0); default: printf("( %-10s%5d )\n",token,syn); break; } }while(syn!=0); getch(); } scaner() { sum=0;
12、 for(m=0;m<8;m++)token[m++]=NULL; ch=prog[p++]; m=0; while((ch==' ')||(ch=='\n'))ch=prog[p++]; if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) { while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) {token[m++]=ch; ch=prog[p++];
13、 } p--; syn=10; 专业整理 word 格式文档 for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else if((ch>='0')&&(ch<='9')) { while((ch>='0')&&(ch<='9')) { sum=sum*10+ch-'0'; ch=prog[p++]; }
14、 p--; syn=11; } else switch(ch) { case '<':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=22; token[m++]=ch; } else 专业整理 word 格式文档 { syn=20; p--; } break; case '>':token[m++]=ch; ch=prog[
15、p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; p--; } break; case '+': token[m++]=ch; ch=prog[p++]; if(ch=='+') { syn=17; token[m++]=ch; } else 专业整理 word 格式文档 { syn=13;
16、 p--; } break; case '-':token[m++]=ch; ch=prog[p++]; if(ch=='-') { syn=29; token[m++]=ch; } else { syn=14; p--; } break; case '!':ch=prog[p++]; if(ch=='=') { syn=21; token[m++]
17、=ch; } 专业整理 word 格式文档 else { syn=31; p--; } break; case '=':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=25; token[m++]=ch; } else { syn=18; p--; } break; case '*': syn=15; t
18、oken[m++]=ch; break; case '/': syn=16; token[m++]=ch; 专业整理 word 格式文档 break; case '(': syn=27; token[m++]=ch; break; case ')': syn=28; token[m++]=ch; break; case '{': syn=5; token[m++]=ch; bre
19、ak; case '}': syn=6; token[m++]=ch; break; case ';': syn=26; token[m++]=ch; break; case '\"': syn=30; token[m++]=ch; break; case '#': syn=0; token[m++]=ch; break; 专业整理 word 格式文档 case ':':syn=
20、17; token[m++]=ch; break; default: syn=-1; break; } token[m++]='\0'; } 五、结果分析 : 输入 begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列 : (begin 1)(x 10)( : 17)(= 18)(9 11)( ; 26)(if 2) 如图 5-1 所示:
21、 图 5-1 六、总结: 词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号 ,其基 专业整理 word 格式文档 本思想是根据扫描到单词符号的第一个字符的种类 ,拼出相应的单词符号 。通过本试验的 完成 ,更加加深了对词法分析原理的理解 。
22、 语法分析 一、实验目的 编制一个递归下降分析程序 ,实现对词法分析程序所提供的单词序列的语法检查和结构 分析 。 二、实验要求 利用 C 语言编制递归下降分析程序 ,并对简单语言进行语法分析 。 专业整理 word 格式文档 2.1 待分析的简单语言的语法 用扩充的 BNF 表示如下 : ⑴ < 程序
23、> :: =begin< 语句串 >end ⑵< 语句串 > :: =< 语句 >{ ;< 语句 >} ⑶< 语句 > :: =< 赋值语句 > ⑷< 赋值语句 > :: =ID :=< 表达式 > ⑸ < 表达式 > :: =< 项 >{+< 项> | -< 项>} ⑹<项>::=< 因子 >{*< 因子 >|/< 因子> ⑺<因子> ::=ID|NUM| (<表达式 >) 2.2 实验要求说明 输入单词串 ,以 “# ”结束 ,如果是文法正确的句子 ,则输出成功信息 ,打印
24、“success ”,否 则输出 “error ”。 例如 : 输入 begin a:=9; x:=2*3; b:=a+x end # 输出 success ! 输入 x:=a+b*c end # 输出 error 2.3 语法分析程序的酸法思想 (1 )主程序示意图如图 2-1 所示 。 专业整理 word 格式文档 置初值
25、 调用 scaner 读下一个单词符号 调用 lrparser 结束 图 2-1 语法分析主程序示意图 (2 )递归下降分析程序示意图如图 2-2 所示 。 (3 )语句串分析过程示意图如图 2-3 所示 。 是 否 begin? 否 调用 statement 函数 是
26、专业整理 调用 scaner 调用语句串分析程序 是否 end? 是 调用 scaner syn=0&&kk=0? 是 打印分析成功 word 格式文档 是否 ;? 否 是
27、 调用 scaner 否 调用 statement 函数 出错处理 否 图 2-3 语句串分析示意图 出错处理 图 2-2 递归下降分析程序示意图 (4 ) statement 语句分析程序流程如图 2-4 、 2-5 、2-6 、 2-7 所示 。 专业整理 word 格式文档
28、 是否标识符 ? 否 调用 term 函数 调用 scaner 是否: =? 调用 scaner 是否+,-? 否 否 调用 expression 函数 出错处理 图 2-4 statement 语句分析函数示意图
29、 意图 调用 factor 函数 是否*,/? 调用 scaner 专业整理 是 调用 scaner 调用 term 函数 出错处理 图 2-5 expression 表达式分析函数示 是否标识符 ? 是 调用 factor 函数 出
30、错处理 word 格式文档 否 是 否 图 2-6 term 分析函数示意图 否 出错处理 否 是 是否整常数 ? 否 是否( ? 是
31、 调用 scaner 调用 expression 函数 是否) ? 是 调用 scaner 调用 scaner 图 2-7 factor 分析过程示意图 三、 语法分析程序的 C 语言程序源代码 : #include "stdio.h" 专业整理 word 格式文档 #include "string.h"
32、char prog[100],token[8],ch; char *rwtab[6]={"begin","if","then","while","do","end"}; int syn,p,m,n,sum; int kk; factor(); expression(); yucu(); term(); statement(); lrparser(); scaner(); main() { p=kk=0;
33、 printf("\nplease input a string (end with '#'): \n"); do { scanf("%c",&ch); prog[p++]=ch; }while(ch!='#'); p=0; scaner(); 专业整理 word 格式文档 lrparser(); getch(); } lrparser() { if(syn==1) {
34、 scaner(); /* 读下一个单词符号 */ yucu(); /* 调用 yucu() 函数 ; */ if (syn==6) { scaner(); if ((syn==0)&&(kk==0)) printf("success!\n"); } else { if(kk!=1) printf("the string haven't got a 'end'!\n"); kk=1; } } else { printf("haven't
35、 got a 'begin'!\n"); kk=1; } return; 专业整理 word 格式文档 } yucu() { statement(); /* 调用函数 statement();*/ while(syn==26) { scaner(); /* 读下一个单词符号 */ if(syn!=6) statement(); /* 调用函数 statement();*/ }
36、 return; } statement() { if(syn==10) { scaner(); /* 读下一个单词符号 */ if(syn==18) { scaner(); /* 读下一个单词符号 */ expression(); /* 调用函数 statement();*/ } else { printf("the sing ':=' is wrong!\n"); kk=1; 专业整理 wor
37、d 格式文档 } } else { printf("wrong sentence!\n"); kk=1; } return; } expression() { term(); while((syn==13)||(syn==14)) { scaner(); /* 读下一个单词符号 */ term(); /* 调用函数 term();*/ } return; } term() {
38、 factor(); while((syn==15)||(syn==16)) { scaner(); /* 读下一个单词符号 */ factor(); /* 调用函数 factor(); */ } return; 专业整理 word 格式文档 } factor() { if((syn==10)||(syn==11)) scaner(); else if(syn==27) { scaner(); /* 读下一个单词符号 */ ex
39、pression(); /* 调用函数 statement();*/ if(syn==28) scaner(); /* 读下一个单词符号 */ else { printf("the error on '('\n"); kk=1; } } else { printf("the expression error!\n"); kk=1; } return; } scaner() { sum=0; for(m=0;m<8;
40、m++)token[m++]=NULL; m=0; ch=prog[p++]; 专业整理 word 格式文档 while(ch==' ')ch=prog[p++]; if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) { while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) {token[m++]=ch; ch=prog[p++];
41、 } p--; syn=10; token[m++]='\0'; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else if((ch>='0')&&(ch<='9')) { while((ch>='0')&&(ch<='9')) { sum=sum*10+ch-'0'; ch=prog[p++]; } p--;
42、syn=11; 专业整理 word 格式文档 } else switch(ch) { case '<':m=0; ch=prog[p++]; if(ch=='>') { syn=21; } else if(ch=='=') { syn=22; } else { syn=20; p--; } break; case '>':m=0; ch=pr
43、og[p++]; if(ch=='=') { syn=24; } else { syn=23; 专业整理 word 格式文档 p--; } break; case ':':m=0; ch=prog[p++]; if(ch=='=') { syn=18; } else { syn=17; p--; } break; ca
44、se '+': syn=13; break; case '-': syn=14; break; case '*': syn=15;break; case '/': syn=16;break; case '(': syn=27;break; case ')': syn=28;break; case '=': syn=25;break; case ';': syn=26;break; case '#': syn=0;break; 专业整理 word 格式文
45、档 default: syn=-1;break; } } 四、结果分析 : 输入 begin a:=9; x:=2*3; b:=a+x end # 后输出 success ! 如图 4-1 所示: 图 4-1 输入 x:=a+b*c end # 后输出 error 如图 4-2 所示 :
46、 图 4-2 五、总结: 通过本次试验 ,了解了语法分析的运行过程 ,主程序大致流程为 :“置初值 ” 调用 专业整理 word 格式文档 scaner 函数读下一个单词符号 调用 IrParse 结束 。 递归下降分析的大致流程为 :“先判断 是否为 begin ” 不是则 “出错处理 ”,若是则 “调用 scaner 函数 ” 调用语句串分析函数 “判 断是否为 end ” 不是则 “出错处理 ”,若是则调用 scaner 函数 “判断
47、syn=0&&kk=0 是否成 立”成立则说明分析成功打印出来 。不成立则 “出错处理 ”。 专业整理 word 格式文档
48、 语义分析程序 #include "stdio.h" #include "string.h" char prog[100],token[8],ch; char *rwtab[6]={"begin","if","then","while","do","end"}; int syn,p,m,n,sum,q; int kk; struct { char result1[8]; char ag11[8]; char op1[8]; char
49、ag21[8]; } quad[20]; char *factor(); char *expression(); int yucu(); char *term(); int statement(); 专业整理 word 格式文档 int lrparser(); char *newtemp(); scaner(); emit(char *result,char *ag1,char *op,char *ag2); main() { int j; q=p=kk=0; pr
50、intf("\nplease input a string (end with '#'): "); do
{ scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
scaner();
lrparser();
if(q>19)printf(" to long sentense!\n");
else for (j=0;j 51、uad[j].op1,quad[j].ag21);
getch();
}
int lrparser()
专业整理
word 格式文档
{ int schain=0;
kk=0;
if (syn==1)
{ scaner(); schain=yucu(); if(syn==6)
{ scaner();
if((syn==0)&&(kk==0)) printf("Success!\n");
}
else { if( 52、kk!=1)printf("short of 'end' !\n");
kk=1;
getch();
exit(0);
}
}
else { printf("short of 'begin' !\n");
kk=1;
getch();
exit(0);
}
return (schain);
专业整理
word 格式文档
}
int yucu()
{ int schain=0 53、; schain=statement(); while(syn==26)
{ scaner();
schain=statement();
}
return (schain);
}
int statement()
{ char tt[8],eplace[8]; int schain=0;
if (syn==10)
{ strcpy(tt,token); scaner(); if(syn==18)
{ scaner(); strcpy(eplace,expression()); emit(tt,epla 54、ce,"",""); schain=0;
专业整理
word 格式文档
}
else { printf("short of sign ':=' !\n");
kk=1;
getch();
exit(0);
}
return (schain);
}
}
char *expression()
{ char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12); ep2=(char *)mall 55、oc(12); eplace=(char *)malloc(12); tt=(char *)malloc(12); strcpy(eplace,term()); while((syn==13)||(syn==14)) { if (syn==13)strcpy(tt,"+");
else strcpy(tt,"-"); scaner(); strcpy(ep2,term());
专业整理
word 格式文档
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy( 56、eplace,tp);
}
return (eplace);
}
char *term()
{ char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12); ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt=(char *)malloc(12); strcpy(eplace,factor()); while((syn==15)||(syn==16)) { if (syn==15)strcpy(tt,"*");
else strcpy(t 57、t,"/"); scaner(); strcpy(ep2,factor()); strcpy(tp,newtemp()); emit(tp,eplace,tt,ep2); strcpy(eplace,tp);
专业整理
word 格式文档
}
return (eplace);
}
char *factor()
{ char *fplace;
fplace=(char *)malloc(12);
strcpy(fplace,"");
if(syn==10)
58、
{ strcpy(fplace,token); scaner();
}
else if(syn==11)
{ itoa(sum,fplace,10);
scaner();
}
else if(syn==27)
{ scaner(); fplace=expression(); if(syn==28) scaner();
else { printf("error on ')' !\n"); kk=1;
专业整理
word 格式文档
getch();
59、
exit(0);
}
}
else { printf("error on '(' !\n");
kk=1;
getch();
exit(0);
}
return (fplace);
}
char *newtemp()
{ char *p; char m[8]; p=(char *)malloc(8); kk++; itoa(kk,m,10); strcpy(p+1,m); p[0]='t'; return(p);
60、
}
专业整理
word 格式文档
scaner()
{ sum=0; for(m=0;m<8;m++)token[m++]=NULL; m=0;
ch=prog[p++];
while(ch==' ')ch=prog[p++]; if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9' 61、))) {token[m++]=ch;
ch=prog[p++];
}
p--; syn=10;
token[m++]='\0';
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{ syn=n+1; break;
}
}
else if((ch>='0')&&(ch<='9'))
专业整理
word 格式文档
{ while((ch>='0')&&(ch<='9')) { sum=s 62、um*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{ case '<':m=0; ch=prog[p++]; if(ch=='>')
{ syn=21;
}
else if(ch=='=')
{ syn=22;
}
else
{ syn=20;
p--;
}
break;
专业整理
wor 63、d 格式文档
case '>':m=0;
ch=prog[p++];
if(ch=='=')
{ syn=24;
}
else
{ syn=23; p--;
}
break;
case ':':m=0;
ch=prog[p++];
if(ch=='=')
{ syn=18;
}
else
{ syn=17; p--;
}
break;
case '+': syn=13; 64、break;
专业整理
word 格式文档
case '-': syn=14; break;
case '*': syn=15;break;
case '/': syn=16;break;
case '(': syn=27;break;
case ')': syn=28;break;
case '=': syn=25;break;
case ';': syn=26;break;
case '#': syn=0;break;
def 65、ault: syn=-1;break;
}
}
emit(char *result,char *ag1,char *op,char *ag2)
{
strcpy(quad[q].result1,result);
strcpy(quad[q].ag11,ag1);
strcpy(quad[q].op1,op);
strcpy(quad[q].ag21,ag2);
q++;
}
专业整理
word 格式文档
专业整理
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化妆品美妆产品介绍自然之选清新护肤
- 心理健康情绪管理主题班会我的情绪小怪兽
- 慢性病宣传慢性肾脏病防治如何预防和管理慢性肾脏病
- 深入学习2025最高人民法院工作报告
- 孩子如何合理使用DeepSeek(AI仅辅助不可让渡创造力)
- 肝病健康知识宣讲甲型肝炎及戊型肝炎传播和预防
- 慢性肾脏病知识宣传慢性肾脏病的危害
- 315消费者权益日共筑满意消费
- 世界睡眠日健康睡眠知识科普睡眠是维持生命健康的重要源泉
- 深入学习2025政府工作报告要点双语版
- 初中语文作文素材:100个描写外貌佳句
- 初中语文古诗词鉴常考题型及答题技巧
- 初中语文作文素材:9个落笔即封神的议论文作文论据
- 初中资料:学好语文的方法及技巧
- 初中语文作文素材:经典格言总结