初探词法分析实验

news2024/11/25 14:35:27

本次实验使用C++对编译过程中的分词进行初步探究,以下是实验代码,输入文件需要在main函数中自己填写文本所在地址

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include<string>
#define M 20 
using namespace std;
string keyword[9] = { "main","if","int","for","while","do","return","break","continue" };
char arithmetic[4] = { '+','-','*','/' }; 
char relation[6] = { '=','>','<','>=','<=','!=' };
char border[6] = { ';',',','{','}','(',')' };

bool IsKeyword(string word) {
	for (int i = 0; i < 9; i++) {
		if (keyword[i] == word) {
			return true;
		}
	}
	return false;
}

bool IsArithmetic(char ch) {
	for (int i = 0; i < 4; i++) {
		if (arithmetic[i] == ch) {
			return true;
		}
	}
	return false;
}

bool IsRelation(char ch) {
	for (int i = 0; i < 6; i++) {
		if (relation[i] == ch) {
			return true;
		}
	}
	return false;
}

bool IsBorder(char ch) {
	for (int i = 0; i < 6; i++) {
		if (border[i] == ch) {
			return true;
		}
	}
	return false;
}

bool IsLetter(char ch) {
	if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') return true;
	return false;
}

bool IsDigit(char ch) {
	if (ch >= '0' && ch <= '9') return true;
	return false;
}

char DigitProcess(char ch, FILE* fp)
{
	int i = -1;
	char digit[M];
	while ((IsDigit(ch)))
	{
		digit[++i] = ch;
		ch = fgetc(fp);
	}
	digit[i + 1] = '\0';
	cout << "(3 , " << digit << " )" << "  常数" << endl;
	return(ch);
}

char AlphaProcess(char ch, FILE* fp)
{
	int i = -1;
	char alpha[M];
	while (IsLetter(ch) || (IsDigit(ch)))
	{
		alpha[++i] = ch;
		ch = fgetc(fp);
	}
	alpha[i + 1] = '\0';
	if (IsKeyword(alpha))
		cout << "(1 , " << alpha << " )" << "  关键字" << endl;
	else
		cout << "(2 , " << alpha << " )" << "  标识符" << endl;

	return(ch);
}

char OtherProcess(char ch, FILE* fp)
{
	int i = -1;
	char othertp[M];
	othertp[0] = ch;
	othertp[1] = '\0';
	if (IsArithmetic(ch))
	{
		cout << "(4 , " << othertp << " )" << "  运算符" << endl;
		ch = fgetc(fp);
	}
	if (IsRelation(ch))
	{
		ch = fgetc(fp);
		othertp[1] = ch;
		othertp[2] = '\0';
		if (IsRelation(ch))
			cout << "(4 , " << othertp << " )" << "  运算符" << endl;
		else
		{
			othertp[1] = '\0';
			cout << "(4 , " << othertp << " )" << "  运算符" << endl;
		}
	}
	if (IsBorder(ch))
	{
		cout << "(5 , " << othertp << " )" << "  分隔符" << endl;
		ch = fgetc(fp);
	}
	ch = fgetc(fp);
	return(ch);
}
int main()
{
	char ch;
	FILE* fp;
	if (fopen_s(&fp, "E:\\编译原理\\code\\main( ).txt", "r") != NULL) 
		cout << " 文件不存在 " << endl;
	else
	{
		ch = fgetc(fp);
		while (ch != EOF) 
		{
			if (IsLetter(ch)) 
				ch = AlphaProcess(ch, fp);
			else if (IsDigit(ch)) 
				ch = DigitProcess(ch, fp);
			else
				ch = OtherProcess(ch, fp);
		}
		cout << "end" << endl;
		getchar();
	}
	return 0;
}

运行截图:
在这里插入图片描述

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

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

相关文章

核心实验15_端口安全_ENSP

项目场景&#xff1a; 核心实验15_端口安全_ENSP 可指定该接口下最多接入几个设备&#xff08;通过mac绑定实现&#xff09;&#xff0c;人为增加设备时可设置接口自动down掉等&#xff0c;详见补充 实搭拓扑图&#xff1a; 具体操作&#xff1a; sw1: [Huawei]int g0/0/1 [H…

编辑视频无需第三方软件,在iPhone上也可以轻松编辑视频

如果你学会了如何在iPhone上编辑视频,你可以在很大程度上把匆忙拍摄的视频变成适合好莱坞的视频。好吧,也许这有点夸张了,但至少,你可以通过使用照片应用程序中的编辑工具,让你的视频看起来更令人印象深刻。 虽然它不一定能与最好的视频编辑软件相匹配,但它仍然非常适合…

MySQL 8.0 新密码策略的细节补充

前情提要 MySQL 8.0 截⽌到⽬前已经发布到了 8.0.34 版本&#xff0c;经过一系列的版本更新&#xff0c;对于密码方面也做了较多的加强⼯作&#xff0c;这⾥我们不再过多介绍 MySQL 8.0 对于密码功能的加强&#xff0c;相关的介绍可以移步先前公众号的⽂章&#xff0c;这⾥给到…

Pytorch 多卡并行(3)—— 使用 DDP 加速 minGPT 训练

前文 并行原理简介和 DDP 并行实践 和 使用 torchrun 进行容错处理 在简单的随机数据上演示了使用 DDP 并行加速训练的方法&#xff0c;本文考虑一个更加复杂的 GPT 类模型&#xff0c;说明如何进行 DDP 并行实战MinGPT 是 GPT 模型的一个流行的开源 PyTorch 复现项目&#xff…

paddleocr关闭log日志打印输出

问题背景 问题分析 可以看到paddleocr输出logging主要有两种&#xff0c;DEBUG和WARNING&#xff0c;因此关闭这两种打印日志即可。 解决方法 import logginglogging.disable(logging.DEBUG) # 关闭DEBUG日志的打印 logging.disable(logging.WARNING) # 关闭WARNING日志的…

Python二分查找详解

在计算机科学中&#xff0c;二分查找算法&#xff08;英语&#xff1a;binary search algorithm&#xff09;&#xff0c;也称折半搜索算法&#xff08;英语&#xff1a;half-interval search algorithm&#xff09;、对数搜索算法&#xff08;英语&#xff1a;logarithmic sea…

Pyinstaller打包EXE时添加版本信息、作者信息并在运行时读取外部配置文件

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

亚马逊气候友好认证

“气候友好承诺认证”是亚马逊推出的Climate Pledge Friendly新环保计划。目的是帮助有环境意识、注重绿能的买家更好地找到带认证产品&#xff0c;品牌可以通过确保在亚马逊上销售的产品至少在可持续发展的一个方面得到认证&#xff0c;来参与并为他们的产品获得一个气候友好承…

ORA-32771 cannot add file to bigfile tablespace

ORA-32771 cannot add file to bigfile tablespace 扩容表空间报错 原因 oracle中有两种表空间类型BIGFILE 大文件表空间&#xff1a;只能包含1个大文件(最大尺寸为128 TB) SMALLFILE 小文件表空间&#xff1a;可包含多个数据文件(默认)表空间在创建的时候就会确定好&#xf…

OpenCV(三十八):二维码检测

1.二维码识别原理 功能图形&#xff1a; 位置探测图形&#xff1a;通常&#xff0c;二维码中有三个位置探测图形&#xff0c;呈现L型或大角度十字架形状&#xff0c;分布在二维码的三个角上&#xff0c;用于帮助扫描设备定位二维码的位置和方向。 位置探测图形分隔符&#xf…

2023工博会,正运动机器视觉运动控制一体机应用预览(二)

展会倒计时&#xff1a;7天 本次的中国国际工业博览会正运动技术将携高性能x86平台Windows实时视觉运动控制器VPLC711亮相。 •运动控制机器视觉一站式开发&#xff0c;缩短开发周期&#xff0c;降低硬件成本&#xff1b; •可替代传统的工控机运动控制卡/PLC视觉软件的自动化…

Fultter学习日志(2)-构建第一个flutter应用

依照上一篇中我们新建的flutter应用 让我们更改pubspec.yaml中的内容为 name: namer_app description: A new Flutter project.publish_to: none # Remove this line if you wish to publish to pub.devversion: 0.0.11environment:sdk: >2.19.4 <4.0.0dependencies:fl…

SpringBoot整合Easy-ES实现对ES操作

请确保已有可用的ES&#xff0c;若没有&#xff0c;请移步&#xff1a;Docker安装部署ElasticSearch&#xff08;ES&#xff09; 新建SpringBoot项目 这里是用的springboot版本是2.6.0 引入依赖 <!-- 排除springboot中内置的es依赖,以防和easy-es中的依赖冲突--><…

0基础学习VR全景平台篇 第99篇:百度地图如何上传全景图

蛙色平台现已打通VR全景入驻百度地图全流程&#xff0c;百度全景分为免费版和付费版两种&#xff0c;其中付费支持配置作品音乐、场景漫游热点、联系电话、描述信息。 百度地图上传案例 免费版 付费版 一、百度地图上传流程 1、进入蛙色VR账号后台 &#xff08;1&#xff…

Fiddler抓取HTTPS 详解

对于想抓取HTTPS的测试初学者来说&#xff0c;常用的工具就是fiddler。 但是初学时&#xff0c;大家对于fiddler如何抓取HTTPS难免走歪路&#xff0c;也许你一步步按着网上的帖子成功了&#xff0c;这自然是极好的。 但也有可能没那么幸运&#xff0c;这时候你就会很抓狂。 …

华为云云服务器云耀L实例评测 | 华为云云服务器实例新品全面解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

分享一下在微信商城上怎么可以快速实现分销功能

微信商城上的分销功能是一种吸引更多用户和提升销售的方式&#xff0c;通过搭建一个以分销为主的平台&#xff0c;商家可以借助用户的力量来推广自己的产品或服务。下面将介绍在微信商城上如何实现分销功能&#xff0c;包括分销模式的选择、开发流程和推广方法。 一、选择适合的…

BUG定位分析方法

作为测试人员&#xff0c;接触最多的就是bug&#xff0c;怎样才能体现出测试人的专业性&#xff1f;能够精准的定位并分析bug一定是你的加分项。 在什么地方干了什么产生了什么结果&#xff0c;和期望的结果不一致&#xff0c;那么这就是一个bug。人人都能找出bug&#xff0c;…

【SpringMVC】JSR 303与拦截器注释使用

目录 一、JSR 303 1.1 JSR 303介绍 1.2 为什么要使用JSR-303 1.3 常用注解 1.4 使用示例 1.4.1 导入JSR303依赖 1.4.2 配置校验规则 1.4.3 编写方法校验 1.4.4 编写前端 1.4.5 测试 ​编辑 1.5 Validated与Valid区别 二、拦截器&#xff08;interceptor&#xff09…

SpringBoot2.0入门(详细文档)

文章目录 Springboot是什么Springboot2.x依赖环境和版本新特性说明为什么学习Springboot从springboot优点来看从未来发展的趋势来看 开发环境Spring Boot开发环境搭建和项目启动jdk 的配置Spring Boot 工程的构建maven配置IDEA 快速构建maven 创建工程常用注解 完整代码 Spring…