实验3 词法分析(二)

实验3 词法分析(二)

[实验目的]:
1 . 熟悉给定的词法分析程序;
2 . 改进词法分析程序。
[实验内容]:
1.尝试多方面改进TEST语言的文法,参考教材附录B词法分析程序TESTscan.c,在此词法分析程序的基础上改进程序,并编程运行。(第3章习题6给出了需要改进的程序功能要求)
2.输入一段TEST源程序并以文件形式保存,运行改进后的TEST词法程序,查看词法分析输出文件,检查是否与改进要求一致。
[实验要求]:
每位同学撰写一份试验报告,并提交电子版的源程序和实验报告。
实验报告的要求:
1.写出改进的文法;
2.写出改进部分的程序。(可在原程序上将改进部分标红色字体)
3.心得体会的总结

1.写出改进的文法:
标识符:允许的标识符现在必须以字母或下划线开头,后面可以跟字母、数字或下划线。这修正了标识符的定义,使其符合编程语言中常见的约定。
数字: 增加了对十六进制(以0x开头)和二进制(以0b开头)的支持,使得数字表示的范围更广。
字符串: 字符串现在用双引号(")包围,可以包含普通字符和转义字符,增强了语言的表达能力。
注释: 增加了多行注释和单行注释的功能,提升了程序的可读性。

2.写出改进部分的程序。(可在原程序上将改进部分标红色字体)

#include <stdio.h>
#include <ctype.h>
#include <string.h>
// 下面定义保留,为简化程序,使用字符指针数组保存所有保留字。
// 如果想增加保留字,可继续添加,并修改保留字数目
#define keywordSum 9
char *keyword[keywordSum] = {"do", "if", "else", "for", "while", "do", "int", "read", "write"};
// 下面定义纯单分界符,如需要可添加
// 添加了!的处理
char singleword[50] = "+-*(){};,:!";
// 下面定义双分界符的首字符
// 添加了&&和||的处理
char doubleword[10] = "><=!&|";
extern char Scanin[300], Scanout[300]; // 用于接收输入输出文件名,在TEST_main.c中定义
extern FILE *fin, *fout; // 用于指向输入输出文件的指针,在TEST_main.c中定义
int TESTscan() { // 词法分析函数
	char ch, token[40]; // ch为每次读入的字符,token用于保存识别出的单词
	int es = 0, j, n; // es错误代码,0表示没有错误。j,n为临时变量,控制组合单词时的下标等
	printf("请输入源程序文件名(包括路径):");
	scanf("%s", Scanin);
	printf("请输入词法分析输出文件名(包括路径):");
	scanf("%s", Scanout);
	if ((fin = fopen(Scanin, "r")) == NULL) { // 判断输入文件名是否正确
		printf("\n打开词法分析输入文件出错!\n");
		return (1); // 输入文件出错返回错误代码1
	}
	if ((fout = fopen(Scanout, "w")) == NULL) { // 判断输出文件名是否正确
		printf("\n创建词法分析输出文件出错!\n");
		return (2); // 输出文件出错返回错误代码2
	}
	ch = getc(fin);
	while (ch != EOF) {
		while (ch == ' ' || ch == '\n' || ch == '\t')
			ch = getc(fin);
		if (ch == EOF)
			break;
		if (isalpha(ch)) { // 如果是字母,则进行标识符处理
			token[0] = ch;
			j = 1;
			ch = getc(fin);
			while (isalnum(ch)) { // 如果是字母数字则组合标识符;如果不是则标识符组合结束
				token[j++] = ch; // 组合的标识符保存在token中
				ch = getc(fin); // 读下一个字符
			}
			token[j] = '\0'; // 标识符组合结束
			// 查保留字
			n = 0;
			while ((n < keywordSum) && strcmp(token, keyword[n]))
				n++;
			if (n >= keywordSum) // 不是保留字,输出标识符
				fprintf(fout, "%s\t%s\n", "ID", token); // 输出标识符符号
			else  // 是保留字,输出保留字
				fprintf(fout, "%s\t%s\n", token, token); // 输出保留字符号
		} else if (isdigit(ch)) { // 数字处理
			token[0] = ch;
			j = 1;
			ch = getc(fin); // 读下一个字符
			while (isdigit(ch)) { // 如果是数字则组合整数;如果不是则整数组合结束
				token[j++] = ch; // 组合整数保存在token中
				ch = getc(fin); // 读下一个字符
			}
			token[j] = '\0';  // 整数组合结束
			fprintf(fout, "%s\t%s\n", "NUM", token); // 输出整数符号
		} else if (strchr(singleword, ch) > 0) { // 单分符处理
			token[0] = ch;
			token[1] = '\0';
			ch = getc(fin);// 读下一个符号以便识别下一个单词
			fprintf(fout, "%s\t%s\n", token, token); // 输出单分界符符号
		} else if (strchr(doubleword, ch) > 0) { // 双分界符处理
			token[0] = ch;
			ch = getc(fin); // 读下一个字符判断是否为双分界符
			if (ch == '=') { // 如果是=,组合双分界符
				token[1] = ch;
				token[2] = '\0'; // 组合双分界符结束
				ch = getc(fin); // 读下一个符号以便识别下一个单词
			} else if (ch == '&') {
				// 新加双分界符 &
				token[1] = ch;
				token[2] = '\0';
				ch = getc(fin);
			} else if (ch == '|') {
				// 新加双分界符 |
				token[1] = ch;
				token[2] = '\0';
				ch = getc(fin);
			} else // 不是=则为单分界符
				token[1] = '\0';
			fprintf(fout, "%s\t%s\n", token, token); // 输出单或双分界符符号
		} else if (ch == '/') { // 注释处理
			ch = getc(fin); // 读下一个字符
			if (ch == '*') { // 如果是*,则开始处理注释
				char ch1;
				ch1 = getc(fin); // 读下一个字符
				do {
					ch = ch1;
					ch1 = getc(fin);
				} // 删除注释
				while ((ch != '*' || ch1 != '/') && ch1 != EOF); // 直到遇到注释结束符*/或文件尾
				ch = getc(fin); // 读下一个符号以便识别下一个单词
			} else { // 不是*则处理单分界符/
				token[0] = '/';
				token[1] = '\0';
				fprintf(fout, "%s\t%s\n", token, token); // 输出单分界符/
			}
		} else { // 错误处理
			token[0] = ch;
			token[1] = '\0';
			ch = getc(fin); // 读下一个符号以便识别下一个单词
			es = 3;  // 设置错误代码
			fprintf(fout, "%s\t%s\n", "ERROR", token); // 输出错误符号
		}
	}
	fclose(fin); // 关闭输入输出文件
	fclose(fout);
	return (es); // 返回主程序
}
#include <stdio.h>
#include "TESTscan.h"
extern int TESTscan();

char Scanin[300], Scanout[300];

FILE *fin, *fout;

int main() {
	int es = 0;
	es = TESTscan();
	if (es > 0) {
		printf("词法分析有误,编译停止\n");
	} else {
		printf("词法分析成功\n");
	}
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
3.心得体会的总结
加深了对词法分析原理的理解,还提高了编程实践和调试能力,更加熟悉和掌握了编译器设计的基本流程和技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965790.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[创业之路-286]:《产品开发管理-方法.流程.工具 》-2- 人的管理是任何组织首要解决的问题 - 企业与研发组织组成、构架、组织分工

目录 一、产品开发的部门组成&#xff08;系统关键组成要素&#xff09; 1、产品开发中的市场规划部门与研发内部的市场/产品/技术预研部门的职责区别&#xff1a; 2、研发的分类&#xff1a;技术预研、平台开发、产品开发 相同点 差异点 相互联系 二、研发的组织架构 1…

使用jmeter进行压力测试

使用jmeter进行压力测试 jmeter安装 官网安装包下载&#xff0c;选择二进制文件&#xff0c;解压。 tar -xzvf apache-jmeter-x.tgz依赖jdk安装。 yum install java-1.8.0-openjdk环境变量配置&#xff0c;修改/etc/profile文件&#xff0c;添加以下内容。 export JMETER/…

matlab simulink LNG广义预测控制

1、内容简介 略 matlab simulink 120-LNG广义预测控制 可以交流、咨询、答疑 2、内容说明 略 模型分为2部分&#xff0c;一部分是simulink的结果&#xff0c;用的是pid和模糊pid控制&#xff0c;第二个模型考虑到代码计算的方便性&#xff0c;采用的m文件做仿真&#xff0…

git submodule使用

git submodule 用于关联其他独立的仓库。 它有着几点好处&#xff1a; 代码复用&#xff1a;可以将工具代码放到单独的仓库&#xff0c;再通过 submodule 关联。模块化开发&#xff1a;可以将项目拆分成多个模块&#xff0c;每个模块设置单独仓库独立开发&#xff0c;再通过 su…

python怎么求 一个数是否包含3

python求一个数包含3的方法&#xff1a; 1、使用“for i in 列表名”循环遍历列表中的每一个元素并将每个元素用str()函数转换成字符串格式 2、用“if str(3) in i”判断该元素中是否含有3 完整代码如下&#xff1a; 执行结果如下&#xff1a;

数据库系统概念第六版记录 三

外码约束&#xff08;Foreign Key Constraint&#xff09; 外码&#xff08;Foreign Key, FK&#xff09;是关系数据库中的一个约束&#xff0c;它用于保证表之间的引用完整性。外码的值必须&#xff1a; 要么存在于被引用表的主键列中&#xff0c;要么为空&#xff08;NULL&…

修改SSH登录密码,只需要登录SSH,之后输入命令即可,这里登录使用的软件为 MobaXterm1

在登入终端之后输入命令 passwd {用户名} 即可进行修改。需要注意的是&#xff0c;输入的密码不会有星号代替&#xff0c;也不会出现明文。 如果想要修改SSH的登录端口&#xff0c;比如修改为1433&#xff0c;则只需要执行以下命令即可&#xff1a; /usr/sbin/sshd -p 1433…

电商平台的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统商品交易信息管理难度大&#xff0c;容错率低&#xff0…

【R语言】plyr包和dplyr包

一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”&#xff08;split-apply-combine&#xff09;策略。此策略是指将一个问题分割成更容易操作的部分&#xff0c;再对每一部分进行独立的操作&#xff0c;最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…

oscp备考,oscp系列——VulnOSv2靶场,两种方法获取低权限shell

前言 oscp备考&#xff0c;oscp系列——VulnOSv2靶场&#xff0c;两种方法获取低权限shell 难度简单 对于低权限shell获取涉及&#xff1a;drupal 7 getshell漏洞&#xff0c;opendocman sql注入&#xff0c;ssh连接对于提权&#xff1a;内核提权 下载地址&#xff1a; http…

东方财富股吧发帖与评论爬虫

东方财富股吧发帖与评论爬虫 东方财富股吧爬虫 写在开头项目介绍主要功能文件介绍爬取逻辑 a. 爬取帖子信息b. 爬取评论信息 使用步骤 1. 下载代码2. MongoDB 安装3. Webdriver 安装4. 运行 main.py5. 查看数据 踩过的坑附录&#xff08;运行结果&#xff09; 东方财富股吧爬…

wxWidgets生成HTML文件,带图片转base64数据

编译环境大家可以看我之前的文章,CodeBlocks + msys2 + wx3.2,win10 这里功能就是生成HTML文件,没用HTML库,因为是自己固定的格式,图片是一个vector,可以动态改变数量的。 效果如下: #include <wx/string.h> #include <wx/file.h> #include <wx/ima…

网络编程 day2

题目 代码 服务器 typedef char DataType[32]; //普通节点数据类型typedef struct NODE {union{DataType data; //普通节点数据域int len; //头节点数据域};struct NODE *next; //指针域 }node,*nodePtr;struct PACK {int size; //告知 通信传输的数据的大小int type; //决定…

【鸿蒙HarmonyOS Next实战开发】实现ArkTS/JS和C/C++的交互-Node-API

一、HarmonyOS Node-API简介 在HarmonyOS应用开发中&#xff0c;通常以ArkTS/JS语言为主&#xff0c;但在一些特殊场景下&#xff0c;例如游戏开发、物理模拟等&#xff0c;由于对性能、效率等有较高要求&#xff0c;需要借助现有的C/C库来实现。为了满足这种需求&#xff0c;…

Postgresql的三种备份方式_postgresql备份

这种方式可以在数据库正在使用的时候进行完整一致的备份&#xff0c;并不阻塞其它用户对数据库的访问。它会产生一个脚本文件&#xff0c;里面包含备份开始时&#xff0c;已创建的各种数据库对象的SQL语句和每个表中的数据。可以使用数据库提供的工具pg_dumpall和pg_dump来进行…

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤

一、Keil uVision5创建工程步骤 1.点击项目&#xff0c;新建 2.新建目录 3.选择目标机器&#xff0c;直接搜索at89c52选择&#xff0c;然后点击OK 4.是否添加起吊文件&#xff0c;一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键&#xff0c;添加…

基础篇05-直方图操作

本节将简要介绍Halcon中有关图像直方图操作的算子&#xff0c;重点介绍直方图获取和显示两类算子&#xff0c;以及直方图均衡化处理算子。 目录 1. 引言 2. 获取并显示直方图 2.1 获取&#xff08;灰度&#xff09;直方图 (1) gray_histogram (2) gray_histo_abs (3) gr…

3.攻防世界 weak_auth

题目描述提示 是一个登录界面&#xff0c;需要密码登录 进入题目页面如下 弱口令密码爆破 用1 or 1 #试试 提示用admin登录 则尝试 用户名admin密码&#xff1a;123456 直接得到flag 常用弱口令密码&#xff08;可复制&#xff09; 用户名 admin admin-- admin or -- admin…

金蛇祈福,鸿运开年!广州白云皮具城2025开市大吉!

锣鼓一响&#xff0c;黄金万两&#xff01;2月6日大年初九&#xff0c;广州白云皮具城举行盛大的醒狮开市仪式&#xff01;象征吉祥如意的醒狮&#xff0c;将好运、财运传递给全体商户和八方来客。 醒狮点睛 金鼓一响黄金万两&#xff0c;十头醒狮登台&#xff0c;董事总经理刘…

【Axure教程】标签版分级多选下拉列表

分级多选下拉列表是指一个下拉列表&#xff0c;它包含多个层次的选项&#xff0c;用户可以选择一个或多个选项。这些选项通常是根据某种层级关系来组织的&#xff0c;例如从上到下有不同的分类或者过滤条件&#xff0c;用户选择上层选项后&#xff0c;下层选项会发生变化&#…