编译原理词法分析程序设计实验报告.docx
- 文档编号:1332313
- 上传时间:2022-10-20
- 格式:DOCX
- 页数:12
- 大小:22.19KB
编译原理词法分析程序设计实验报告.docx
《编译原理词法分析程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析程序设计实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
编译原理词法分析程序设计实验报告
编译原理词法分析程序设计实验报
【实验目的】
1.了解词法分析的主要任务。
2.熟悉编译程序的编制。
【实验内容】根据某文法,构造一基本词法分析程序。
找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词的种类和值。
【实验要求】
1.构造一个小语言的文法
类C小语言文法(以EBNF表示)
<程序>:
:
=<分程序>{<分程序>}.
<分程序>:
:
=<标识符>'(变'<量说明部分>{,<变量说明部分>}')函'数<体>
<变量说明部分>:
:
=int<标识符>{,<标识符>}
<函数体>:
:
='{'变[量<说明部分>;]<语句序列>'}'
<语句序列>:
:
=<语句序列>;<语句>|<语句>
<语句>:
:
=<赋值语句>|<条件语句>|<循环语句>|<函数调用语句>
<赋值语句>:
:
=<标识符>=<表达式>
<表达式>:
:
=[+|-]<项>{<加法运算符><项>}
<项>:
:
=<因子>{<乘法运算符><因子>}
<因子>:
=<标识符>|<无符号整数>
<加法运算符>:
:
=+|-
<乘法运算符>:
:
=*|/
<条件语句>:
:
=if<条件>'{语句序列>'}'[else语句序列〉’}']
<条件>:
:
=<表达式><关系运算符><表达式>
<关系运算符>:
:
===|!
=|>|<|>=|<=
<循环语句>:
:
=for'表达式>;<条件>;<表达式>')”{语句序列>'}'
<函数调用语句>:
:
=<标识符>'(标'识<符>{,<标识符>}|<空>')'
<标识符>:
:
=<字母>{<字母>|<数字>}
<无符号整数>:
:
=<数字>{<数字>}
<字母>:
:
=a|b|c|…|X|Y|Z
<数字>:
:
=0|1|2|…|8|9
单词分类情况
关键字:
intifelsefor
标识符:
以字母开头的字母和数字的组合
关系运算符:
==|!
=|>|<|>=|<=
加法运算符:
+|-
乘法运算符:
*|/界符:
,;{}()
2.设计单词的输出形式,单词的种类和值的表示方法种别码单词值如:
1int
3.编写词法分析程序cffx.c
实现基本的词法分析器,能够分析关键字、标识符、数字、运算符(需要有“==”或之类需要超前搜索的运算符)以及其他一些符号。
//编译原理词法分析程序.cpp
#include<stdio.h>
#include<stdlib.h>#include<string.h>typedefstructwords
{
intid;
charname[20];
charvalue[20];
}word;
charinteger[20]={'i','n','t'};
chariff[20]={'i','f'};
charelsee[20]={'e','l','s','e'};
charforr[20]={'f','o','r'};
intmain()
{
charcode[10000];charwords[20],ch;
inti,j,p,count,n,m;
intk=0;
wordsymbol[500];
printf("种别码:
1
printf("种别码:
2
printf("种别码:
3
printf("种别码:
4
printf("种别码:
5
printf("种别码:
6
printf("种别码:
7
printf("种别码:
8
类别:
关键字int\n");
类别:
关键字if\n");类别:
关键字else\n")类别:
关键字for\n");
类别:
标识符\n");类别:
计算运算符\n")类别:
关系运算符\n")类别:
界符\n");
while
(1)
{
gets(code);n=strlen(code);
for(m=0,j=0;m { if((code[m]>='a'&&code[m]<='z')||(code[m]>='0'&&code[m]<='9')){ words[j]=code[m]; j++; } else {if(words[0]=='i'&&words[1]=='n'&&words[2]=='t'&&words[3]=='\0'){ symbol[k].id=1; for(i=0;i<20;i++) { symbol[k].value[i]=words[i]; }k++; } elseif(words[0]=='i'&&words[1]=='f'&&words[2]=='\0') { symbol[k].id=2; for(i=0;i<20;i++) {} k++; } else if(words[0]=='e'&&words[1]=='l'&&words[2]=='s'&&words[3]=='e'&&words[4]=='\0'){ symbol[k].id=3; for(i=0;i<20;i++) { symbol[k].value[i]=elsee[i]; } k++; } elseif(words[0]=='f'&&words[1]=='o'&&words[2]=='r'&&words[3]=='\0'){symbol[k].id=4;for(i=0;i<20;i++) { symbol[k].value[i]=forr[i]; } k++; } else { symbol[k].id=5; for(i=0;i<20;i++) {symbol[k].value[i]=words[i]; } k++; } for(p=0;p<20;p++) { words[p]=0; } j=0; if(code[m]=='+') { symbol[k].id=6; symbol[k].value[0]='+'; for(i=1;i<20;i++) {symbol[k].value[i]=0; } k++; if(code[m]=='-') { symbol[k].id=6; symbol[k].value[0]='-'; for(i=1;i<20;i++) { symbol[k].value[i]=0; } k++; } if(code[m]=='*') { symbol[k].id=6; symbol[k].value[0]='*'; for(i=1;i<20;i++) { symbol[k].value[i]=0; } k++; } if(code[m]=='/') { symbol[k].id=6; symbol[k].value[0]='/'; for(i=1;i<20;i++) { symbol[k].value[i]=0; } k++; } if(code[m]=='='&&code[m+1]! ='=') { symbol[k].id=6;symbol[k].value[0]='=';for(i=1;i<20;i++){ symbol[k].value[i]=0; } k++; } if(code[m]=='='&&code[m+1]=='=') symbol[k].id=7; symbol[k].value[0]='='; symbol[k].value[1]='='; for(i=2;i<20;i++) { symbol[k].value[i]=0; } k++; m++; }if(code[m]=='! '&&code[m+1]=='=') { symbol[k].id=7;symbol[k].value[0]='! ';symbol[k].value[1]='=';for(i=2;i<20;i++) { symbol[k].value[i]=0; } k++; m++; }if(code[m]=='>'&&code[m+1]=='='){ symbol[k].id=7; symbol[k].value[0]='>'; symbol[k].value[1]='='; for(i=2;i<20;i++) { symbol[k].value[i]=0; } k++; m++; }if(code[m]=='<'&&code[m+1]=='='){ symbol[k].id=7; symbol[k].value[0]='<'; symbol[k].value[1]='='; for(i=2;i<20;i++) { symbol[k].value[i]=0; } k++; m++; if(code[m]=='>') { symbol[k].id=7; symbol[k].value[0]='>'; for(i=1;i<20;i++) { symbol[k].value[i]=0; } k++; } if(code[m]=='<') { symbol[k].id=7; symbol[k].value[0]='<'; for(i=1;i<20;i++) { symbol[k].value[i]=0; } k++; } if(code[m]==',') { symbol[k].id=8; symbol[k].value[0]=','; for(i=1;i<20;i++) { symbol[k].value[i]=0; } k++; } if(code[m]==';') { symbol[k].id=8; symbol[k].value[0]=';'; for(i=1;i<20;i++) { symbol[k].value[i]=0; } k++; } if(code[m]=='(') symbol[k].id=8; symbol[k].value[0]='('; for(i=1;i<20;i++) { symbol[k].value[i]=0; } k++; } if(code[m]==')') { symbol[k].id=8; symbol[k].value[0]=')';for(i=1;i<20;i++){ symbol[k].value[i]=0; } k++; } if(code[m]=='{') { symbol[k].id=8; symbol[k].value[0]='{';for(i=1;i<20;i++){ symbol[k].value[i]=0; } k++; } if(code[m]=='}') { symbol[k].id=8; symbol[k].value[0]='}';for(i=1;i<20;i++){ symbol[k].value[i]=0; } k++; } } count=k; } system("cls"); for(i=0;i printf("%d",symbol[i].id); printf("%s\n",symbol[i].value); } return0; } 4.生成并输出单词符号表 <1 识别单词的状态转换图: 5•流程图 字母 其他符号 1字母或数 1字 0数字2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 程序设计 实验 报告