实验3 词法分析(二)

news2025/5/18 1:52:33

实验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.心得体会的总结
加深了对词法分析原理的理解,还提高了编程实践和调试能力,更加熟悉和掌握了编译器设计的基本流程和技术。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VsCode创建VUE项目

1. 首先安装Node.js和npm 通过网盘分享的文件&#xff1a;vsCode和Node&#xff08;本人电脑Win11安装&#xff09; 链接: https://pan.baidu.com/s/151gBWTFZh9qIDS9XWMJVUA 提取码: 1234 它们是运行和构建Vue.js应用程序所必需的。 1.1 Node安装&#xff0c;点击下一步即可 …

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具04

SQLSERVER的ImpDp和ExpDp工具演示 1、指定某些表作为导出对象外 (-exclude_table) 验证用&#xff1a;导出的表&#xff0c;导入到新的数据库 2、指定某些表作为导出对象外 (-exclude_table) 支持模糊检索&#xff0c;可以使用星号 以s开头的表作为导出对象外&#xff0c;…

国内知名Deepseek培训师培训讲师唐兴通老师讲授AI人工智能大模型实践应用

课程名称 《Deepseek人工智能大模型实践应用》 课程目标 全面了解Deepseek人工智能大模型的技术原理、功能特点及应用场景。 熟练掌握Deepseek大模型的提示词工程技巧&#xff0c;能够编写高质量的提示词。 掌握Deepseek大模型在办公、营销等领域的应用方法&#xff0c;提升…

【C语言标准库函数】指数与对数函数:exp(), log(), log10()

目录 一、头文件 二、函数简介 2.1. exp(double x) 2.2. log(double x) 2.3. log10(double x) 三、函数实现&#xff08;概念性&#xff09; 3.1. exp(double x) 的模拟实现 3.2. log(double x) 和 log10(double x) 的模拟实现 四、注意事项 4.1. exp(double x) 的注…

小白系列:数据库基础知识解析

前言 今天&#xff0c;我打算用简单明了的语言来讲解一下数据库的基本概念。总体上&#xff0c;这些内容与我在视频中讲解的基本一致。如果你发现视频的讲解有些难以理解&#xff0c;不妨看看这篇文字版的解释&#xff0c;希望能够更快速地帮助你掌握数据库的相关知识。需要注…

【AIGC魔童】DeepSeek核心创新技术(二):MLA

【AIGC魔童】DeepSeek核心创新技术&#xff08;二&#xff09;&#xff1a;MLA 1. MLA框架的定义与背景2. MLA框架的技术原理&#xff08;1&#xff09;低秩联合压缩&#xff08;2&#xff09;查询的低秩压缩&#xff08;3&#xff09;旋转位置嵌入&#xff08;RoPE&#xff09…

安卓/ios脚本开发按键精灵经验小分享

1. 程序的切换 我们经常碰到这样的需求&#xff1a;打开最近的应用列表&#xff0c;选取我们想要的程序。但是每个手机为了自己的风格&#xff0c;样式都有区别&#xff0c;甚至连列表的滑动方向都不一样&#xff0c;我们很难通过模拟操作来识别点击&#xff0c;那么我们做的只…

完全离线部署deepseek并建立本地知识库应用电子数据取证领域

点击上方蓝字“小谢取证”一起玩耍 之前小谢推出一篇部署本地大模型教程&#xff0c;但需要网络环境 AI机器人本地免费部署&#xff08;部署Llama 3.1详细教程&#xff09; 还是比较受到读者的欢迎&#xff0c;但应读者要求&#xff1a;需要这个模型能够训练&#xff0c;能够…

ctf网络安全题库 ctf网络安全大赛答案

此题解仅为部分题解&#xff0c;包括&#xff1a; 【RE】&#xff1a;①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩丝 【Misc】①爆爆爆爆 ②凯撒大帝的三个秘密 ③你才是职业选手 一、 Re ① Reverse Chec…

SolidWorks教程P2.2【草图 | 第二节】——草图几何关系与编辑

草图几何关系包括&#xff1a;重合、中点、相切、平行、相等、共线、对称 草图编辑功能包括&#xff1a;裁剪实体、转换实体引用、等距实体 目录 1.草图几何关系 2.裁剪实体 3.转换实体引用 4.等距实体 补充知识&#xff1a;智能尺寸 1.草图几何关系 在之前的草图介绍里…

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

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

MySQL视图索引操作

创建学生表&#xff1b; mysql> create table Student(-> Sno int primary key auto_increment,-> Sname varchar(30) not null unique,-> Ssex char(2) check (Ssex男 or Ssex女) not null,-> Sage int not null,-> Sdept varchar(10) default 计算机 not …

HIVE如何注册UDF函数

如果注册UDF函数的时候报了上面的错误&#xff0c;说明hdfs上传的路径不正确&#xff0c; 一定要用下面的命令 hadoop fs -put /tmp/hive/111.jar /user/hive/warehouse 一定要上传到上面路径&#xff0c;这样在创建函数时&#xff0c;引用下面的地址就可以创建成功

硬件电路基础

目录 1. 电学基础 1.1 原子 1.2 电压 1.3 电流 1.电流方向&#xff1a; 正极->负极,正电荷定向移动方向为电流方向&#xff0c;与电子定向移动方向相反。 2.电荷&#xff08;这里表示负电荷&#xff09;运动方向&#xff1a; 与电流方向相反 1.4 测电压的时候 2. 地线…

蓝耘智算平台使用DeepSeek教程

目录 一.平台架构与技术特点 二、DeepSeek R1模型介绍与优势 DeepSeek R1 模型简介 DeepSeek R1 模型优势 三.蓝耘智算平台使用DeepSeek教程 展望未来 耘元生代智算云是蓝耘科技推出的一款智算云平台有着以下特点&#xff1a; 一.平台架构与技术特点 基于 Kubernetes 原…

脚本一键生成管理下游k8s集群的kubeconfig

一、场景 1.1 需要管理下游k8s集群的场景。 1.2 不希望使用默认的cluster-admin权限的config. 二、脚本 **重点参数&#xff1a; 2.1 配置变量。 1、有单独namespace的权限和集群只读权限。 2、自签名的CA证书位置要正确。 2.2 如果配置错误&#xff0c;需要重新…

发布:大彩科技DN系列2.8寸高性价比串口屏发布!

一、产品介绍 该产品是一款2.8寸的工业组态串口屏&#xff0c;采用2.8寸液晶屏&#xff0c;分辨率为240*320&#xff0c;支持电阻触摸、电容触摸、无触摸。可播放动画&#xff0c;带蜂鸣器&#xff0c;默认为RS232通讯电平&#xff0c;用户短接屏幕PCB上J5短接点即可切换为TTL电…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证

MySQL 主从复制原理及其工作过程 MySQL 主从复制&#xff08;Master-Slave Replication&#xff09;是一种数据同步技术&#xff0c;其中一个 MySQL 实例&#xff08;主库&#xff09;将其数据变更&#xff08;插入、更新、删除&#xff09;通过二进制日志&#xff08;Binary …

华北平原shp格式范围

华北平原是中国东部的重要地理区域&#xff0c;以下是对其的简要介绍&#xff1a; 此数据为付费数据&#xff0c;如有需求&#xff0c;请联系本人。 1. 地理位置与范围 位置&#xff1a;位于中国东部&#xff0c;西起太行山脉和伏牛山&#xff0c;东至黄海、渤海&#xff0c;北…

Unity 快速入门 1 - 界面操作

本项目将快速介绍 Unity 6的基本操作和功能&#xff0c;下载附件的项目&#xff0c;解压到硬盘&#xff0c;例如 D:\Unity Projects\&#xff0c; 注意整个文件路径中只有英文、空格或数字&#xff0c;不要有中文或其他特殊符合。 1. 打开Unity Hub&#xff0c;点击右上角的 O…