词法分析实验报告

词法分析器

一、实验目的:

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。

二、实验要求

如源程序为C语言。输入如下一段:

main() { int a,b; a = 10; b = a + 20;

}# 要求输出如右图。 要求: 1、将单词分为五种 识别关键字:main、if、int、for、while、do、return、break、continue;

单词种别码为1。 标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括:+、-、*、/、=、>、=、

分隔符包括:,、;、{、}、(、); 单词种别码为5。 2、使用一符一种的分法

关键字、运算符和分界符可以每一个均为一种

标识符和常数仍然一类一种

三、实验内容

1、功能描述

改程序是一个实现词法分析的功能,能识别5种单词,其他单词报错。

2、程序结构描述

int IsKey(char *Word)关键字匹配函数,查询是否为关键字,若是,返回值为1,否则为0。 int IsAlpha(char c) 查看是否为字母,若是,返回值为1,否则为0。

int IsNum(char c) 查看是否为数字,若是,返回值为1,否则为0。

void scanner(FILE *fp) 扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是字母、数字,是否是关键字,并输出。

fseek(fp,-1,1) 回退一个字符。

fgetc(fp) 从数据流中区下一个字符。

fopen 文件打开函数,返回指向文件第一个字符的指针

四、实验结果

测试内容为

main()

{

int a,b;

a = 10;

b = a + 20;

}#

结果

测试代码为

void main()

{

int a,b;

if(a = 10;)

b += 20;

c=%;

}#

结果为

测试代码

main()

{

int a,b;

if(a

b += 20;

c=%@;

return 0;

}#

结果

五、实验过程记录

1、因为用到回退函数fseek(),而以前没有用过这个函数,所以开始时很苦恼,不知道如何回退一个字符,后来问了同学,才明白原来有这么一个函数,顿时豁然开朗。

2、本次试验中word[20]保存字符串时,不能正确保存,总是出错,原因是while(IsNum(ch)||IsAlpha(ch)){

Word[i]=ch;

i++;

ch=fgetc(fp);

}中,i++与Word[i]=ch;次序不对,后来多次思索,发现问题。

六、实验总结

本次实验花了将近一个下午才完成。在纸上设计的时间大约40分钟,剩下的时间是录入和调试。本次实验使我认识到,一段时间搁置,不编程序,水平会下降,好多有关c语言的知识会忘掉,所以以后我会经常写写程序。另外,通过本次实验,我又进一步加深对词法分析原理的理解。总的来说,获益匪浅!

附录

#include

#include

#include

#include

#include

Char*Key[9]={"void","main","int","if","then","else","return","break","continue"};

char ch; // 存储识别出的单词流

int IsAlpha(char c) { //判断是否为字母

if(((c='a'))||((c='A'))) return 1;

else return 0;

}

int IsNum(char c){ //判断是否为数字

if(c>='0'&&c

else return 0;

}

int IsKey(char *Word){ //识别关键字函数

int m,i;

for(i=0;i

if((m=strcmp(Word,Key[i]))==0)

return 1;

}

return 0;

}

void scanner(FILE *fp){ //扫描函数

char Word[20]={'\0'};

char ch;

int i,c;

ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符

if(IsAlpha(ch)){ //判断该字符是否是字母

Word[0]=ch;

ch=fgetc(fp);

i=1;

while(IsNum(ch)||IsAlpha(ch)){ //判断该字符是否是字母或数字 Word[i]=ch;

i++;

ch=fgetc(fp);

}

Word[i]='\0'; //'\0' 代表字符结束(空格)

fseek(fp,-1,1); //回退一个字符

c=IsKey(Word); //判断是否是关键字 if(c==0) cout

else cout

}

else //开始判断的字符不是字母

"++"

if(IsNum(ch)){ //判断是否是数字 Word[0]=ch; ch=fgetc(fp); i=1; while(IsNum(ch)){ Word[i]=ch; i++; ch=fgetc(fp); } Word[i]='\0'; fseek(fp,-1,1); //回退 cout

}

break;

case'*':

case'/':

case'!':

case'=':ch=fgetc(fp);

case'

case'>':ch=fgetc(fp);

default:

}

}

}

void main()

{

if(ch=='='){ Word[1]=ch; cout') { Word[1]=ch;cout

FILE *fp;

fp=fopen("c:\\1.txt","r");

if(fp==NULL) //读取文件内容,并返回文件指针,该指针指向文件的第一个字符 {cout

exit(0);

}

cout

while(ch!='#'){

ch=fgetc(fp);

if(ch=='#') break; //文件以#结尾,作为扫描结束条件

else if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格,空白,和换行 else{

fseek(fp,-1,1); //回退一个字节开始识别单词流

scanner(fp);

}

}

}

词法分析器

一、实验目的:

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。

二、实验要求

如源程序为C语言。输入如下一段:

main() { int a,b; a = 10; b = a + 20;

}# 要求输出如右图。 要求: 1、将单词分为五种 识别关键字:main、if、int、for、while、do、return、break、continue;

单词种别码为1。 标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括:+、-、*、/、=、>、=、

分隔符包括:,、;、{、}、(、); 单词种别码为5。 2、使用一符一种的分法

关键字、运算符和分界符可以每一个均为一种

标识符和常数仍然一类一种

三、实验内容

1、功能描述

改程序是一个实现词法分析的功能,能识别5种单词,其他单词报错。

2、程序结构描述

int IsKey(char *Word)关键字匹配函数,查询是否为关键字,若是,返回值为1,否则为0。 int IsAlpha(char c) 查看是否为字母,若是,返回值为1,否则为0。

int IsNum(char c) 查看是否为数字,若是,返回值为1,否则为0。

void scanner(FILE *fp) 扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是字母、数字,是否是关键字,并输出。

fseek(fp,-1,1) 回退一个字符。

fgetc(fp) 从数据流中区下一个字符。

fopen 文件打开函数,返回指向文件第一个字符的指针

四、实验结果

测试内容为

main()

{

int a,b;

a = 10;

b = a + 20;

}#

结果

测试代码为

void main()

{

int a,b;

if(a = 10;)

b += 20;

c=%;

}#

结果为

测试代码

main()

{

int a,b;

if(a

b += 20;

c=%@;

return 0;

}#

结果

五、实验过程记录

1、因为用到回退函数fseek(),而以前没有用过这个函数,所以开始时很苦恼,不知道如何回退一个字符,后来问了同学,才明白原来有这么一个函数,顿时豁然开朗。

2、本次试验中word[20]保存字符串时,不能正确保存,总是出错,原因是while(IsNum(ch)||IsAlpha(ch)){

Word[i]=ch;

i++;

ch=fgetc(fp);

}中,i++与Word[i]=ch;次序不对,后来多次思索,发现问题。

六、实验总结

本次实验花了将近一个下午才完成。在纸上设计的时间大约40分钟,剩下的时间是录入和调试。本次实验使我认识到,一段时间搁置,不编程序,水平会下降,好多有关c语言的知识会忘掉,所以以后我会经常写写程序。另外,通过本次实验,我又进一步加深对词法分析原理的理解。总的来说,获益匪浅!

附录

#include

#include

#include

#include

#include

Char*Key[9]={"void","main","int","if","then","else","return","break","continue"};

char ch; // 存储识别出的单词流

int IsAlpha(char c) { //判断是否为字母

if(((c='a'))||((c='A'))) return 1;

else return 0;

}

int IsNum(char c){ //判断是否为数字

if(c>='0'&&c

else return 0;

}

int IsKey(char *Word){ //识别关键字函数

int m,i;

for(i=0;i

if((m=strcmp(Word,Key[i]))==0)

return 1;

}

return 0;

}

void scanner(FILE *fp){ //扫描函数

char Word[20]={'\0'};

char ch;

int i,c;

ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符

if(IsAlpha(ch)){ //判断该字符是否是字母

Word[0]=ch;

ch=fgetc(fp);

i=1;

while(IsNum(ch)||IsAlpha(ch)){ //判断该字符是否是字母或数字 Word[i]=ch;

i++;

ch=fgetc(fp);

}

Word[i]='\0'; //'\0' 代表字符结束(空格)

fseek(fp,-1,1); //回退一个字符

c=IsKey(Word); //判断是否是关键字 if(c==0) cout

else cout

}

else //开始判断的字符不是字母

"++"

if(IsNum(ch)){ //判断是否是数字 Word[0]=ch; ch=fgetc(fp); i=1; while(IsNum(ch)){ Word[i]=ch; i++; ch=fgetc(fp); } Word[i]='\0'; fseek(fp,-1,1); //回退 cout

}

break;

case'*':

case'/':

case'!':

case'=':ch=fgetc(fp);

case'

case'>':ch=fgetc(fp);

default:

}

}

}

void main()

{

if(ch=='='){ Word[1]=ch; cout') { Word[1]=ch;cout

FILE *fp;

fp=fopen("c:\\1.txt","r");

if(fp==NULL) //读取文件内容,并返回文件指针,该指针指向文件的第一个字符 {cout

exit(0);

}

cout

while(ch!='#'){

ch=fgetc(fp);

if(ch=='#') break; //文件以#结尾,作为扫描结束条件

else if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格,空白,和换行 else{

fseek(fp,-1,1); //回退一个字节开始识别单词流

scanner(fp);

}

}

}


相关文章

  • 词法分析器_实验报告 1
  • 词法分析器实验报告 实验目的: 设计.编制.调试一个词法分析子程序-识别单词,加深对词法分析原理的理解. 实验要求: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字.标识符.常数.运算符.分界符 ...查看


  • 词法分析器实验报告
  • 杭州电子科技大学 班级:12052312 专业:计算机科学与技术 实 验 报 告 [实验名称] 实验一词法分析实验 一.实验目的 设计.编制并调试一个词法分析程序,加深对词法分析原理的理解. 二.实验内容 2.1 待分析的简单词法 (1)关 ...查看


  • 词法分析实验报告 1
  • 实验一 词法分析 一.实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解.并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法. 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的 ...查看


  • 词法分析器编译原理C++实现实验报告
  • 学 生 实 验 报 告 学 院: 软件与通信工程学院 课程名称: 编译原理 专业班级: 姓 名: 学 号: 学生实验报告 一.实验综述 1.实验目的及要求 使用任意语言实现词法分析器 2.实验仪器.设备或软件 Visual C++. 二.实 ...查看


  • 编译原理--词法分析程序实验报告
  • 词法分析程序实验报告 1. 实验内容 待分析的简单语言的词法: 关键字:begin if then end (小写) 运算符::= + - * / > 界符:; # 标识符:ID=letter (letter|digit)* 常数:N ...查看


  • 编译原理实验指导书---2014年修订版
  • 编译原理实验指导 石家庄经济学院信息工程学院 2014-01-25 "编译原理"是计算机类专业一门理论性和实践性强的专业课程,在本专业的课程体系中处于十分重要的地位,属于必修课.本课程的内容主要介绍高级程序设计语言实现的 ...查看


  • 编译原理上机报告
  • 编译原理上机报告 组员: 班级: 一.上机题目: 实现一个简单的语言(Core Programming Language,CPL )的编译器(解释器) (或者其他自己想完成的编译器) 二.上机目的 加深编译原理基础知识的理解:词法分析.语法 ...查看


  • 浙江理工大学编译原理实验一
  • 2015-2016学年第一学期<编译原理>实验一 实验报告 13计科3 夏以彬 [1**********]3 一.实验目的 1.构造一个<科学计算器>的词法分析程序,程序要求能对输入的字符串流进行词法分析. 2.在实 ...查看


  • 编译原理上机安排及报告说明
  • 一.上机说明 1.上机共12小时,分为3次,每次4小时.其中第1次完成词法分析,第2.3次完成语法分析. 2.上机时间: 1班:11.25下午.12.23下午.12.24晚上 2班:12.2下午.12.23晚上.12.25上午 3班:11. ...查看


热门内容