编译原理词法分析程序的设计实验报告.docx

上传人:b****1 文档编号:3245898 上传时间:2023-05-05 格式:DOCX 页数:18 大小:174.07KB
下载 相关 举报
编译原理词法分析程序的设计实验报告.docx_第1页
第1页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第2页
第2页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第3页
第3页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第4页
第4页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第5页
第5页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第6页
第6页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第7页
第7页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第8页
第8页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第9页
第9页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第10页
第10页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第11页
第11页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第12页
第12页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第13页
第13页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第14页
第14页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第15页
第15页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第16页
第16页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第17页
第17页 / 共18页
编译原理词法分析程序的设计实验报告.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理词法分析程序的设计实验报告.docx

《编译原理词法分析程序的设计实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析程序的设计实验报告.docx(18页珍藏版)》请在冰点文库上搜索。

编译原理词法分析程序的设计实验报告.docx

编译原理词法分析程序的设计实验报告

编译原理词法分析程序设计实验报告

【实验目的】

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

#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;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++)

{

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;i

{

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语言编写程序,实现一定的实际功能。

通过本次实验,使我更深层次的掌握了词法分析。

从刚开始的无从下手到后来渐渐的突破了各个难关,虽然花了大量的时间和精力,但在我看来这绝对是值得的。

起码让我明白了,光有理论是苍白无力的,我们必须将他附注于实践才能升华。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2