编译原理--词法分析C++

news2024/11/25 11:54:27

一、实验项目要求

1.实验目的

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)

2.实验要求

识别保留字:if、int、for、while、do、return、break、continue,等C语言的保留字;单词种别码为1。

其他的都识别为标识符;单词种别码为2。

常数为无符号整形数;单词种别码为3。

运算符包括:+、-、*、/、=、>、<、>=、<=、!= ;单词种别码为4。

分隔符包括:,、;、{、}、(、)、[、]; 单词种别码为5。

二、理论分析或算法分析

在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。

0.定义部分:定义常量、变量、数据结构。

1.初始化:从文件将源程序全部输入到字符缓冲区中。

2.取单词前:去掉多余空白。

3.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)

4.显示结果。

三.实现方法

程序流程图如图所示:

四.实验结果分析

实验结果图

遇到的问题

(1)当第一次将代码写进去之后,出现如图所示的错误。

(2)一直找不到example.txt文件,一直出现那个error;

解决办法

(1)将Test1的属性下的C/C++下面的语言的符合模式改为“否”即可。

(2)在目录下导入并且在自建目录下导入,就可以解决这个问题。

在这次实验中,对之前学到的词法分析有了进一步的了解,加深了对于词法分析的步骤的理解与领悟,对于今后对编译原理的学习有很大的帮助。,刚开始把已有代码导入的时候,各种错误,然后就在网上一个一个搜索直到解决问题,在同学的帮助下,顺利的把代码问题搞对。

五、代码

#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define NULL 0
#pragma warning(disable:4996)

FILE *fp;
char cbuffer;
char *key[32] = { "if","else","for","break","continue","int","float","double","auto","case","char","const","default","do","enum","long","extern","goto","register","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while" };
char *border[8] = { ",",";","{","}","(",")","[","]" };
char *arithmetic[4] = { "+","-","*","/" };
char *relation[6] = { "<","<=","=",">",">=","<>" };
char *consts[20];
char *label[20];
int constnum = 0, labelnum = 0;
int search(char searchchar[], int wordtype)
{
	int i = 0;
	switch (wordtype)
	{
	case 1:for (i = 0; i <= 31; i++)
	{
		if (strcmp(key[i], searchchar) == 0)
			return(i + 1);
	}
		   return 0;
	case 2:
	{
		for (i = 0; i <= 7; i++)
		{
			if (strcmp(border[i], searchchar) == 0)
				return(i + 1);
		}
		return(0);
	}

	case 3:
	{
		for (i = 0; i <= 3; i++)
		{
			if (strcmp(arithmetic[i], searchchar) == 0)
			{
				return(i + 1);
			}
		}
		return(0);
	}
	case 4:
	{
		for (i = 0; i <= 5; i++)
			if (strcmp(relation[i], searchchar) == 0)
				return(i + 1);
		return(0);
	}
	case 5:
	{
		for (i = 0; i <= constnum; i++)
		{
			if (consts[i] && (strcmp(consts[i], searchchar) == 0))
				return(i + 1);
		}
		consts[i - 1] = (char *)malloc(sizeof(searchchar));
		strcpy(consts[i - 1], searchchar);
		constnum++;
		return(i);
	}
	case 6:
	{
		for (i = 0; i <= labelnum; i++)
			if (label[i] && (strcmp(label[i], searchchar) == 0))
				return(i + 1);
		label[i - 1] = (char *)malloc(sizeof(searchchar));
		strcpy(label[i - 1], searchchar);
		labelnum++;
		return(i);
	}
	default: return 0;
	}
}
char alphaprocess(char buffer)
{
	//	int atype;
	int i = -1;
	char alphatp[20];
	while ((isalpha(buffer)) || (isdigit(buffer)))
	{
		alphatp[++i] = buffer;
		buffer = fgetc(fp);
	}
	alphatp[i + 1] = '\0';
	if (/*atype=*/search(alphatp, 1))
		//		printf("%s (1,%d)\n",alphatp,atype-1);
		printf("(1,  \"%s\")\n", alphatp);
	else
	{
		search(alphatp, 6);
		//		printf("%s (6,%d)\n",alphatp,atype-1);
		printf("(2,  \"%s\")\n", alphatp);
	}
	return(buffer);
}

char digitprocess(char buffer)
{
	int i = -1;
	char digittp[20];
	//	int dtype;
	while ((isdigit(buffer)))
	{
		digittp[++i] = buffer;
		buffer = fgetc(fp);
	}
	digittp[i + 1] = '\0';
	search(digittp, 5);
	//	printf("%s (5,%d)\n",digittp,dtype-1);
	printf("(3,  \"%s\")\n", digittp);
	return(buffer);
}

char otherprocess(char buffer)
{
	int i = -1;
	char othertp[20];
	//	int otype,otypetp;
	othertp[0] = buffer;
	othertp[1] = '\0';
	if (/*otype=*/search(othertp, 3))
	{
		//		printf("%s (3,%d)\n",othertp,otype-1);
		printf("(4,  \"%s\")\n", othertp);
		buffer = fgetc(fp);
		goto out;
	}
	if (/*otype=*/search(othertp, 4))
	{
		buffer = fgetc(fp);
		othertp[1] = buffer;
		othertp[2] = '\0';
		if (/*otypetp=*/search(othertp, 4))
		{
			//		printf("%s (4,%d)\n",othertp,otypetp-1);
			printf("(4,  \"%s\")\n", othertp);
			goto out;
		}
		else
			othertp[1] = '\0';
		//		printf("%s (4,%d)\n",othertp,otype-1);
		printf("(4,  \"%s\")\n", othertp);
		goto out;
	}
	if (buffer == ':')
	{
		buffer = fgetc(fp);
		if (buffer == '=')
			printf(":= (2,2)\n");
		buffer = fgetc(fp);
		goto out;
	}
	else
	{
		if (/*otype=*/search(othertp, 2))
		{
			//			 printf("%s (2,%d)\n",othertp,otype-1);
			printf("(5,  \"%s\")\n", othertp);
			buffer = fgetc(fp);
			goto out;
		}
	}
	if ((buffer != '\n') && (buffer != ' '))
		printf("%c error,not a word\n", buffer);
	buffer = fgetc(fp);


out:      return(buffer);
}

void main()
{
	int i;

	for (i = 0; i <= 20; i++)
	{
		label[i] = NULL;
		consts[i] = NULL;
	}
	if ((fp = fopen("example.txt", "r")) == NULL)
		printf("error");
	else
	{
		cbuffer = fgetc(fp);
		while (cbuffer != EOF)
		{
			if (isalpha(cbuffer))
				cbuffer = alphaprocess(cbuffer);
			else if (isdigit(cbuffer))
				cbuffer = digitprocess(cbuffer);
			else cbuffer = otherprocess(cbuffer);
		}
		printf("over\n");
		getchar();
	}
}

example.txt

#inlclude<stdio.h>
int main()
{
int b, a, c;
a = 10;
c=a+b;
printf("%d%d",a,b);;
return 0;
}

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

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

相关文章

XUbuntu22.04之跨平台容器格式工具:MKVToolNix(二百零三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

29.Java程序设计-基于Springboot的幼儿园管理系统的设计与实现

1. 引言 背景介绍&#xff1a;幼儿园管理系统的必要性和重要性。研究目的&#xff1a;设计一个基于Spring Boot的系统以优化幼儿园管理流程。论文结构概览。 2. 需求分析 用户需求&#xff1a;不同用户&#xff08;管理员、老师、家长&#xff09;的需求分析。功能需求&…

多次触发FastJson漏洞的AutoType机制,你了解吗?

一个反序列化问题 在一次日志巡检过程中&#xff0c;发现线上业务出现报错。线上业务场景是&#xff1a;调用三方restful接口&#xff0c;根据接口返回json字符串内容&#xff0c;进行反序列化处理&#xff0c;业务中使用的json处理工具是FastJson(v1.2.71)。 报错是使用fast…

【Linux系统编程二十三】:(信号2)--信号的保存

【Linux系统编程二十三】&#xff1a;信号的保存 一.信号的保存1.阻塞信号2.sigset_t类型(位图)3.block表4.handler表5.pending表 二.实验验证三.信号的其他概念 一.信号的保存 信号发送本质上是操作系统发送信号&#xff0c;而进程PCB内部有一个位图用来表示是否接收到信号。…

T-Dongle-S3开发笔记——创建工程

创建Hello world工程 打开命令面板 方法1&#xff1a;查看->命令面板 方法2&#xff1a;按F1 选择ESP-IDF:展示示例项目 创建helloworld 选择串口 选择芯片 至此可以编译下载运行了 运行后打印的信息显示flash只有2M。但是板子上电flash是W25Q32 4MB的吗 16M-bit

高级RGA(二):父文档检索器

在我之前写的<<使用langchain与你自己的数据对话>>系列博客中&#xff0c;我们介绍了利用大型语言模型LLM来检索文档时的过程和步骤&#xff0c;如下图所示&#xff1a; 我们在检索文档之前&#xff0c;通常需要对文档进行切割&#xff0c;然后将其存入向量数据库如…

用友时空KSOA UploadImage任意文件上传漏洞

漏洞描述 用友时空 KSOA 是根据流通企业前沿的IT需求推出的统的IT基础架构&#xff0c;它可以让流通企业各个时期建立的 IT 系统之间彼此轻松对话。由于用友时空设备开放了文件上传功能&#xff0c;但未鉴权且上传的文件类型、大小、格式、路径等方面进行严格的限制和过滤&…

企业知识库在跨地域团队协作中的价值

随着全球化进程的不断加速&#xff0c;越来越多的企业开始面临跨地域协作的挑战。在这种背景下&#xff0c;企业知识库作为一种重要的知识管理工具&#xff0c;对于提高团队协作效率、促进知识共享与创新具有不可替代的价值。接下来就说一下知识库在跨地域团队协作中的重要性及…

JVM简单学习

jvm与字节码 jvm只需关注字节码文件 jvm由哪些部分构成 1.类加载子系统&#xff0c;将磁盘中的字节码文件加载到方法区的内存空间中 类加载器分两种&#xff1a;引导类加载器是jvm底层中用C和C语言写的 各个默认的类加载器的不同区别在于 各自默认负责要加载的类的目录不一…

web前端游戏项目-辨色大比拼【附源码】

web前端游戏项目-辨色大比拼【附源码】 《辨色大比拼》是一个旨在测试和提升玩家颜色识别能力的在线游戏。在游戏中&#xff0c;玩家将通过辨识颜色来解谜并推进游戏进程。辨色大比拼也是一个寓教于乐的游戏&#xff0c;它不仅提供了一个有趣的辨色挑战&#xff0c;还能帮助玩…

通过 Higress Wasm 插件 3 倍性能实现 Spring-cloud-gateway 功能

作者&#xff1a;韦鑫&#xff0c;Higress Committer&#xff0c;来自南京航空航天大学分布式系统实验室 导读&#xff1a;本文将和大家一同回顾 Spring Cloud Gateway 是如何满足 HTTP 请求/响应转换需求场景的&#xff0c;并为大家介绍在这种场景下使用 Higress 云原生网关的…

【Linux】Linux常见指令解析上

目录 1. 前言2. ls指令3. pwd指令4. cd指令3.1 cd常见快捷指令 4. touch指令5. mkdir指令6. rmdir指令 && rm指令 &#xff08;重要&#xff09;6.1 rmdir指令6.2 rm指令 7. man指令 1. 前言 这篇文章我们将详细介绍一下Linux下常见的基本指令。 2. ls指令 语法: ls [选…

掌握函数式组件:迈向现代化前端开发的关键步骤(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

精通推荐算法1:为什么需要推荐系统(系列文章,建议收藏)

作者简介&#xff1a; 腾讯算法研究员。硕士毕业于中国科学院大学。在阿里和腾讯工作多年&#xff0c;拥有丰富的搜索和推荐算法经验。CSDN博客专家&#xff0c;原创文章100篇。发表专利15个&#xff0c;其中已授权6个。 1 概述 随着互联网的大力发展&#xff0c;用户规模和…

操作无法完成(错误 0x000006ba),Windows 11 PDF打印机无法使用解决办法

操作无法完成(错误 0x000006ba)&#xff0c;Windows 11 PDF打印机无法使用解决办法 解决方式一 先重启一次电脑&#xff0c;看看是否可以解决问题。 解决方式二 重新启动 Printer Spooler 服务

降本后如何有效增效

在当今竞争激烈的商业环境中&#xff0c;“勒紧裤腰带”式的求生存谋发展&#xff0c;已成为更多成长型企业常态化的战略方向之一了。然而&#xff0c;如何在有限的资源成本下释放更多的效能&#xff1f;降本策略是否会影响组织活力造成得不偿失的结果&#xff1f;如果降本之后…

Maya python清除命名空间

问题描述&#xff1a; Maya命名空间可能存在嵌套。 如上&#xff0c;直接删除 :female_actor02会出现异常。 因此需要先删除子命名空间&#xff0c;再删除父命名空间。 解决方法&#xff1a; def remove_namespace_node(namespace_name, ns_parent":"):""…

解决虚拟机卡顿、卡死、待机后不动的情况(真实有效

本人环境&#xff1a; VM workstation 17.5 ubuntu 22.04 虚拟机配置&#xff1a;4核 4g issue&#xff1a; 出现开机卡死不动运行一段时间&#xff0c;可能半小时不到&#xff0c;就页面卡死不动经常需要关机重启才解决&#xff0c;可能没有解决 1.配置虚拟化引擎 这一步我称…

旅游品牌网站搭建的作用是什么

我国旅游业规模非常高&#xff0c;各地大小旅游景区也是非常多&#xff0c;尤其节假日更是可以达到峰值&#xff0c;无论周边游还是外地游对所要去的景区&#xff0c;消费者总是需要来回了解很多&#xff0c;浏览器查或旅行社咨询等。 对旅游企业而言&#xff0c;传统线下方式…

css 实现满屏升空的气球动画

最终实现效果 demo放在最后了。。。。 问题一 怎么实现满屏气球&#xff1f;简单理解就是多个气球的合并&#xff0c;难道要写多个盒子吗&#xff1f;确实是这样子&#xff0c;但可以有更好的办法&#xff0c;其实就是通过原生操作多个盒子生成&#xff0c;所以只需要实现一个…