当前位置: 首页 > news >正文

编译原理笔记(三)

一、词法分析程序的设计

1、词法分析程序的输出

在识别出下一个单词同时验证其词法正确性之后,词法分析程序将结果以单词符号的形式发送至语法分析程序以回应其请求。

单词符号一般分下列5类:

  • 关键字:如:begin、end、if、while和var。
  • 标识符:如:常量名、变量名和过程名
  • 常数:各种类型的常数,如:25、TRUE和"ABC"等。
  • 运算符:如+、*、<、=等。
  • 界符:如:逗号、分号、括号等、

2、词法分析程序中如何识别单词

常见的可以用于词法规则描述的工具有状态转换图、扩展巴克斯范式(EBNF)、有限状态自动机正规表达式以及正规文法等。

二、单词的形式化描述工具

1、正规文法

正规文法也称3型文法G={VN,VT,S,P},其P中的每一条规则都有下述形式:A→aB或A→a,其中A,B\inVN,a\inVT^{*}。正规文法描述的是VT上的正规集。

2、正规式

字母表Σ={\phi\varepsilon,|,.,*,(,)}。
    1)ε和Ø都是Σ上的一个正规式,它们所表示的正规集为{ε}和Ø。
    2)任何a∈Σ,a是Σ上的一个正规式,它所表示的正规集为{a}。
    3)假设e1和e2是Σ上的正规式,它们所表示的正规集分别为L(e1)和L(e2),则
        ·e1|e2是Σ上的正规式,它所表示的正规集为L(e1|e2)= L(e1)∪L(e2)。
        ·e1e2是Σ上的正规式,它所表示的正规集为L(e1e2)= L(e1)L(e2)。
        ·(e1)*是Σ上的正规式,它所表示的正规集为L((e1)*)= L(e1)*。
    4)仅由有限次上述3个步骤而定义的表达式才是Σ上的正规式,仅由这些正规式所表示的符号串的集合才是Σ上的正规集。

 例子:令Σ={a,b},则有:

        1)正规式a表示的正规集为{a}
        2)正规式a|b表示的正规集为{a,b}

        3)正规式ab表示的正规集为{ab}
        4)正规式(a|b)(a|b)表示的正规集为{aa,ab,ba,bb}
        5)正规式a*表示的正规集为{ε,a,aa,aaa,…}
        6)正规式(a|b)*表示的正规集为{ε,a,b,aa,ab,ba,bb,aaa,…}。
        7)正规式a|a*b表示的正规集为包含字符串a和包含0个或多个a后跟随一个b的所有的符号串。

若两个正规式e1和e2所表示的正规集相同,则说e1和e2等价,写作e1=e2
设r,s,t为正规式,正规式服从的代数规律如下:
       1)r|s=s|r
       2)r|(s|r)=(r|s)|t
       3)(rs)t=r(st)
       4)r(s|t)=rs|rt,(s|t)r=sr|tr
       5)\varepsilonr=r,r\varepsilon=r
       6)r|r=r

3、正规式转正规文法

字母表Σ上的正规式r到正规文法G-=(VN,VT,S,P)的转换方法为:
    1选择一个非终结符S生成类似产生式的形式:S\rightarrowr,并将S定为G放识别符号。为表述方便,将S\rightarrowr称作正规式产生式,因为在\rightarrow右部中含有“.”,“*”或“|”等正规式符号,不是V中的符号。
    2若x和y都是正规式,对形如A\rightarrowxy的正规式产生式,重写成A\rightarrowxB,B\rightarrowy两个产生式,其中B是新选择的非终结符。

例:对于r=a(a|d)*

        首先形成S\rightarrowa(a|d)*,然后形成S\rightarrowaA和A\rightarrow(a|d)*,在形成

        S\rightarrowaA    A\rightarrow(a|d)B

        A\rightarrow\varepsilon    B\rightarrow{a|d)B

        B\rightarrow\varepsilon

4、正规文法转正规式

文法产生式正规式
规则1A\rightarrowxB    B\rightarrowyA=xy
规则2A\rightarrowxA|yA=x*y
规则3A\rightarrowx    A\rightarrowyA=x|y

例如:文法G[S]如下:

S\rightarrowaA        S\rightarrowa        A\rightarrowaA        A\rightarrowdA        A\rightarrowa        A\rightarrowd

解:首先有

      S=aA|a

      A=(aA|dA)|(a|d)

       再将A的正规式变换成A=(a|d)A|(a|d),又变换为A=(a|d)*(a|d),再代入S得:

      S=a(a|d)*(a|d)|a

      再利用正规式的代数变换可依此得到

       S=a(a|d)*(a|d)|\varepsilon

       S=a(a|d)* 

三、有穷自动机

1、确定的有穷自动机

1.定义:一个确定的有限自动机(DFA) M是一个五元组M=(K,Σ,f,S,Z),其中:
    1K是一个有限集,它的每一个元素称为一个状态。
    2Σ是一个有穷字母表,它的每个元素称为一个输入字符。
    3f是一个转换函数,是K\timesΣ\rightarrowK上的映像。
    4S∈K,是唯一的初态。
    5Z⊆S,F是一个终态集,可以为空。 
2.DFA的状态转移矩阵
        DFA可用一个二维矩阵表示,矩阵的行表示状态,列表示输入字符,矩阵元素表示δ(s,a)的值。
3.DFA是状态转换图
        若设DFA M含有m个状态和n个输入字符,则这个图含有m个状态结点,每个结点至多有n条箭弧射出与其它的状态结点相连接,每个箭弧用Σ中的一个不同输入字符作为标记。整张图含有唯一的初态结点和若干终态结点。

例子:设DFA M=({0,1,2,3},{a,b},δ,{3}),其中,δ定义为:
        δ(0,a)=1,δ(0,b)=2,δ(1,a)=3,δ(1,b)=2,δ(2,a)=1,δ(2,b)=3,δ(3,a)=3,δ(3,b)=3。

4.DFA的识别字符串
        1)对Σ上的任何符号串w∈Σ*,若存在一条从初态结点到某一终态结点的通路,且该通路上所有弧的标记符连接成的字符串等于w,则称w可被DFA M所识别。若M的初态结点同时又是终态结点,则空字符串ε被M所识别。
         2)DFA与语言的关系:DFA M所能识别的符号串的全体记为L(M)。

2、不确定的有穷自动机

1.定义:一个不确定有限自动机(NFA) M是一个五元组:M=(S,Σ,δ,S0,F),其中:
    1)S是一个有限集,它的每一个元素称为一个状态。
    2)Σ是一个有穷字母表,它的每个元素称为一个输入字符。
    3)δ是一个从S×Σ到S的子集的映射,即δ:S×Σ*→2S
    4)S0⊆S,S0是一个非空初态集。
    5)F ⊆S,F是一个终态集,可以为空。
2.NFA的状态转换图
    若设NFA M含有n个状态和m个输入符号,则这个图含有n个状态结点,每个结点可射出若干箭弧与其它的状态结点相连接。对于w∈{ε}∪Σ,若δ(q0,a)={q1,q2,…,qk}(k≥0),则从q0出发,分别到q1,q2,…,qk的k条弧,弧上均标记为a。整张图含有唯一的初态结点若干终态结点
3.NFA识别字符串
    1)对Σ*上的任何符号串,若存在一条从某一初态结点到某一终态结点的通路,且该通路上所有弧的标记符号依次连接成的字符串等于w,则称w可被NFA M所识别。若M的某些结点同时又是终态结点,则空字符串ε被M所识别。
    2)NFA与语言的关系:Σ*中所有可被NFA M所识别的符号串的集合记为L(M)。
4.DFA和NFA的关系
    1)DFA是NFA的特例,NFA是DFA概念的推广。
    2)NFA能识别的语言都能被一个DFA识别。
    3)DFA相对NFA的识别程序更容易实现。

3、NFA转换为等价的DFA

1.NFA的确定化:对任给的NFA M。都能相应地构造一个DFA M‘,使得L(M’)=L(M)
2.NFA的子集法:DFA的每一个状态代表NFA状态集合的某个子集,构造的DFA使用它的状态去记录NFA读入输入符号之后可能到达的所有状态的集合。
3.状态集合I的a弧转换,表示为ε-Closure(I),定义为一个状态集,是状态集I中的一组任何状态S经任意条ε弧而能够到达的状态的集合。
4.状态集合I的a弧转换,表示为move(I,a),定义为状态集合J,其中J是所有那些可以从I中的某一状态经过一条a弧而到达的状态的全体。

4、确定有限自动机的化简

1.化简的目的去除多余或等价的状态,降低存储代价,提高句子识别的效率。
2.有限自动机的多余状态:从初态出发,任何可识别的输入串也不能到达的状态。
3.状态等价:在两个状态s和t等价的条件是以下两个:
        一致性条件--状态s和t必须同时为可接受状态或不可接受状态。
        蔓延性条件--对于所有输入符号,状态s和状态t必须转换到等价的状态里。

4.DFA的化简(分割法):
         i将DFA M的状态集S划分为两个子集终态集F和非终态集F ̃,形成初始划分Π。
        ii对Π建立新的划分Πnew。对Π中的每个状态子集G进行如下变换:
            a把G划分成新的子集,使G的两个状态s和t属于同一个子集,当且仅当对任何输入符号a,状态s和t转换到的状态都属于Π的同一子集。
            b用G划分出的所有新子集替换G,形成新的划分Πnew。
        iii若Πnew和Π相等,则执行第iv)步,否则,令Π=Πnew,重复第ii)步。
        iv划分结束后,对划分中的每个状态子集,选出一个状态作为代表,删去其它一切等价的状态,并把射向其它状态的箭弧改为射向这个代表的状态。

四、正规式与有限自动机之间的等价性

1.由正规式构造有限自动机  
消去结点的规则如下:

相关文章:

编译原理笔记(三)

一、词法分析程序的设计 1、词法分析程序的输出 在识别出下一个单词同时验证其词法正确性之后&#xff0c;词法分析程序将结果以单词符号的形式发送至语法分析程序以回应其请求。 单词符号一般分下列5类&#xff1a; 关键字&#xff1a;如&#xff1a;begin、end、if、whil…...

DDoS攻击的多种方式

DDOS攻击指分布式拒绝服务攻击&#xff0c;即处于不同位置的多个攻击者同时向一个或数个目标发动攻击&#xff0c;或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的&#xff0c;这类攻击称为分布式拒绝服务…...

SpringValidation自定义注解以及分组校验

SpringValidation的参数校验使用可参考&#xff1a;【SpringMVC应用篇】Spring Validation 参数校验-CSDN博客 目录 1. 引入依赖 2. 自定义注解校验 2.1 创建Validation类 2.2 创建注解对象 2.3 使用注解 3. 分组校验 3.1 实体类内部定义接口 3.2 在参数上指定分组 1. …...

Multisim各版本安装指南

Multisim下载链接 https://pan.baidu.com/s/1En9uUKafhGOqo57V5rY9dA?pwd0531 1.鼠标右击【Multisim 14.3(64bit)】压缩包&#xff08;win11及以上统需先点击“显示更多选项”&#xff09;选择【解压到 Multisim 14.3(64bit)】。 2.打开解压后的文件夹&#xff0c;双击打开【…...

大学生搜题软件,未来可期吗?

作为一家专注于软件开发的公司《智创有术》&#xff0c;我们致力于为客户提供创新、高效和可靠的解决方案。通过多年的经验和专业知识&#xff0c;我们已经在行业内建立了良好的声誉&#xff0c;并赢得了客户的信任和支持。 支持各种源码&#xff0c;网站搭建&#xff0c;APP&a…...

JMeter使用

目录 启动JMeter 创建线程组 设置线程参数 设置http请求参数 ​编辑 创建查看结果树(显示成功/失败多少以及返回结果等信息) 创建聚合报告(显示响应时间、吞吐量、异常数等信息) 点击上方的执行按钮即可开始压力测试 结果树显示 聚合报告结果显示 启动JMeter 在JMete…...

ChatGPT 进行 SEO的使用技巧

搜索引擎优化 (SEO) 是使网站对搜索引擎友好的一种不断发展的实践。 自搜索引擎和新兴技术的发展以来&#xff0c;它从未保持不变。 最近发布的 ChatGPT 是一种人工智能对话工具&#xff0c;似乎在搜索引擎优化方面有很好的应用。 从创建吸引人的标题到只需一个简短的提示就可…...

PDF.js实现搜索多个不同的关键词高亮显示效果

static\PDF\web\viewer.js 392行左右 // 自定义搜索关键词---------------------------------------- this.searchKeywords = keyword => {if (typeof PDFViewerApplication !== undefined) {PDFViewerApplication.eventBus.dispatch(find, {query: keyword,caseSensitive:…...

ES高级用法:DeleteByQueryRequest

背景 在Elasticsearch中&#xff0c;delete_by_query API 允许你基于查询条件删除文档。在Java中&#xff0c;你可以使用Elasticsearch的Rest High Level Client或者Transport Client来执行这个操作。 示例代码 下面是使用Rest High Level Client进行delete_by_query操作的一…...

使用docker build构建image

文章目录 环境步骤准备例1&#xff1a;基本用法例2&#xff1a;缓存layer例3&#xff1a;Multi-stage例4&#xff1a;Mountcache mountbind mount 例5&#xff1a;参数例6&#xff1a;Export文件例7&#xff1a;测试 参考 环境 RHEL 9.3Docker Community 24.0.7 步骤 在Dock…...

【亲测有效】Win11 卸载MySQL5.7以及安装MySQL8.0.35

目录 一、卸载原来本地的mysql5.7 1.mysql服务部分 1.1停止mysql服务 1.2删除mysql服务 2.卸载 MySQL程序 3.残余文件的清理 3.1删除mysql安装的目录 3.2删除mysql数据存放的目录 3.3删除mysql自定义目录 4.清理注册表 5.删除环境变量配置 二、安装mysql8.0.35 1.…...

Beauty algorithm(三)腮红

查阅资料了解到腮红位于苹果肌处,同样使用关键点确定目标区域,然后对该区域进行渲染达到美妆效果。考虑到如果使用简单的RGB是很难做到特效,本篇采用模板方式进行区域融合。 一、skills 前瞻 1、png图像读取 cv::imread(imgPath, cv::IMREAD_UNCHANGED) IMREAD_UNCHANGE…...

DNS安全与访问控制

一、DNS安全 1、DNSSEC原理 DNSSEC依靠数字签名保证DNS应答报文的真实性和完整性。权威域名服务器用自己的私有密钥对资源记录&#xff08;Resource Record, RR&#xff09;进行签名&#xff0c;解析服务器用权威服务器的公开密钥对收到的应答信息进行验证。如果验证失败&…...

【LMM 011】MiniGPT-5:通过 Generative Vokens 进行交错视觉语言生成的多模态大模型

论文标题&#xff1a;MiniGPT-5: Interleaved Vision-and-Language Generation via Generative Vokens 论文作者&#xff1a;Kaizhi Zheng* , Xuehai He* , Xin Eric Wang 作者单位&#xff1a;University of California, Santa Cruz 论文原文&#xff1a;https://arxiv.org/ab…...

WEB 3D技术 three.js 顶点交换

本文 我们来说 顶点的转换 其实就是 我们所有顶点的位置发生转变 我们整个物体的位置也会随之转变 这里 我们编写代码如下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.j…...

ROS学习笔记(11)进一步深入了解ROS第五步

0.前提 我在学习宾夕的ROS公开课的时候发现&#xff0c;外国的对计算机的教育和国内的是完全不一样的&#xff0c;当你接触了外国的课程后回头看自己学的会发现好像自己啥也没学。我这里可以放出来给大家看一下。 1.Python and C 2.Python PDB Tutorial&#xff1a;Python Deb…...

性能优化-OpenMP基础教程(四)-Android上运行OpenMP

本文主要介绍如何在一个常规的Android手机上调试OpenMP程序&#xff0c;包括Android NDK的环境配置和使用JNI编写一个OpenMP程序运行在Android手机中。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#…...

【转载】-财报-丈母娘教咱看财报(资产负债表-利润表-现金流量表)

写在前面 近期&#xff0c;在知乎看到“云峰金融”的一篇关于金融知识的文章《丈母娘教你看财报》&#xff0c;挺有意思的&#xff0c;挑出核心内容&#xff0c;又添加了一些内容的解释&#xff0c;特来分享一下。对于金融入门小白来讲&#xff0c;非常友好。如有不正确的地方&…...

HTML5大作业-精致版个人博客空间模板源码

文章目录 1.设计来源1.1 博客主页界面1.2 博主信息界面1.3 我的文章界面1.4 我的相册界面1.5 我的工具界面1.6 我的源码界面1.7 我的日记界面1.8 我的留言板界面1.9 联系博主界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh …...

数字IC后端设计实现之Innovus update_names和changeInstName的各种应用场景

今天吾爱IC社区小编给大家分享下数字IC后端设计实现innovus中关于update_names和changeInstName在PR中的具体使用方法。 update_names 1&#xff09;为了避免和verilog语法保留的一些关键词&#xff0c;比如input&#xff0c;output这些&#xff0c;是不允许存在叫这类名字的…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...