C语言词法分析实验Word下载.docx

上传人:b****3 文档编号:15882085 上传时间:2022-11-16 格式:DOCX 页数:15 大小:102.17KB
下载 相关 举报
C语言词法分析实验Word下载.docx_第1页
第1页 / 共15页
C语言词法分析实验Word下载.docx_第2页
第2页 / 共15页
C语言词法分析实验Word下载.docx_第3页
第3页 / 共15页
C语言词法分析实验Word下载.docx_第4页
第4页 / 共15页
C语言词法分析实验Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

C语言词法分析实验Word下载.docx

《C语言词法分析实验Word下载.docx》由会员分享,可在线阅读,更多相关《C语言词法分析实验Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

C语言词法分析实验Word下载.docx

2.编写的分析程序能够正确识别源程序中的单词符号;

3.识别出的单词以<

单词符号,种别码>

的形式保存在符号表中(链表);

4.词法分析中源程序的输入以.c格式,分析后的符号表,将二元组保存在.txt文件中。

实验内容:

选择高级语言(C语言),编制它的词法分析程序。

词法分析程序的实现可以采用任何一种编程工具。

实验原理:

1、算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号;

2、其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

实验分析:

(1)关键字:

ifelsewhiledocaseintbreak等所有的关键字都是小写。

(2)运算符和界符:

=+-*/<

<

=<

>

>

==;

()等

(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:

ID=_|letter(letter|digit)*

NUM=digitdigit*

(4)空格有空白、制表符和换行符组成。

空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

(5)注释被忽略

实验流程图:

实验环境:

需要TC、VC++6.0等开发工具作为本次试验的环境。

实验步骤:

1、准备:

用TC、VC++等开发工具;

2、对本实验的任务进行分析,确定实现功能的函数;

3、写好程序,仔细修改函数;

4、上机操作:

输入源程序,修改、调试,运行;

5、写好试验报告;

实验调试过程及测试结果:

/*******************************源代码******************************/

#include<

stdio.h>

stdlib.h>

#include<

ctype.h>

string.h>

voidmain()

{

FILE*fp,*fp1;

inthanjsq=1;

//行计数器,保存行号

intguanjz(charch1[]);

//关键字和标识符判断

charch,infile[15],outfile[15];

//定义输入和输出文件名

printf("

*****************Entertheinfilename*******************\n"

);

scanf("

%s"

infile);

//输入需要扫描的文件名

*****************Entertheoutfilename******************\n"

outfile);

//输入需要另存为的文件名

if((fp=fopen(infile,"

r"

))==NULL)//打开需要扫描的文件

{

printf("

cannotopenfile\n"

exit(0);

}

if((fp1=fopen(outfile,"

w"

))==NULL)//打开需要存入的文件

\n*********************************************************\n"

*》开始进行词法分析《*\n"

*********************************************************\n"

行号字符串种别码\n"

fprintf(fp1,"

while(!

feof(fp))

ch=fgetc(fp);

if(ch==10)hanjsq++;

/**********************扫描头文件单词及保留字***********************/

if(isalpha(ch)||ch=='

_'

)//如果第一个字符为字母或下划线则判断为标识符

{

inti=0;

charch1[30];

//假定每个标识符最长为

ch1[i++]=ch;

//将ch保存到ch1[0]中并使i自加1

while(!

{

ch=fgetc(fp);

if(ch==10)hanjsq++;

//如果ch为换行符,则行计数器自加1

if(isalpha(ch)||isdigit(ch)||ch=='

{//如果ch为字母、数字或下划线就把ch放到ch1[i]中并使i自加1

ch1[i++]=ch;

}

if(ch=='

.'

)//如果ch为小数点则判断是否为头文件

{

if((ch=fgetc(fp))=='

h'

)//如果小数点后一位为h则判定其为头文件

{

if(ch==10)hanjsq++;

ch1[i++]='

;

ch1[i]='

\0'

//把结束标志放到ch1[i]中作为单词结束标志

line%d:

%s83\n"

hanjsq,ch1);

//以字符串形式输出ch1

fprintf(fp1,"

break;

}

else//如果小数点后一位不是h则判定其为标识符

fseek(fp,-1,1);

//fp回退1

printf("

%s%d\n"

hanjsq,ch1,guanjz(ch1));

fprintf(fp1,"

if(!

isalpha(ch)&

&

!

isdigit(ch)&

ch!

='

&

{//如果ch不为字母、数字、下划线和点时判断其为标识符

ch1[i]='

break;

}

}

/************************扫描数字*************************/

if(isdigit(ch)||ch=='

-'

)//如果ch为数字或'

{

if(isdigit(ch))//如果ch为数字

printf("

%c"

hanjsq,ch);

fprintf(fp1,"

while(!

{

ch=fgetc(fp);

//预读一位如果ch为数字和点则循环输出

if(isdigit(ch)||ch=='

%c"

ch);

else//否则视为数字结束

46\n"

//回退一位

ch='

0'

//置ch为0,以免影响下面误判并顺利退出扫描数字

}

}

if(ch=='

)//如果ch为'

//预读一位

)//如果ch还是为'

则判断为自减符'

--'

printf("

--80\n"

hanjsq);

fprintf(fp1,"

'

,则判断为结构体运算符'

->

->

81\n"

if(isdigit(ch))//如果ch为数字则可能为减号或负号

fseek(fp,-3,1);

//回退3为判断

if(isdigit(ch))//如果ch为数字则判断'

为减号

%c79\n"

else//否则判断'

为负号

ch=fgetc(fp);

while(!

printf("

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1