词法分析器的设计与实现--编译原理操作步骤,1、你的算法工作流程图; 2、你的函数流程图;3,具体代码
实验原理:
词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别时标识符、关键字(保留字)、常数、 运算符 、界符。
词法分析器读取有字符串组成的输入流,并产生包含单词的输出流,每个单词都标记了其语法范畴(syntactic category)或类型,等效于英文单词的词类。为了完成这种聚集和分类操作,词法分析器会应用一组描述输入程序设计语言的词法结构(也称微语法,microsyntax)的规则。程序设计语言的微语法规定了如何将字符组合为单词,以及反过来如何分开混合在一起的各个单词。
操作步骤:
算法工作流程图:

函数流程图:

各单词符号对应的种别码
#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;
}
输入文件
输出文件

1、实验中出现过的问题或错误分析
1)自己在书写地址过程中总是忘记绝对路径的书写格式;
2)忘记将无用的成分如注释,空格,回车等单独仔细的考虑;
3)开始在多位运算符号的判定出现问题,字符串数组的下标的值未能及时修改;
2、保证实验成功(或程序运行正确)的关键问题
1)在程序编写时,用到了C自带的库函数可以将字符串按照给定的多个一位分割符进行分割,将界符,运算符和其他区分开,便于遍历;
2)在调试程序过程中,调用修改下标函数专门对下标进行修改;
3)对于普通标识符和常量,分别建立标识符表和常量表,当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。
收获及体会
在进行实验之前要先通过自己画出的程序的流程图,一步一步的优化自己的编程流程,可以在自己脑海中形成清晰的框架,确保不会出现一些大的方向上的判断错误,更有利于后续代码的书写以及实验的进行。在程序编写时,学会使用众多C自带的头文件,可以很好地处理输入串并对串进行分割,将界符、运算符和其他区分开,便于遍历。在调试程序过程中,一开始出现空格和换行无法识别的情况,于是就把这种情况单独编写了一个函数进行识别,便于串的后续识别。同时通过这次实验让我对于之前学到的词法分析有了进一步的了解,加深了对于词法分析的步骤的理解与领悟。对于我今后对编译原理的学习有很大的帮助。
(注:代码是之前粘的别的博主的,因为我也不会写,流程图等是自己写的,互相借鉴)
相关文章:
词法分析器的设计与实现--编译原理操作步骤,1、你的算法工作流程图; 2、你的函数流程图;3,具体代码
实验原理: 词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别时标识符、关键字(保留字&a…...
linux查看磁盘类型命令
在Linux中,有多种方法可以查看磁盘是固态硬盘(SSD)还是机械硬盘(HDD)。以下是一些常用的方法: 查看/sys/block/目录 /sys/block/目录包含了系统中所有块设备的信息。你可以查看这个目录中的设备属性来判断…...
多线程调用同一个不包含可变状态,并且是线程安全的方法时,可同时执行,不必等待排队
多线程调用同一个不包含可变状态,并且是线程安全的方法时,可同时执行,不必等待排队 前言同时执行方法的条件示例并发执行的优势实验验证总结 前言 如果方法不包含可变状态,并且是线程安全的,那么在高并发环境下&#…...
Java文件操作①——XML文件的读取
系列文章目录 文章目录 系列文章目录前言一、邂逅XML二、应用 DOM 方式解析 XML三、应用 SAX 方式解析 XML四、应用 DOM4J 及 JDOM 方式解析 XMLJDOM 方式解析 XMLDOM4J 方式解析 XML前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…...
【记录】网络|没有路由器没有网线,分别使用手机或Windows电脑共享网络给ARM64开发板,应急连接
事情是这样的,我的开发板明明已经选择了记住热点 WiFi 密码,但是却没有在开机的时候自动连接,我又没有放显示器在身边,又不想为了这点事去找个显示器来,就非常难受。 我手边有的设备是: 笔记本电脑&#…...
一键设置常用纸张和页面边距-Word插件-大珩助手
Word大珩助手是一款功能丰富的Office Word插件,旨在提高用户在处理文档时的效率。它具有多种实用的功能,能够帮助用户轻松修改、优化和管理Word文件,从而打造出专业而精美的文档。 【新功能】常用纸张和常用边距 1、一键设定符合中国人常用…...
在树莓派3B+中下载opencv(遇到的各种问题及解决)
目录 前言 1、删除原版本下新版本 2、python虚拟环境 3、python版本共存换链接——给版本降低 4、烧录之前版本的文件(在清华源中可以找,不用官网的烧录文件就行; 比如:(balenaEtcher)重新烧录有问题…...
精准检测,安全无忧:安全阀检测实践指南
安全阀作为一种重要的安全装置,在各类工业系统和设备中发挥着举足轻重的作用。 它通过自动控制内部压力,有效防止因压力过高而引发的设备损坏和事故风险,因此,对安全阀进行定期检测,确保其性能完好、工作可靠…...
Transformer系列:图文详解KV-Cache,解码器推理加速优化
前言 KV-Cache是一种加速Transformer推理的策略,几乎所有自回归模型都内置了KV-Cache,理解KV-Cache有助于更深刻地认识Transformer中注意力机制的工作方式。 自回归推理过程知识准备 自回归模型采用shift-right的训练方式,用前文预测下一个…...
基础篇03——SQL约束
概述 约束示例 完成以下案例: create table user (id int primary key auto_increment comment 主键,name varchar(10) not null unique comment 姓名,age tinyint unsigned check ( age > 0 and age < 120 ) comment 年龄,status char(1) default 1 commen…...
人工智能--深度神经网络
目录 🍉引言 🍉深度神经网络的基本概念 🍈神经网络的起源 🍍 神经网络的基本结构 🍉深度神经网络的结构 🍈 卷积神经网络(CNN) 🍈循环神经网络(RNN&…...
VOC格式标签各个字段的解释
想了解一下VOC格式数据标签各个字段的含义,搜了一圈没看到,懒得去官网了,直接问了GPT-4o,以下回答字段解析来自GPT-4o,例子我自己写的 VOC (Visual Object Classes) 数据标签格式主要用于目标检测任务。VOC格式的标签…...
2024年端午节放假通知
致尊敬的客户以及全体同仁: 2024年端午节将至,根据国务院办公厅通知精神,结合公司的实际情况,现将放假事宜通知如下: 2024年6月8日(星期六)至6月10日(星期一)ÿ…...
Transformer系列:注意力机制的优化,MQA和GQA原理简述
前言 多查询注意力(MQA)、分组查询注意力(GQA)是Transformer中多头注意力(MHA)的变种,它们大幅提高了解码器的推理效率,在LLaMA-2,ChatGLM2等大模型中有广泛使用,本篇介绍MQA、GQA的原理并分析其源码实现。 使用MQA,G…...
Python知识点11---高阶函数
提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 本篇介绍一下Python的内置函数也叫高阶函数,就是Python自…...
JavaSE——【逻辑控制】(习题)
一、分支结构 2.1 if 语句 【练习】2.1.1 小明,如果这次考到90分以上,给你奖励一个大鸡腿,否则奖你一个大嘴巴子 int score 92;if(score > 90){System.out.println("吃个大鸡腿!!!");}else{System.out.println("挨大嘴…...
自动驾驶仿真:python和carsim联合仿真案例
文章目录 前言一、Carsim官方案例二、Carsim配置1、车辆模型2、procedure配置3、Run Control配置 三、python编写四、运行carsim五、运行python总结 前言 carsim内部有许多相关联合仿真的demo,simulink、labview等等都有涉及,这里简单介绍下python和car…...
Qt报错:libvlc开发的程序,出现Direct3D output全屏窗口
问题描述: 在qt中开发重播模块时,第一次在窗口正常播放,点击重播按钮后会弹出新的Direct3D output窗口播放视频 分析: 因为libvlc_media_player_set_hwnd 这个函数 设置了不存在的窗口句柄,导致vlc视频播放窗口没有嵌…...
yolov5的口罩识别系统+GUI界面 (附代码)
基于YOLOv5模型的口罩识别系统,结合了GUI界面,旨在帮助用户快速、准确地识别图像或视频中佩戴口罩的情况。YOLOv5是一种流行的目标检测模型,具有高效的实时检测能力,而GUI界面则提供了友好的用户交互界面,使得整个系统…...
WPF中Window的外观实现及常用属性
文章目录 1. 概要2. Window的外观2.1 Window的外观组成2.2 Window的实现2.3 Window外观配置2.4 Window 的其他常用属性1. AllowsTransparency 2. WindowStartupLocation3. ShowInTaskbar4. ShowActivated5. SizeToContent6. Topmost7. WindowStyle 1. 概要 和 Android 类似, W…...
50| 选数
#include <bits/stdc.h> using namespace std;int n, k, ans, sum; // ans 最终答案 const int N 23; int a[N]; bool st[N];bool isprime(int x) {if (x < 1) return false;for (int i 2; i < sqrt(x); i)if (x % i 0) return false;return true; }void dfs(…...
别只刷题了!用Python/C++搞定考研机试高频算法(附PIPIOJ真题代码重构与优化)
从暴力解法到优雅实现:Python/C双语言拆解考研机试高频算法 考研机试不仅考察算法理解,更检验工程化编码能力。许多考生能写出正确但冗长的代码,却在时间优化和代码简洁性上失分。本文将用Python和C对比实现六大高频题型,重点分析…...
保姆级教程:用PHPStudy+红日靶场复现一次完整的内网渗透(从外网打到域控)
从零构建内网渗透实战:PHPStudy环境下的红日靶场攻防演练 在网络安全领域,内网渗透测试是检验企业防御体系完整性的重要手段。本文将带领读者使用常见的PHPStudy环境搭建红日靶场,通过模拟真实攻击路径,从外网Web渗透逐步深入内网…...
springboot+vue基于web的蛋糕商城论坛交流系统的设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块分析核心功能模块特色功能实现技术难点解决方案性能优化措施项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块分析 …...
音乐标签编辑器:让本地音乐元数据管理效率提升90%的开源工具
音乐标签编辑器:让本地音乐元数据管理效率提升90%的开源工具 【免费下载链接】music-tag-web 音乐标签编辑器,可编辑本地音乐文件的元数据(Editable local music file metadata.) 项目地址: https://gitcode.com/gh_mirrors/mu/…...
Mongo(2): MongoDB权限认证实战——从零配置用户角色与访问控制
1. MongoDB权限认证的必要性 第一次接触MongoDB时,很多人都会被它"开箱即用"的特性吸引——安装完成后不需要任何配置就能直接操作数据库。这种便利性在开发测试阶段确实很友好,但一旦进入生产环境,就相当于把自家大门敞开给所有人…...
让按钮并排布局的艺术
在前端开发中,我们经常需要面对如何让一系列的按钮并排显示而不堆叠在一起的问题。今天,我将带你深入了解如何使用CSS的Flexbox布局来解决这个问题,并通过一个具体的例子展示如何实现这一效果。 问题背景 假设我们有一个页面,包含多个按钮,这些按钮默认情况下是垂直堆叠…...
Phi-4-reasoning-vision-15B快速上手:使用Postman完成图像问答API全流程调试
Phi-4-reasoning-vision-15B快速上手:使用Postman完成图像问答API全流程调试 1. 引言:认识视觉推理模型 Phi-4-reasoning-vision-15B是微软推出的新一代视觉多模态推理模型,它能像人类一样理解图片内容并进行智能问答。想象一下,…...
终极指南:Redaxios参数序列化完全掌握,自定义查询字符串生成逻辑如此简单
终极指南:Redaxios参数序列化完全掌握,自定义查询字符串生成逻辑如此简单 【免费下载链接】redaxios The Axios API, as an 800 byte Fetch wrapper. 项目地址: https://gitcode.com/gh_mirrors/re/redaxios Redaxios是一个轻量级的Fetch封装库&a…...
厦门选117E还是120E?手把手教你为你的城市选择正确的高斯克吕格投影坐标系
厦门GIS项目实战:如何精准选择高斯克吕格投影坐标系 第一次在ArcGIS里看到上百个坐标系选项时,我的鼠标指针在列表上方徘徊了整整十五分钟——就像站在自动售货机前不知道按哪个按钮的新手。特别是当项目 deadline 临近,而厦门市规划局的Shap…...
