实验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.心得体会的总结
加深了对词法分析原理的理解,还提高了编程实践和调试能力,更加熟悉和掌握了编译器设计的基本流程和技术。
相关文章:
实验3 词法分析(二)
实验3 词法分析(二) [实验目的]: 1 . 熟悉给定的词法分析程序; 2 . 改进词法分析程序。 [实验内容]: 1.尝试多方面改进TEST语言的文法,参考教材附录B词法分析程序TESTscan.c,在此词法分析程序的基础上改进程序&#x…...
VsCode创建VUE项目
1. 首先安装Node.js和npm 通过网盘分享的文件:vsCode和Node(本人电脑Win11安装) 链接: https://pan.baidu.com/s/151gBWTFZh9qIDS9XWMJVUA 提取码: 1234 它们是运行和构建Vue.js应用程序所必需的。 1.1 Node安装,点击下一步即可 …...
【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具04
SQLSERVER的ImpDp和ExpDp工具演示 1、指定某些表作为导出对象外 (-exclude_table) 验证用:导出的表,导入到新的数据库 2、指定某些表作为导出对象外 (-exclude_table) 支持模糊检索,可以使用星号 以s开头的表作为导出对象外,…...
国内知名Deepseek培训师培训讲师唐兴通老师讲授AI人工智能大模型实践应用
课程名称 《Deepseek人工智能大模型实践应用》 课程目标 全面了解Deepseek人工智能大模型的技术原理、功能特点及应用场景。 熟练掌握Deepseek大模型的提示词工程技巧,能够编写高质量的提示词。 掌握Deepseek大模型在办公、营销等领域的应用方法,提升…...
4.Python字符串和列表:字符串输入、字符串输出、下标和切片、字符串常见函数、列表(list)、列表的循环遍历、列表的增删改查、列表的嵌套、列表的切片
1. Python 字符串 1.1 字符串输入 input() 函数用于从用户获取字符串输入。它总是返回一个字符串类型的值。 # 从用户输入字符串 name input("请输入你的名字:") print(f"你好, {name}")1.2 字符串输出 字符串的输出通常使用 print() 函数…...
【C语言标准库函数】指数与对数函数:exp(), log(), log10()
目录 一、头文件 二、函数简介 2.1. exp(double x) 2.2. log(double x) 2.3. log10(double x) 三、函数实现(概念性) 3.1. exp(double x) 的模拟实现 3.2. log(double x) 和 log10(double x) 的模拟实现 四、注意事项 4.1. exp(double x) 的注…...
小白系列:数据库基础知识解析
前言 今天,我打算用简单明了的语言来讲解一下数据库的基本概念。总体上,这些内容与我在视频中讲解的基本一致。如果你发现视频的讲解有些难以理解,不妨看看这篇文字版的解释,希望能够更快速地帮助你掌握数据库的相关知识。需要注…...
【AIGC魔童】DeepSeek核心创新技术(二):MLA
【AIGC魔童】DeepSeek核心创新技术(二):MLA 1. MLA框架的定义与背景2. MLA框架的技术原理(1)低秩联合压缩(2)查询的低秩压缩(3)旋转位置嵌入(RoPE)…...
Windows Docker笔记-制作、加载镜像
引言 在文章《Windows Docker笔记-在容器中运行项目》中,已经在容器中运行了项目。而且在这个容器中,已经调试好了项目运行的环境。 使用docker,就是为了在项目发布到生产环境时,不用再去安装项目运行的环境,直接丢给…...
安卓/ios脚本开发按键精灵经验小分享
1. 程序的切换 我们经常碰到这样的需求:打开最近的应用列表,选取我们想要的程序。但是每个手机为了自己的风格,样式都有区别,甚至连列表的滑动方向都不一样,我们很难通过模拟操作来识别点击,那么我们做的只…...
(动态规划 leetcode377)组合求和IV
确立状态转移方程需要深入理解问题,合理定义子问题,找到边界条件(比如dp[0]),分析状态之间的转移关系(dp和dp之间的关系),并进行验证。 递归是自顶向下,而dp是自下而上 这里是i作为目标值&…...
备赛蓝桥杯之第十五届职业院校组省赛第四题:多表单校验
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
完全离线部署deepseek并建立本地知识库应用电子数据取证领域
点击上方蓝字“小谢取证”一起玩耍 之前小谢推出一篇部署本地大模型教程,但需要网络环境 AI机器人本地免费部署(部署Llama 3.1详细教程) 还是比较受到读者的欢迎,但应读者要求:需要这个模型能够训练,能够…...
C语言-内存泄漏
1、内存泄漏 申请的空间没有释放 2、内存泄漏的原因 未释放内存:程序完成使用动态分配的内存后,忘记调用free()释放。 引用丢失:在分配内存后,指针被修改或丢失,导致无法访问到原始内存块。 多次分配:在分…...
ctf网络安全题库 ctf网络安全大赛答案
此题解仅为部分题解,包括: 【RE】:①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩丝 【Misc】①爆爆爆爆 ②凯撒大帝的三个秘密 ③你才是职业选手 一、 Re ① Reverse Chec…...
深度分析:网站快速收录与网站内容多样性的关系
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/87.html 网站快速收录与网站内容多样性之间存在着密切的关系。以下是对这一关系的深度分析: 一、网站内容多样性对快速收录的影响 提升搜索引擎抓取效率: 多样化的…...
SolidWorks教程P2.2【草图 | 第二节】——草图几何关系与编辑
草图几何关系包括:重合、中点、相切、平行、相等、共线、对称 草图编辑功能包括:裁剪实体、转换实体引用、等距实体 目录 1.草图几何关系 2.裁剪实体 3.转换实体引用 4.等距实体 补充知识:智能尺寸 1.草图几何关系 在之前的草图介绍里…...
数据库系统概念第六版记录 三
外码约束(Foreign Key Constraint) 外码(Foreign Key, FK)是关系数据库中的一个约束,它用于保证表之间的引用完整性。外码的值必须: 要么存在于被引用表的主键列中,要么为空(NULL&…...
使用 Axios 进行高效的数据交互
一、前言 1. 项目背景与目标 Axios 的重要性: Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js,简化了与服务器的通信。Axios 提供了丰富的功能,如拦截器、并发请求管理、取消请求等。2. 环境搭建 开发工具准备: 推荐使用 VSCode 或 WebStorm。安装必要的…...
MySQL视图索引操作
创建学生表; 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 …...
20个DeepSeek平替网站,解决DeepSeek无法使用!
DeepSeek因为访问量过大以及遭受网络攻击,官网和APP这几天时好时坏,API也没法用。目前360、华为在协助防御境外攻击,DeepSeek官网「晚上」使用情况已经比之前好多了。 得益于各大平台都接入了DeepSeek-R1,如果着急上手体验DeepSe…...
HIVE如何注册UDF函数
如果注册UDF函数的时候报了上面的错误,说明hdfs上传的路径不正确, 一定要用下面的命令 hadoop fs -put /tmp/hive/111.jar /user/hive/warehouse 一定要上传到上面路径,这样在创建函数时,引用下面的地址就可以创建成功...
硬件电路基础
目录 1. 电学基础 1.1 原子 1.2 电压 1.3 电流 1.电流方向: 正极->负极,正电荷定向移动方向为电流方向,与电子定向移动方向相反。 2.电荷(这里表示负电荷)运动方向: 与电流方向相反 1.4 测电压的时候 2. 地线…...
DeepSeek 模型发展脉络全解析
目录 一、DeepSeek Coder:代码智能领域的开拓者二、DeepSeek LLM:进军通用人工智能的号角三、DeepSeekMoE四、DeepSeek-V2:混合专家架构的新突破五、DeepSeekMath六、DeepSeek-Coder V2七、DeepSeek-VL2八、DeepSeek-V3:技术创新引…...
为多个GitHub账户配置SSH密钥
背景 当需要同时使用多个GitHub账户(例如工作和个人账户)时,默认的SSH配置可能导致冲突。本文介绍如何通过生成不同的SSH密钥对并配置SSH客户端来管理多个账户。 操作步骤 生成SSH密钥对 为每个GitHub账户生成独立的密钥对,并指…...
蓝耘智算平台使用DeepSeek教程
目录 一.平台架构与技术特点 二、DeepSeek R1模型介绍与优势 DeepSeek R1 模型简介 DeepSeek R1 模型优势 三.蓝耘智算平台使用DeepSeek教程 展望未来 耘元生代智算云是蓝耘科技推出的一款智算云平台有着以下特点: 一.平台架构与技术特点 基于 Kubernetes 原…...
脚本一键生成管理下游k8s集群的kubeconfig
一、场景 1.1 需要管理下游k8s集群的场景。 1.2 不希望使用默认的cluster-admin权限的config. 二、脚本 **重点参数: 2.1 配置变量。 1、有单独namespace的权限和集群只读权限。 2、自签名的CA证书位置要正确。 2.2 如果配置错误,需要重新…...
发布:大彩科技DN系列2.8寸高性价比串口屏发布!
一、产品介绍 该产品是一款2.8寸的工业组态串口屏,采用2.8寸液晶屏,分辨率为240*320,支持电阻触摸、电容触摸、无触摸。可播放动画,带蜂鸣器,默认为RS232通讯电平,用户短接屏幕PCB上J5短接点即可切换为TTL电…...
简述mysql 主从复制原理及其工作过程,配置一主两从并验证
MySQL 主从复制原理及其工作过程 MySQL 主从复制(Master-Slave Replication)是一种数据同步技术,其中一个 MySQL 实例(主库)将其数据变更(插入、更新、删除)通过二进制日志(Binary …...
华北平原shp格式范围
华北平原是中国东部的重要地理区域,以下是对其的简要介绍: 此数据为付费数据,如有需求,请联系本人。 1. 地理位置与范围 位置:位于中国东部,西起太行山脉和伏牛山,东至黄海、渤海,北…...
