实现一个简单的词法分析器

编译原理,做一个简易词法分析器(C) 提前建立关键字表,输入一段C语言文本;经过词法分析器分析,要输出识别出经其分析的关键字、标识符、常数、算符、特殊字符。同时,建立标识符表和常数表;除此之外,还要对无效字符进行过滤(块级注释、行级注释),并且能识别出错误的标识符(实现错误定位,找出原程序中所有词法错误)... 阅读详情

实现一个简单的词法分析器

词法分析

词法分析的工作是将一个长长的字符串识别出一个个的单词,这一个个单词就是 Token。而且词法分析的工作是一边读取一边识别字符串的,不是把字符串都读到内存再识别

词法单元:

  • 单词的内部表示是词法单元 token

  • 编程语言中最小的语法单元

  • 词法单元的表示

目标程序语句:

  • age >= 45

解析age >= 45

过程图:

图1.png

标识符、比较操作符和数字字面量这三种 Token 的词法规则:

  • 标识符:第一个字符必须是字母,后面的字符可以是字母或数字

  • 比较操作符:> 和 >=(其他比较操作符暂时忽略)

  • 数字字面量:全部由数字构成(像带小数点的浮点数,暂时不管它)

有限自动机:

图2.png

    1. 初始状态:刚开始启动词法分析的时候,程序所处的状态
    1. 标识符状态:在初始状态时,当第一个字符是字母的时候,迁移到状态 2。当后续字符是字母和数字时,保留在状态 2。如果不是,就离开状态 2,写下该 Token,回到初始状态
    1. 大于操作符(GT):在初始状态时,当第一个字符是 > 时,进入这个状态。它是比较操作符的一种情况
    1. 大于等于操作符(GE):如果状态 3 的下一个字符是 =,就进入状态 4,变成 >=。它也是比较操作符的一种情况
    1. 数字字面量:在初始状态时,下一个字符是数字,进入这个状态。如果后续仍是数字,就保持在状态 5

圆圈有单线的也有双线的。双线的意思是这个状态已经是一个合法的 Token 了,单线的意思是这个状态还是临时状态。

标识符和关键字规则的冲突

解析“int age = 40”这个语句,以这个语句为例研究一下词法分析中会遇到的问题:多个规则之间的冲突。

问题:

  • int 这个关键字,与标识符很相似,都是以字母开头,后面跟着其他字母

换句话说,int 这个

设计一个简易的词法分析器 在学习编译原理时,按照《程序设计语言编译原理》(学习教材),设计了一个简单的词法分析器的代码,可以实现对关键字、标识符,数字的识别,去掉空格符等。下面对关键字和种别码的说明。1、 功能:输入源程序、分析源程序的单词,输出单词单词符号的种类如下:(1)    关键字(本例所有关键字都是大写)。DIM IF DO STOP END(2)    标识符:表示各种名字,如数组名、过程名和变量名等。标识符(... 阅读详情

相关推荐

【编译原理】实现一个简单的词法分析器

实验目的 1. 巩固对词法分析的基本功能和原理的认识。 2. 能够应用自动机的知识进行词法分析。 3. 理解并处理词法分析中的异常和错误。 实验要求 1.掌握词法分析的基本功能,并将其实现。 2.词法分析程序应具有较好的可扩展性,应清晰明确。 3.除对相关问题的全面考虑外,还需对局部作一些优化考虑(如符号表)。 实验内容 对一段类高级语言代码进行词法分析,并输出词法分析的结果。 废话不多说 看看代...

y_0232的博客 1561

一个简单词法分析器的实现代码

一个简单的java词法分析器的实现(c语言版)<br />#include <stdio.h> #include <string.h> #define BUFSIZE 256 static char keyWords[][13]={"abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "els

记录、分享 2431

使用C++实现一个简单的SQL语句词法分析器

不多说,直逼主题 1. Token的结构 了解过词法分析器应该都知道,实现一个程序经过词法分析器之后,会生成一个Token,供语法分析器使用。我们在这里就先实现这个token的结构,很简单。 struct Token{ string cifadanyuan; string cisu; Token(){ } Token(string cifadanyuan,string cisu){ ...

weixin_45626962的博客 2973

词法分析程序(可记录行号、识别注释和小数、文件输出)

可以实现的功能:识别关键字,普通标识符,文件形式输入输出,过滤空格、注释等功能

VisualSFM+MeshLab 三维重建全过程记录

VisualSFM+MeshLab 三维重建全过程记录,从下载到运行出结果,以及其中一些可能出现的小问题。通过这两个软件熟悉一下多目立体视觉重建的流程。

何似莫相逢 3万+

阿里系acw_sc__v3滑块验证码逆向分析与实战破解

本文深入解析阿里系acw_sc__v3滑块验证码的核心机制与逆向破解方法。通过分析加密参数生成、轨迹验证模块和动态加密策略,提供完整的自动化破解方案,包括设备指纹生成、缺口识别和轨迹加密等关键技术。文章还分享了常见问题的调试技巧,帮助开发者应对阿里系验证码的复杂防护体系。

wdx012345的博客 1826

基于C#的ASP.NET开发的党史学习网站课设

开展党史学习教育,就是要以史为镜、以史明志,把苦难辉煌的过去、日新月异的现在、光明宏大的未来贯通起来,在鉴往知来中砥砺前行,在乱云飞渡中把准航向,在凝心聚力中团结奋斗,共同创造新的历史伟业。登陆按钮与数据库进行连接,逻辑实现是如图3.1.3所示,自己定义一个SQL查询语句,将账号、密码放入SQL查询语句中,用sqlDataReader.HasRows语句进行逐一比较,找出结果,将用户名存入session并调用cookies,如果结果存在就关闭数据库,进行数据跳转,并弹出登陆成功的提示框,并关闭数据库。

m0_62408555的博客 974

ControlCAN.dll开发适配USBCAN_E/2E_U设备

摘要:本文提供了USBCAN_E/2E_U设备的配置指南:1)安装专用驱动;2)获取最新的ControlCAN.dll文件;3)修改VCI调用顺序,新增VCI_SetReference函数设置波特率;4)使用工具计算波特率配置值,并给出了常见波特率对应的代码参考值(如500K对应0x060007)。配置过程强调使用特定工具计算精确的波特率参数,并提供了相关软件下载链接。

weixin_43969033的博客 387

ssd训练自己的数据集

基于SSD实现目标检测(训练自己的数据集)

reset2021的博客 6803

《UDS协议从入门到精通》系列——图解0x10:诊断会话控制

什么是诊断会话控制服务?切换模式时ECU要做哪些?有没有通信示例?本文全网最详解!!

车载系统攻城狮 1万+

RT-Thread Studio 使用笔记(七)| 配合STM32CubeMX添加裸机驱动(以ADC为例)

1. 配置STM32CubeMX 2. 复制stm32xxxx_hal_msp.c文件 将 CubeMx 生成的代码 stm32f7xx_hal_msp.c 函数复制到 RT-Thread Studio 生成的工程中,并参与工程编译: 由于我们并没有使用 CubeMx 生成的工程,所以这里需要将 stm32f7xx_hal_msp.c 文件中 #include “main.h” 替换为 #i...

Mculover666的博客(嵌入式) 9624

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: Java反射API
下一篇: 编译与链接
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值