词法分析器的设计与实现--编译原理操作步骤,1、你的算法工作流程图; 2、你的函数流程图;3,具体代码

实验原理:

词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别时标识符、关键字(保留字)、常数、 运算符 、界符。

词法分析器读取有字符串组成的输入流,并产生包含单词的输出流,每个单词都标记了其语法范畴(syntactic category)或类型,等效于英文单词的词类。为了完成这种聚集和分类操作,词法分析器会应用一组描述输入程序设计语言的词法结构(也称微语法,microsyntax)的规则。程序设计语言的微语法规定了如何将字符组合为单词,以及反过来如何分开混合在一起的各个单词。

操作步骤:

算法工作流程图:

35db928612934abea2216bcbd7b61f36.png

函数流程图:

1713585c0cd54b76bef633166e1bbc70.png

各单词符号对应的种别码2c5f14d14caf45ceb05b5e7803021679.png

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <iostream>
using namespace std;//关键字
string key[11]={"int","float","double","char","main","if","else","while","do","for","return"};
//种别码
int keyNum[11]={27,28,29,30,1,2,3,4,5,6,7};
//运算符和界符
string symbol[17]={"+","-","*","/","%",">",">=","<","<=","==","!=","=",";","(",")","{","}"};
//运算符和界符种别码
int symbolNum[17]={10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26};//从文件取出的字符
string letter[1000];
//将字符转换为单词
string  words[1000];
int length;  //保存程序中字符的长度
int num;//判断是否为关键字,是返回种别码
int isKeyWord(string s){int i;for(i=0;i<11;i++){if(s==key[i])return keyNum[i];}return 0;
}int isSymbol(string s){ //判断运算符和界符int i;for(i=0;i<17;i++){if(s==symbol[i])return symbolNum[i];}return 0;
}//判断是否为数字
bool isNumber(string s){if(s>="0" && s<="9")return true;return false;
}//判断是否为字母
bool isLetter(string s)
{if(s>="a" && s<="z")return true;return false;
}//返回单个字符的类型
int typeword(string str){if(str>="a" && str<="z")   //   字母return 1;if(str>="0" && str<="9")   //数字return 2;if(str==">"||str=="="||str=="<"||str=="!"||str==","||str==";"||str=="("||str==")"||str=="{"||str=="}"||str=="+"||str=="-"||str=="*"||str=="/")   //判断运算符和界符return 3;}string identifier(string s,int n){int j=n+1;int flag=1;while(flag){if(isNumber(letter[j]) || isLetter(letter[j])){s=(s+letter[j]).c_str();if(isKeyWord(s)){j++;num=j;return s;}j++;}else{flag=0;}}num=j;return s;
}string symbolStr(string s,int n){int j=n+1;string str=letter[j];if(str==">"||str=="="||str=="<"||str=="!") {s=(s+letter[j]).c_str();j++;}num=j;return s;
}string Number(string s,int n){int j=n+1;int flag=1;while(flag){if(isNumber(letter[j])){s=(s+letter[j]).c_str();j++;}else{flag=0;}}num=j;return s;
}void print(string s,int n){cout<<"<"<<s<<","<<n<<">"<<endl;
}void recognizeWord(){  //识别单词int k;for(num=0;num<length;){string str,ss;str=letter[num];k=typeword(str);switch(k){case 1:{ss=identifier(str,num);if(isKeyWord(ss))print(ss,isKeyWord(ss));elseprint(ss,8);break;}case 2:{ss=Number(str,num);print(ss,9);break;}case 3:{ss=symbolStr(str,num);print(ss,isSymbol(ss));break;}}}
}int main(){char w;freopen("e:\\11.txt","r",stdin); //控制台输入freopen("e:\\result.txt","w",stdout); //控制台输出length=0;while(cin>>w){if(w!=' '){letter[length]=w;length++;}   //去掉程序中的空格}recognizeWord();fclose(stdin);//关闭文件fclose(stdout);//关闭文件return 0;
}

 输入文件

90cd65647fed4136b00f88777a72c0bc.png输出文件

bd893b09790b430f80783af567dab68b.png

 

 1、实验中出现过的问题或错误分析

1)自己在书写地址过程中总是忘记绝对路径的书写格式;

2)忘记将无用的成分如注释,空格,回车等单独仔细的考虑;

3)开始在多位运算符号的判定出现问题,字符串数组的下标的值未能及时修改;

2、保证实验成功(或程序运行正确)的关键问题

1)在程序编写时,用到了C自带的库函数可以将字符串按照给定的多个一位分割符进行分割,将界符,运算符和其他区分开,便于遍历;

2)在调试程序过程中,调用修改下标函数专门对下标进行修改;

3)对于普通标识符和常量,分别建立标识符表和常量表,当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。

收获及体会

在进行实验之前要先通过自己画出的程序的流程图,一步一步的优化自己的编程流程,可以在自己脑海中形成清晰的框架,确保不会出现一些大的方向上的判断错误,更有利于后续代码的书写以及实验的进行。在程序编写时,学会使用众多C自带的头文件,可以很好地处理输入串并对串进行分割,将界符、运算符和其他区分开,便于遍历。在调试程序过程中,一开始出现空格和换行无法识别的情况,于是就把这种情况单独编写了一个函数进行识别,便于串的后续识别。同时通过这次实验让我对于之前学到的词法分析有了进一步的了解,加深了对于词法分析的步骤的理解与领悟。对于我今后对编译原理的学习有很大的帮助。

(注:代码是之前粘的别的博主的,因为我也不会写,流程图等是自己写的,互相借鉴)

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7配置国内清华源并安装docker-ce以及配置docker加速

说明 由于国内访问国外的网站包括docker网站&#xff0c;由于种种的原因经常打不开&#xff0c;或无法访问&#xff0c;所以替换成国内的软件源和国内镜像就是非常必要的了&#xff0c;这里整理了我安装配置的基本的步骤。 国内的软件源有很多&#xff0c;这里选择清华源作为…

终于来啦!Stable Diffusion 3将在6月12日正式开源

6月3日晚&#xff0c;著名开源大模型平台Stability AI的联合首席执行官Christian Laforte&#xff0c;在AMD的产品发布会上宣布&#xff0c;文生图模型 Stable Diffusion 3将于6月12日在Hugging Face开源权重。 本次开源的是Stable Diffusion 3的Medium模型&#xff0c;有20亿…

Python中数字比较与获取较大值的深入解析

目录 一、引言 二、Python数字类型概述 三、数字比较操作符 四、获取较大值的逻辑与实现 五、高级话题&#xff1a;使用内置函数和库 六、性能分析与优化 七、案例分析 八、总结与展望 一、引言 在编程世界中&#xff0c;数字的比较和获取较大值是基础且常见的操作。P…

Python中上下文管理器解析

文章目录 基本原理上下文管理器的工作原理自定义上下文管理器enter和exitcontextlib 模块 异常处理 Python中的上下文管理器&#xff08;Context Manager&#xff09;是一种用于管理资源的机制&#xff0c;特别是在文件操作、数据库连接和锁定等场景中非常有用。上下文管理器通…

SpringBoot中MyBatisPlus的使用

MyBatis Plus 是 MyBatis 的增强工具&#xff0c;提供了许多强大的功能&#xff0c;简化了 MyBatis 的使用。下面是在 Spring Boot 中使用 MyBatis Plus 的步骤&#xff1a; 添加依赖&#xff1a;在 Maven 或 Gradle 的配置文件中添加 MyBatis Plus 的依赖。 配置数据源&#…

Linux【安全 02】OpenSSH漏洞修复(离线升级最新版本流程)网盘分享3个安装包+26个离线依赖

OpenSSH离线升级最新版本流程 1. 漏洞信息2. 环境说明3.依赖安装3.1 在线安装3.2 离线安装 4.备份卸载4.1 备份4.2 卸载旧版本 5.安装5.1 zlib5.2 ssl5.3 openssh5.3.1 安装5.3.2 配置 6.脚本整理7.文件资源 本文仅针对CentOS7.8版本&#xff0c;其他版本未测试&#xff0c;安装…

Excel单元格格式无法修改的原因与解决方法

Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法&#xff1a; 单元格或工作表被保护&#xff1a; 如果单元格或工作表被设置为只读或保护状态&#xff0c;您将无法更改其中的格式。解决方法&#xff1a;取消单元格或工作表的保护。在Excel中…

Hadoop伪分布式安装教程

Hadoop伪分布式安装教程 一、安装背景1.1 软件列表1.2 系统软件列表 二、安装Hadoop2.1 安装 Java 环境2.1.1 前期准备2.1.2 文件传输2.1.3 解压文件2.1.4 配置 jdk 的环境变量2.1.5 输入 java、javac、java -version 命令检验 jdk 是否安装成功 2.2 Hadoop 下载地址[hadoop](h…

一些关于深度聚类以及部分对比学习的论文阅读笔记

目录 资料SwAV问题方法方法的创新点为什么有效有什么可以借鉴的地方聚类Multi-crop 代码 PCL代码 Feature Alignment and Uniformity for Test Time Adaptation代码 SimSiam 资料 深度聚类算法研究综述(很赞&#xff0c;从聚类方法和深度学习方法两个方面进行了总结&#xff0…

基于聚类和回归分析方法探究蓝莓产量影响因素与预测模型研究附录

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 目录 背景数据说明数据来源思考 附录数据预处理导入包以及数据读取数据预览数据处理 相关性分析聚类分析数据处理确定聚类数建立k均值聚类模型 …

《面试笔记》——MySQL终结篇30

三大范式&#xff1f; 第一范式&#xff1a;字段具有原子性&#xff0c;不可再分&#xff08;字段单一职责&#xff09; 第二范式&#xff1a;满足第一范式&#xff0c;每行应该被唯一区分&#xff0c;加一列存放每行的唯一标识符&#xff0c;称为主键&#xff08;都要依赖主…

【Linux】深入解析动静态库:原理、制作、使用与动态链接机制

文章目录 前言&#xff1a;1. 什么是动静态库2. 动静态库的制作和使用3. 动态库的查找问题4. 理解动态库的加载4.1. 站在系统的角度理解4.2. 编址、可执行程序4.3. 动态库动态链接和加载问题 总结&#xff1a; 前言&#xff1a; 在软件开发中&#xff0c;动静态库是两种重要的…

【miniconda】安装miniconda

☆ 问题描述 ubuntu环境下安装miniconda ★ 解决方案 ubuntu环境下安装miniconda 下载miniconda 包 miniconda官网地址&#xff1a;https://docs.conda.io/en/latest/miniconda.html 清华大学镜像地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/minicon…

Arduino ESP8266模块TFT液晶屏

ESP8266模块 模块实物图&#xff1a; 模块引脚定义&#xff1a; 工作模式选择&#xff1a; FlashBoot启动模式&#xff1a; GPIO15接GND UART固件下载模式: GPIO15接GND&#xff0c; GPIO0接GND 调试串口&#xff1a; URXD/UTXD 可用来下载固件和调试信息输出 模块使能&…

天润融通携手好丽友,打造食品零售行业智能客服新标杆

AI大模型&#xff0c;如何给食品零售行业的客服服务带来质变&#xff1f; 在很多人印象中&#xff0c;食品零售行业是不需要客户服务的。 因为绝大多数食品都是通过经销商、零售商、商场这样的渠道进行销售。所以在食品零售行业&#xff0c;一直都有一句话&#xff0c;叫“渠…

Mac终端operation not permitted问题、禁用和启用SIP(系统完整性保护)

Mac终端operation not permitted问题、禁用和启用SIP&#xff08;系统完整性保护&#xff09; 注意&#xff1a; 仅在必要时临时禁用SIP&#xff0c;并尽快重新启用它。在测试完成后不重新启用SIP将使您的计算机容易受到恶意代码的攻击 文章目录 Mac终端operation not permitt…

Spring Boot发送邮件时如何支持定时功能?

如何使用Spring Boot结合AokSend以实现高效邮件发送&#xff1f; 如何高效地进行sendmail发送邮件并支持定时功能是一个值得探讨的问题。本文将详细介绍如何在Spring Boot中实现定时sendmail发送邮件&#xff0c;并结合AokSend工具实现高效邮件发送。 Spring Boot发送邮件&am…

Java程序策——Java连接数据库保姆级教程(超详细步骤)

【Java程序策】——连接数据库 目录 ​编辑 一&#xff1a;在数据库中建立一个表&#xff08;student表&#xff09; 1.1&#xff1a;进入mysql 1.2&#xff1a;建立一个“数据库成员” 1.3&#xff1a;建立一个表&#xff08;student表&#xff09; 1.4&#xff1a;给表…

【代码随想录】【算法训练营】【第25天】 [216]组合总和III [17] 电话号码的字母组合

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 25&#xff0c;周六&#xff0c;坚持有点困难~ 题目详情 [216] 组合总和III 题目描述 216 组合总和III 解题思路 前提&#xff1a;组合子集问题 思路&#xff1a;回溯算法&#xff0c;剪枝…

【vscode篇】1-VScode设置语言为中文,2-解决中文注释乱码问题。

设置语言为中文 在前端开发中&#xff0c;Visual Studio Code(简称vscode)是一个非常好用的工具&#xff0c;但第一次打开vscode会发现界面为英文&#xff0c;这对很多开发者来说会很不友好&#xff08;比如我&#xff09;&#xff0c;把界面设置成中文只需要安装一个插件即可&…