详尽分享词法分析程序

简介: 详尽分享词法分析程序

一、实验目的

学习和掌握利用有限自动机编写词法分析程序。

实验要求如下:

二、程序功能描述

简要描述:该程序根据C语言的文法,实现了C语言词法分析。

详细来说,其功能主要表现在:

①该程序可以从头到尾扫描整个文本

②该程序可以分析每个token是什么,如int为保留字,>=是双字符分节符

③该程序可以实现报错

三、主要数据结构描述

1、keyArray【】

key是一个数组,存放保留字。 提供给扫描器,以识别每个token是否为保留字。

2、ch

ch是一个字符变量,保存的是从源程序中读取的单个字符。

3、result

result是一个字符串变量,保存的是从源程序中连续读取的字符串。

4、resultArray【】

resultArray是一个字符串数组,用于存放每个获取的单词的值。

5、resultNum

resultNum是一个整型变量,用于记录获取单词的个数。

四、程序结构描述

1、设计方法——构造有限自动机

为方便表示,加上了

→ |

其余略。

2、函数定义及函数之间的调用关系

(1)bool isKey(string s)

函数名称:isKey

参数解释:字符串变量s

返回值:bool值

功能:判断一个字符串是否为保留字,若是,返回True,否则返回False。

(2)bool isOperator(char ch)

函数名称:isOperator

参数解释:字符变量ch

返回值:bool值

功能:判断一个字符是否为运算符,若是,返回True,否则返回False。

(3)bool isSeparator(char ch)

函数名称:isSeparator

参数解释:字符变量ch

返回值:bool值

功能:判断一个字符是否为分隔符,若是,返回True,否则返回False。

(4)int main( )

函数名称:main

参数解释:无

返回值:int

功能:主函数,实现文本读取,扫描分析,结果文件输出功能。

调用关系:扫描每一个字符时利用自定义的isOperator(ch)

和isSeparator(ch) 以及string库中的isalpha(ch) 和 isdigit(ch)来判断该字符为何类型,有以下几种情况:

1、若读入首字符为字母

①:继续读入字母、数字,组成标识符或关键字

②:读取过程中读到操作符或分隔符,则保存该标识符或关键字。

③:读取过程中遇到违规字符,则一并读取后续字母和数字,直到遇到操作符或分隔符,并报错。

2、若读入首字符为数字

①:继续读入数字,组成无符号整数

②:遇到操作符或分隔符正常终止,并保存该常数

③:若读入其他错误字符,一并读取后续字母和数字,直到遇到操作符或分隔符,并报错。

3、若读入首字符为运算符

①:判断是否为双字符边界

②:下一个字符若为字母、数字、分隔符,正常保存运算符。

③:若非上述字符,则将错误输入符一并读取并报错。

4、若读入首字符为分隔符

①:保存该分隔符

5、若读入首字符为非法字符——报错

五、程序测试

测试用例1:

测试结果截图1:

测试用例2:

测试结果截图2:

六、实验总结

词法分析是编译器进行文法分析的第一步,完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生相应单词的属性字。

经过本次实验,我学会了如何用有限自动机理论编写词法分析程序,对编译器如何分析文法有了更深一步的理解。

七、源代码

cpp

#include

#include

#include

#include

#define LENGTH 32

using namespace std;

//判断当前字符串是否为关键字

bool isKey(string s){

//关键字数组

string keyArray【】 = {"int","char","string","void","bool","float","double","float","true","false","return",

"if","else","while","for","default","do","public","static","switch","case","include"};

//与当前字符串一一对比

for(unsigned int i=0;i[span class="hljs-built_in">sizeof(keyArray);i++){

if(s==keyArray【i】){

return true;

}//代码效果参考:http://www.ezhiqi.com/bx/art_7627.html

if("include"==keyArray【i】){

相关文章
|
编解码 固态存储 openCL
Mastercam 2025 官方电脑配置推荐
Mastercam 推荐配置:建议使用最新版 Windows Professional;推荐 Intel i7 处理器,至少 8GB 内存(建议 32GB),NVIDIA RTX 或 AMD FirePro™/Radeon Pro 专业显卡(4GB 以上内存);双显示器设置,主显示器分辨率 1920x1080;使用 SSD 作为主驱动器;可选 3D 鼠标提升操作体验;注意杀毒软件可能影响软件运行。
3198 7
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
SpringCloudAlibaba Java Docker
SpringCloud Alibaba系列(三) Sentinel安装
  Sentinel安装方式是直接运行jar包,sentinel由后台和前台组成,前台端口8080访问。
434 0
|
存储 前端开发 关系型数据库
在服务的数据驱动中使用三层架构
【6月更文挑战第17天】 三层架构是软件设计中的一种经典模式,将应用分为表示层(UI)、应用层(BLL)和数据层(DAL)。相比于双层架构,三层架构提供了更好的模块化和安全性。多层架构虽少见,但三层架构在现代云原生技术中依然重要,常与微服务结合使用。
539 2
在服务的数据驱动中使用三层架构
|
监控 NoSQL 中间件
中间件常见问题
【7月更文挑战第12天】
525 12
|
运维 安全 网络安全
2023-2024年广东省职业院校技能大赛信息安全管理与评估赛项规程
2023-2024年广东省职业院校技能大赛信息安全管理与评估赛项规程
2023-2024年广东省职业院校技能大赛信息安全管理与评估赛项规程
|
机器学习/深度学习 自然语言处理 数据挖掘
LLM主要类别架构(二)
**LLM主要类别概览:** 1. **自回归模型 (AR)** - 如GPT,特点是Decoder-Only,利用上下文信息预测单词,适合自然语言生成任务。 2. **自编码模型 (AE)** - 以BERT为代表,利用上下文的双向信息进行预训练,擅长自然语言理解任务。 3. **序列到序列模型 (Seq2Seq)** - 包含编码器和解码器,用于序列转换任务,如机器翻译。 GPT是Decoder-Only模型,预训练包括两阶段: - **无监督预训练**:预测序列中缺失的单词。 - **有监督微调**:根据下游任务调整模型,如分类、问答等。
|
Ubuntu Shell Docker
GPU_nvidia-container-toolkit安装和配置
GPU_nvidia-container-toolkit安装和配置
4915 1
|
算法 机器人
改进算法|混合策略改进的蝴蝶优化算法
改进算法|混合策略改进的蝴蝶优化算法
|
SQL 关系型数据库 MySQL
一文带你了解MySQL的DDL语句
一文带你了解MySQL的DDL语句
1109 1