手撸词法分析器(C/C++)

手撸词法分析器(C/C++)

  • 一.背景
  • 二.什么是词法分析器?
  • 三.代码
  • 四.思考

一.背景

这学期开设了编译原理,要求写个基本的词法分析器。所以博主就自己写了一份代码,也比较简单基础。

二.什么是词法分析器?

简单来说就是能识别基本的符号(+,-,*,/,),关键词(for ,while,return ,int ),数字等。这么说大家应该有个基本了解,那么我们如何写代码呢,这里有个思维图。

在这里插入图片描述
可以大致将单词分成这几类,然后进行判断即可。

三.代码

#include <stdio.h>
#include <string>
#include < fstream >
#include <iostream>
int scan_word(char* buff);
using namespace std;
char buf[102400] = { 0 };
char key[][20] = {"if","else","for","while","do","return","break","continue",
",",";","{","}","(",")",
"+","-","*","/",
"<","<=","=",">=","< ","*=","/=","+=","-=","++",
"int", "char", "float","double","unsigned char","unsigned int","void",
"main"
};

int main()
{   
	ifstream  fin;
	int i =0,j=0,k=0;
    fin.open("demo.txt", ios::in);
	char temp[20] = { 0 };

	if (!fin.is_open())
	{
		cout << "读取文件失败" << endl;
		return 1;
	}
	while ((buf[i++] = fin.get()) != EOF);
	buf[i] = '\0';

	while (j < i-2)
	{   
		start:
		if (buf[j] == 0x0a || buf[j] == 0x0d || isspace(buf[j]))
		 {
			 j++;
			goto start;
		 }
		//字母
		else if ((buf[j] >= 65 && buf[j] <= 90) || (buf[j] >= 97 && buf[j] <= 122))
		{
			while ((buf[j] >= 65 && buf[j] <= 90) || (buf[j] >= 97 && buf[j] <= 122)|| ((buf[j] >= 48 && buf[j] <= 57))||buf[j]==95)
			{
				temp[k++] = buf[j++];
				
			}	
			 
				temp[k] = '\0';
				k = 0;
				scan_word(temp);
		}
		//数字
		else if ((buf[j] >= 48 && buf[j] <= 57))
		{
			while (buf[j] >= 48 && buf[j] <= 57)
			{
				temp[k++] = buf[j];
				j++;
			}
			if (buf[j] == '.')
			{
				temp[k++] = buf[j];
				j++;
			}
			
			while (buf[j] >= 48 && buf[j] <= 57)
			{
				temp[k++] = buf[j];
				j++;
			}
			temp[k] = '\0';
			k = 0;
			printf("\(51,\"\%s\"\)\n", temp);
			//scan_word(temp);

		}
	 	//其他符号
		else 
		{ 
			if(buf[j]=='>'||buf[j]=='='||buf[j]=='<' || buf[j] == '+'|| buf[j] == '-' || buf[j] == '*'||buf[j] == '/')
		    {
				if (buf[j + 1] == '=')
				{
					temp[0] = buf[j++];
					temp[1] = buf[j++];
					temp[2] = '\0';
				}
				if (buf[j + 1] == '+')
				{
					temp[0] = buf[j++];
					temp[1] = buf[j++];
					temp[2] = '\0';
				}
				else goto end;
		    }
		 
			else
			{  
			end:
				temp[0] = buf[j++];
				temp[1] = '\0';
				
			}
			scan_word(temp);
		}
		
	}

}
int scan_word(char *buff)
{   
	for (int i = 0; i < 31; i++)
	{
		if (strcmp(buff, key[i]) == 0)
		{	
			printf("\(%d,\"\%s\"\)\n",i,buff); 
			return 1;
		}
	}
	
	printf("\(50,\"\%s\"\)\n", buff);
	return 0;
}

四.思考

这只是一个简单的词法分析器,很多功能都不完善,你们也可以自己添加代码改善一下。

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

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

相关文章

实时采样与等效采样与带通采样的介绍和特点和区别

理解实时采样、等效采样和带通采样是理解数字信号处理中的基本概念。在开始深入探讨它们的特点和区别之前&#xff0c;让我们首先对它们进行简要介绍。 实时采样 实时采样&#xff0c;适用对于采样率要求不是很高的情况&#xff0c;实时信号的好处是获得信号可以直接使用&…

十种排序方法

文章目录 前言一、选择排序1. 原理讲解2. 代码示例3. 总结 二、插入排序1.原理讲解2.代码示例3. 总结 三、归并排序1. 原理讲解2. 代码示例3. 总结 四、快速排序1. 原理讲解2. 代码示例 五、堆排序1. 原理讲解2. 代码示例 六、希尔排序1. 原理讲解2. 代码示例 七、冒泡排序1. 原…

CSS3 伪元素与伪类选择器区别、详解与应用实例

伪元素与伪类两者都是通过在选择器后附加一个特定的关键字来定义&#xff0c;遵循相似的语法规则&#xff0c;并在 CSS 规则块中设置相应的样式。伪元素 能够通过 content 属性添加或替换内容。例如&#xff0c;:before 和 :after 可以插入文本、图像或其他生成的内容。伪类 仅…

如何安装MacOS的虚拟机?mac安装虚拟机的步骤 虚拟机安装MacOS VMware Fusion和Parallels Desktop19

要在Mac上运行MacOS的虚拟机&#xff0c;常用的方法是使用虚拟化软件如VMware Fusion或Parallels Desktop。 以下是安装MacOS的虚拟机的主要步骤&#xff1a; 1. 检查系统要求&#xff1a;确定您的Mac硬件和操作系统满足安装要求。您需要一台具备足够性能的Mac&#xff0c;并…

NLP学习(1)-搭建环境

前言 仅记录学习笔记&#xff0c;如有错误欢迎指正。 环境搭建 一、环境软件安装&#xff1a; 1、Anaconda安装&#xff08;一款可以同时创建和管理多个python环境的软件&#xff09; (1) 安装链接&#xff1a; https://blog.csdn.net/m0_61531676/article/details/126290…

04 MySQL --DQL 专题--Union、exists

1. UNION、UNION ALL UNION 关键字的作用&#xff1f; 合并两个或多个 SELECT 语句的结果。发挥的作用与 or 非常相似 UNION关键字生效的前提&#xff1f; 每个 SELECT 语句必须拥有相同数量的列。每个 SELECT 语句中的列的顺序必须相同。列必须拥有相似的数据类型。 SELEC…

ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路

前言 前面的几篇文章讲了很多 JWT 的优点&#xff0c;但作为技术人员都知道&#xff0c;没有一种技术是万能的 “银弹”&#xff0c;所谓有矛就有盾&#xff0c;相比 Session、Cookie 等传统的身份验证方式&#xff0c;JWT 在拥有很多优点的同时&#xff0c;也有着不可忽视的缺…

第二部分 Python提高—GUI图形用户界面编程(五)

事件处理 文章目录 鼠标和键盘事件多种事件绑定方式汇总组件对象的绑定组件类的绑定 一个GUI 应用整个生命周期都处在一个消息循环(event loop) 中。它等待事件的发生&#xff0c;并作出相应的处理。 Tkinter 提供了用以处理相关事件的机制. 处理函数可被绑定给各个控件的各种…

Go 单元测试之Mysql数据库集成测试

文章目录 一、 sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm 初始化注意点 一、 sqlmock介绍 sqlmock 是一个用于测试数据库交互的 Go 模拟库。它可以模拟 SQL 查询、插入、更新等操作&#xff0c;并且可以验证 SQL 语句的执行情况&#xff0c;非常适合用于单元测试…

Java基础 - 10 - IO流(二)

一. IO流 - 字符流 1.1 FileReader&#xff08;文件字符输入流&#xff09; 作用&#xff1a;以内存为基准&#xff0c;可以把文件中的数据以字符的形式读入到内存中去 构造器说明public FileReader(File file)创建字符输入流管道与源文件接通public FileReader(String pathn…

Linux系统编程开发环境搭建

开发环境搭建 桥接网络&#xff08;Bridged Network&#xff09;、网络地址转换&#xff08;NAT, Network Address Translation&#xff09;和主机模式网络&#xff08;Host-only Networking&#xff09; 在虚拟化环境中&#xff0c;常见的三种网络模式是桥接网络&#xff08…

[Linux_IMX6ULL驱动开发]-总线设备驱动模型

目录 框架分层 总线驱动模型实现 上层驱动代码(leddrv.c)的实现以及解析 交叉依赖的避免 下层驱动的设备文件(board_A_led.c)的实现 下层驱动的驱动文件(chip_demo_gpio.c)的实现 框架分层 在之前&#xff0c;我们对于驱动的框架有过两种不同的框架。第一种框架&#xf…

如何爬出 Kotlin 协程死锁的坑?

作者&#xff1a;悬衡 一、前言 在 Java 中有一个非常经典的死锁问题, 就是明明自己已经占用了线程池, 却还继续去申请它, 自己等自己, 就死锁了, 如下图和代码: // 这段代码将死锁到天荒地老final ExecutorService executorService Executors.newSingleThreadExecutor();exe…

科学突破可能开创6G通信新时代

格拉斯哥大学开发的火柴盒大小的天线可以为全息通话、改进自动驾驶和更好的医疗保健的世界铺平道路。 格拉斯哥大学表示&#xff0c;这种创新的无线通信天线将超材料的独特特性与复杂的信号处理相结合&#xff0c;有助于构建未来的 6G 网络。 数字编码动态超表面天线&#xf…

前端请求发送成功,后端收到null

1、dishId为64&#xff0c;有数据 2、但是后端调试接不到数据&#xff0c;为null 3、形参部分缺少RequestBody接收JSON数据&#xff0c;加上即可

Kimichat炒股:7个提示词案例

●了解股票投资基本概念和知识 什么是有息负债率&#xff1f;用浅显明白的话语针对没有财务会计基础的小白进行解释 Kimi的回答&#xff1a; 有息负债率是一个财务指标&#xff0c;用来衡量一家公司在其负债中有多少是需要支付利息的。简单来说&#xff0c;就是公司借的钱中&…

获取公募基金持仓【数据分析系列博文】

摘要 从指定网址获取公募基金持仓数据&#xff0c;快速解析并存储数据。 &#xff08;该博文针对自由学习者获取数据&#xff1b;而在投顾、基金、证券等公司&#xff0c;通常有Wind、聚源、通联等厂商采购的数据&#xff09; 1. 导入必要的库&#xff1a; pandas 用于数据处理…

【第1节】书生·浦语大模型全链路开源开放体系

目录 1 简介2 内容&#xff08;1&#xff09;书生浦语大模型发展历程&#xff08;2&#xff09;体系&#xff08;3&#xff09;亮点&#xff08;4&#xff09;全链路体系构建a.数据b 预训练c 微调d 评测e.模型部署f.agent 智能体 3 相关论文解读4 ref 1 简介 书生浦语 InternLM…

深度Q-Learning在算法交易中的应用

一、说明 在《华尔街的随机漫步》一书中&#xff0c;作者伯顿马尔基尔&#xff08;Burton G. Malkiel&#xff09;声称&#xff1a;“一只蒙着眼睛的猴子向报纸的财经版面投掷飞镖&#xff0c;可以选择一个与专家精心挑选的投资组合一样好的投资组合。 如果我们让巴甫洛夫的狗接…

RabbitMQ-交换机

文章目录 交换机fanoutDirecttopicHeadersRPC 交换机 **交换机 **是消息队列中的一个组件&#xff0c;其作用类似于网络路由器。它负责将我们发送的消息转发到相应的目标&#xff0c;就像快递站将快递发送到对应的站点&#xff0c;或者网络路由器将网络请求转发到相应的服务器…