编译原理词法分析程序设计方案实验报告.docx
《编译原理词法分析程序设计方案实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析程序设计方案实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
![编译原理词法分析程序设计方案实验报告.docx](https://file1.bdocx.com/fileroot1/2023-7/23/3643b159-c2aa-4184-a80b-b33d36d0b3de/3643b159-c2aa-4184-a80b-b33d36d0b3de1.gif)
编译原理词法分析程序设计方案实验报告
编译原理词法分析程序设计实验报告
【实验目的】
1.了解词法分析的主要任务。
2.熟悉编译程序的编制。
【实验内容】
根据某文法,构造一基本词法分析程序。
找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词的种类和值。
【实验要求】
3.构造一个小语言的文法
类C小语言文法(以EBNF表示)
<程序>:
:
=<分程序>{<分程序>}.
<分程序>:
:
=<标识符>’(’<变量说明部分>{,<变量说明部分>}’)’<函数体>
<变量说明部分>:
:
=int<标识符>{,<标识符>}
<函数体>:
:
=’{’[<变量说明部分>。
]<语句序列>’}’
<语句序列>:
:
=<语句序列>。
<语句>|<语句>
<语句>:
:
=<赋值语句>|<条件语句>|<循环语句>|<函数调用语句>
<赋值语句>:
:
=<标识符>=<表达式>
<表达式>:
:
=[+|-]<项>{<加法运算符><项>}
<项>:
:
=<因子>{<乘法运算符><因子>}
<因子>:
=<标识符>|<无符号整数>
<加法运算符>:
:
=+|-
<乘法运算符>:
:
=*|/
<条件语句>:
:
=if<条件>’{’<语句序列>’}’[else’{’<语句序列>’}’]
<条件>:
:
=<表达式><关系运算符><表达式>
<关系运算符>:
:
===|!
=|>|<|>=|<=
<循环语句>:
:
=for’(’<表达式>。
<条件>。
<表达式>’)’’{’<语句序列>’}’
<函数调用语句>:
:
=<标识符>’(’<标识符>{,<标识符>}|<空>’)’
<标识符>:
:
=<字母>{<字母>|<数字>}
<无符号整数>:
:
=<数字>{<数字>}
<字母>:
:
=a|b|c|…|X|Y|Z
<数字>:
:
=0|1|2|…|8|9
单词分类情况
关键字:
intifelsefor
标识符:
以字母开头的字母和数字的组合
关系运算符:
==|!
=|>|<|>=|<=
加法运算符:
+|-
乘法运算符:
*|/界符:
,;{}()
4.设计单词的输出形式,单词的种类和值的表示方法
种别码单词值
如:
1int
3.编写词法分析程序cffx.c
实现基本的词法分析器,能够分析关键字、标识符、数字、运算符(需要有“==”或“:
=”之类需要超前搜索的运算符)以及其他一些符号。
//编译原理词法分析程序.cpp
#include
#include
#include
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类别:
关键字int\n")。
printf("种别码:
2类别:
关键字if\n")。
printf("种别码:
3类别:
关键字else\n")。
printf("种别码:
4类别:
关键字for\n")。
printf("种别码:
5类别:
标识符\n")。
printf("种别码:
6类别:
计算运算符\n")。
printf("种别码:
7类别:
关系运算符\n")。
printf("种别码:
8类别:
界符\n")。
while
(1)
{
gets(code)。
n=strlen(code)。
for(m=0,j=0。
mm++)
{
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++)
{
symbol[k].value[i]=iff[i]。
}
k++。
}
elseif(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。
ii++)
{
printf("%d",symbol[i].id)。
printf("%s\n",symbol[i].value)。
}
}
return0。
}
4.生成并输出单词符号表
识别单词的状态转换图:
5.流程图
6.源程序清单
inta,b,c。
a=b+c。
7.测试结果
8.实验心得:
此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用c语言直接编写词法分析器;同时更熟练的掌握用c语言编写程序,实现一定的实际功能。
通过本次实验,使我更深层次的掌握了词法分析。
从刚开始的无从下手到后来渐渐的突破了各个难关,虽然花了大量的时间和精力,但在我看来这绝对是值得的。
起码让我明白了,光有理论是苍白无力的,我们必须将他附注于实践才能升华。