编译原理笔记(三)

一、词法分析程序的设计

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.由正规式构造有限自动机  
消去结点的规则如下:

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

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

相关文章

aspose通过开始和结束位置关键词截取word另存为新文件

关键词匹配实体类&#xff1a; Data EqualsAndHashCode(callSuper false) public class TextConfig implements Serializable {private static final long serialVersionUID 1L;/*** 开始关键词&#xff0c;多个逗号分隔*/private String textStart ;/*** 结束关键词&#x…

Gitee

Gitee码云 0. 笔记说明1. Gitee概述2. Gitee和GitHub3. 创建Git远程仓库4. 分享已有项目到Gitee5. 文件恢复和合并6. 文件push或pull冲突7. 添加项目成员 0. 笔记说明 该笔记以IDEA 2023专业版进行操作需提前注册好个人gitee账号安装好IDEA的相关gitee插件或者安装Git Bash软件…

算法训练day60|单调栈part0

参考&#xff1a;代码随想录 84.柱状图中最大的矩形 要求当前柱形的左右两边第一个比他小的位置 对于高度为5的柱子&#xff08;index为2&#xff09; mid 他的左边第一个比他小的柱子为1&#xff0c;index为1 left 他的右边第一个比他小的柱子高度为2&#xff0c;index为4…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 编译构建及此过程中的踩坑填坑(1)

接前一篇文章&#xff1a;玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 代码下载&#xff08;2&#xff09; 本文主要参考&#xff1a; BQ3588C_代码下载 上一回完成了代码下载&#xff0c;本回开始进行编译构建。 1. 编译构建 &#xff08;1&#xff09;执行prebuilts 在源…

万字长文谈自动驾驶bev感知(一)

文章目录 prologuepaper listcamera bev :1. Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D2. M2BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Birds-Eye View Representation3. BEVDet: High-Pe…

计算机网络期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

SpringCloud微服务架构,适合接私(附源码)

一个由商业级项目升级优化而来的微服务架构&#xff0c;采用SpringBoot 2.7 、SpringCloud 等核心技术构建&#xff0c;提供基于React和Vue的两个前端框架用于快速搭建企业级的SaaS多租户微服务平台。 架构图 项目介绍 用户权益 仅允许免费用于学习、毕设、公司项目、私活等。…

dotdotdot插件快速实现多行文本的省略

jQuery.dotdotdot 前言 在“css新增文本样式&#xff08;完整&#xff09;”这篇&#xff0c;我们介绍了text-overflow属性省略多余的文本。用text-overflow属性可以直接省略单行文本&#xff0c;但省略多行文本&#xff0c;单独使用CSS是无法实现&#xff0c;今天我们介绍一…

海外分支访问国内服务器系统慢怎么办?

在全球业务不断扩张的今天&#xff0c;企业面临着海外分支访问国内总部服务器系统慢的问题。为了解决这一挑战&#xff0c;我们引入了lxway全球系统专网产品&#xff0c;为企业提供高效、安全的全球网络连接方案。通过解析技术瓶颈和专网的优势&#xff0c;本文将揭示如何借助先…

imgaug库指南(五):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

手机上连网络转接app,电脑连接手机,共用网络转接app的办法

方法一&#xff0c;&#xff08;不推荐&#xff09; 因为太简单了所以写一下 电脑安装MuMu模拟器&#xff0c;之后安装网络转接app&#xff0c;这个模拟器设置了从电脑上安装app和&#xff0c;安卓与电脑同步文件夹功能&#xff0c;实现文件共享。所以直接用就可以了。 方法二…

CP_AutoSar目录

目录 一、RTE二、模式和状态管理三、BSW四、工具链相关五、杂项六、优化相关 一些笔记和日常记录。有部分未包含在此目录中。 一、RTE [AutoSar]基础部分 RTE 01 介绍 [AutoSar]基础部分 RTE 02 S/R Port 显式/隐式 [AutoSar]基础部分 RTE 03 C/S Port 同步/异步 [AutoSar]基…

5.vue学习笔记(数组变化的侦测+计算属性+Class绑定)

文章目录 1.数组变化的侦测1.1.变更方法1.2.替换一个数组 2.计算属性计算属性缓存vs方法 3.Class绑定3.1.绑定对象3.2.多个对象的绑定形式3.3.绑定数组3.4.数组与对象 1.数组变化的侦测 1.1.变更方法 vue能够侦听响应式数组的变更方法&#xff0c;并在它们被调用时出发相关的…

私有云平台搭建openstack和ceph结合搭建手册

OpenStack与云计算 什么是云&#xff1f; 如何正确理解云&#xff0c;可以从以下几个方面。 云的构成。 用户&#xff1a;对用户而言是透明无感知的&#xff0c;不用关心底层构成&#xff0c;只需要知道利用云完成自己任务即可。 云提供商&#xff1a;对云资产管理和运维。 云…

深度学习|3.6 激活函数 3.7 为什么需要非线性激活函数

激活函数 主要有sigmoid函数、tanh函数、relu函数和leaky relu函数 tanh函数相比sigmoid函数是具有优势的&#xff0c;因为tanh函数使得输出值的平均值为0&#xff0c;而sigmoid函数使得输出值的平均值为1/2&#xff0c;对下一层来说tanh输出的0更好进行处理。 激活函数tanh…

UICollection Compositional Layout全详解

本文字数&#xff1a;8325字 预计阅读时间&#xff1a;45分钟 01 Collection View Layout全详解 UICollectionView在iOS中是构建复杂布局的强大工具。iOS13中引入的 UICollectionViewCompositionalLayout为创建自定义布局提供了全新的可能性。本文将深入探讨Compositional Lay…

ES6的默认参数和rest参数

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

第14课 利用openCV快速数豆豆

除了检测运动&#xff0c;openCV还能做许多有趣且实用的事情。其实openCV和FFmpeg一样都是宝藏开源项目&#xff0c;貌似简单的几行代码功能实现背后其实是复杂的算法在支撑。有志于深入学习的同学可以在入门后进一步研究算法的实现&#xff0c;一定会受益匪浅。 这节课&#…

从零学Java - 接口

Java 接口 文章目录 Java 接口1.接口的语法1.1 与抽象类的区别 2.如何使用接口?2.1 接口的使用规范 3.什么是接口?3.1 常见关系 4.接口的多态性5.面向接口编程5.1 接口回调 6.特殊接口6.1 常量接口6.2 标记接口 7.接口的好处 补充面向对象 七大设计原则 1.接口的语法 接口&a…

数字IC后端实现之Innovus TA-152错误解析(分频generated clock定义错误)

**ERROR: (TA-152): A latency path from the ‘Fall’ edge of the master clock at source pin… Error Code TA-152 在数字IC后端实现innovus中我们经常会看到这类Error&#xff0c;具体信息如下所示。 Error Message **ERROR: (TA-152): A latency path from the ‘Fa…