《编译原理》陈火旺——词法分析程序c语言实现完整版

编译原理——词法分析程序c语言实现完整版

词法分析程序

一、实验目的

根据所学知识设计、编制并调试一个词法分析程序,加深对词法分析概念的理解以及编写代码的锻炼。

二、实验内容

(1)分组完成,每组由3-4位同学组成
(2)确定源语言L和编写程序的语言P
(3)用正规式描述L的词法规则
(4)根据正规式构造给出识别单词的DFA M
(5)根据M,用语言P编写L的词法分析程序

三、实验过程

首先,本实验使用的C++语言编写分析C语言的词法分析程序,基本功能为识别以下几类单词:
 标识符
 关键字
 运算符
 界符
 常数
 注释

1. 文法设计

给出各类单词的词法规则描述(正则文法或正则表达式)

  • 1.标识符:(A|B|…|Z|a|b|…|z|)( A|B|…|Z|a|b|…|z|| 0|1|2|…|9)*
  • 2.关键字:auto | break | case | char | const | continue | default | do | double | else | enum | extern | float | for | goto | if | int | long | register | return | short | signed | sizeof | static | struct | switch | typedef | unsigned | union | void | volatitle | while
  • 3.运算符:+ | - | * | / | % | ++ | += | – | -> | -= | *= | /= | %= | = | == | != | > | < | >= | <= | ! | && | || | & | | | ~
  • 4.界符:( | ) | [ | ] | { | } | , | : | ; | " | ’
  • 5.常数:(0|1|2|…|9)(0|1|2|…|9)(( . (0|1|2|…|9) (0|1|2|…|9))|ε)

2. 构造DFA

在这里插入图片描述

3. 种别编码

词法分析需要输出单词符号对应的属性值,因此构造出如图1-2所示的种别编码表,分别为:

  • 关键字:一符一种
  • 其他字符:一符一种
  • 运算符:一符一种
  • 界符:一符一种
  • 数字:统一使用200
  • 标识符:统一使用300
    在这里插入图片描述

4.各函数功能说明

在这里插入图片描述

6. 主程序功能流程图

在这里插入图片描述

四、测试截图

本次分析为使用了c语言的一个完整的程序输入进入记事本,并用程序进行读文件,文件中的程序截图如图4-1所示。在这里插入图片描述

五、程序源代码(你们最喜欢的!喜欢记得住转发点赞啊)

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctype.h>
#include <stdlib.h>
#define _KEY_WORD_END " "
using namespace std;
typedef struct {
    /* 单词二元式的结构 */
	int value;    /* 种别码 */
	string token;    /* 存放单词的字符串 */
} Word;
vector<string> idQueue; //标识符容器,为了保证标识符不重复
Word* scanner(FILE *fp); // 对文件扫描读取
int keyOrIdentifier(string token);  //判断是关键字还是标识符
bool isIdExit(vector<string> idQueue,string id); //对标识符序列进行扫描


string KeyWords[]= {
   "auto","break","case","char","const","continue","default","do","double",
"else","enum","extern","float","for","goto","if","int","long","register","return","short","signed",
"sizeof","static","struct","switch","typedef","unsigned","union","void","volatitle","while",_KEY_WORD_END};
int line_num=1;
/*
    输入:源程序字符串
    输出:二元式<value,token>
*/
int main() {
   
	Word* oneword=new Word;
	FILE *fp;
	int over=1; //如果词法解析出现错误,则结束读取
	if( (fp=fopen("input.txt","rt")) == NULL ) {
   
		cout<<"Cannot open file, press any key to exit!"<<endl;
	}
	while(over<1000&&over!=-1) {
   
		oneword=scanner(fp);
		if(oneword->value<1000&&oneword->value>0)
			cout<<"<"<<oneword->value<<","<<oneword->token<<">"<<endl;
		over=oneword->value;
	}

	fclose(fp);
	system("pause");

	return 0;
}
/* 判断是标识符还是关键字*/
int keyOrIdentifier(string token) {
   
	int i=0;
	while(KeyWords[i]!=_KEY_WORD_END) {
   
		if(KeyWords[i]==token) {
   
			return i+1;
		}
		i=i+1;
	}
	return 300;
}

/*判断标识符是否重复*/
bool isIdExit(string id) {
   
	vector<string>::iterator iter=find(idQueue.begin(),idQueue.end(),id);
	if(iter==idQueue.end()) {
   
		return false;
	}
	return true;
}

/*扫描程序*/
Word* scanner(FILE *fp) {
   
	char ch;
	string token="";
	Word
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 编译原理火旺第三版是一本经典的编译原理教材,对于计算机专业学生而言非常重要。课后题的答案对于学习者来说也是必不可少的,其中csdn网站收录了许多编译原理火旺第三版的课后答案。这些答案内容丰富、详细,适合不同层次的学习者查看。下面是我对编译原理火旺第三版课后答案csdn的评价和总结。 首先,编译原理火旺第三版课后答案csdn的质量较高,涵盖了全书的各个章节乃至细节部分。学生们可以通过这些答案来核对自己的作业和学习成果,同时也可以借鉴其中的解题思路和方法,以便更好地理解和掌握编译原理的知识。 其次,编译原理火旺第三版课后答案csdn的排版清晰、简洁,易于查看和理解。学生们可以通过该网站轻松找到自己需要的各类题目的答案和解析,无需繁琐的查阅或搜索过程,更为方便快捷。 总的来说,编译原理火旺第三版课后答案csdn是一份非常有价值的学习资源,通过其的学习者可以更好地掌握编译原理的相关知识,并且能够有效地巩固和提升自己的学习效果。同时,我也鼓励学习者们可以自己主动解题和思考,以便更好地探索和理解编译原理的奥秘。 ### 回答2: 《编译原理》是计算机科学中非常重要的一门课程,而火旺第三版课后答案自然也成为该书学习过程中不可或缺的指南。在CSDN(中国最大的技术社区)上,有很多用户都分享了自己整理的该书答案,其中包括理论课和实验课的答案。 对于理论课的答案,主要涵盖了编译原理的各个章节内容,包括语法分析、语义分析、代码生成等。这些答案的整理和分享,有助于学生更好地理解课程,解决枯燥难懂的理论问题,也能够帮助老师提供更加完善的教学资源。 实验课的答案则主要涉及编译器的实现和优化,包括词法分析器、语法分析器、中间代码生成等。这些答案能够给学生提供实时的指导和帮助,帮助他们完成实验任务,同时也能让老师更好地评估学生实验的绩效。 总之,火旺第三版课后答案在学习编译原理过程中起到了至关重要的作用,它们可以帮助学生更好地学习和掌握课程内容,并且提供尽可能完善的教学资源。在CSDN上,可以找到许多优质的课后答案,它们有助于我们更好地掌握编译原理这门重要课程。 ### 回答3: 编译原理火旺第三版是一本经典的编译原理教材,它包含了编译原理的基本概念、前端、中端、后端等方面的内容。其课后答案可以在csdn等网站上得到。 这本书的课后答案是学习该书内容的一个重要补充,它可以帮助学生巩固和加深对该书内容的理解,并且可以帮助学生查漏补缺,提高学习效率。 在csdn等网站上寻找编译原理火旺第三版课后答案时,我们可以根据自己的需要选择相应的章节进行查找。这些答案通常是由编译原理领域的专家编写的,具有一定的权威性和可靠性。 除了csdn等网站,我们还可以在一些在线教育平台上找到编译原理火旺第三版课后答案,这些平台通常会提供相应的视频教程和讲义,让学生更好地理解和掌握该书的内容。 总之,编译原理火旺第三版课后答案是一个重要的学习资源,可以帮助我们更好地学习和掌握编译原理的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值