码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 什么是LL(1)、LR(0)、LR(1)文法、LR分析表—编译原理


    系列文章戳这里👇

    1. 什么是上下文无关文法、最左推导和最右推导
    2. 如何判断二义文法及消除文法二义性
    3. 何时需要消除左递归
    4. 什么是句柄、什么是自上而下、自下而上分析
    5. 什么是LL(1)、LR(0)、LR(1)文法、LR分析表
    6. LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系
    7. 编译原理第三章习题
    8. 词法分析、构建DFA、上下文无关文法、LL(1)分析、提取正规式
    9. 证明LL(1)、SLR(1)、LALR(1)文法
    10. 翻译方案、属性栈代码
    11. 【运行时环境】什么是活动记录、 活动记录与汇编代码的关系

    编译原理-LL(1)LR(0)LR(1)文法

    • 系列文章戳这里👇
      • FIRST集与FOLLOW集
        • 举个栗子
    • 什么是LL(1)文法
      • 举个栗子
      • 再举个栗子
    • 什么是LR(0)文法
      • 举个栗子
    • 什么是LR(1)文法
      • 举个栗子
    • LR分析表

    了解LL(1)文法前,我们首先需要知道什么是FIRST和FOLLOW集合

    FIRST集与FOLLOW集

    为构造不带回溯的自上而下分析算法,首先要消除文法的左递归,并找出避免回溯的充分必要条件。消除左递归的方法已介绍了,下面讨论如何避免回溯,这就是FIRST集与FOLLOW集的工作。
    在讨论不得回溯的前提对文法有什么限制之前,先定义两个和文法有关的函数。一个文法的符号串 a a a的开始符号集合 F I R S T ( a ) FIRST(a) FIRST(a)在这里插入图片描述在这里插入图片描述在这里插入图片描述
    显然,概念定义为了保证准确性与一般性,都比较晦涩难懂,所以让我们通过一个栗子来认识这两个集合:

    举个栗子

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    什么是LL(1)文法

    在这里插入图片描述
    在这里插入图片描述
    把满足这两个条件的文法称为 L L ( 1 ) LL(1) LL(1)文法,其中的第一个 “ L ” “L” “L”代表从左向右地扫描输入,第二个 “ L ” “L” “L”表示产生最左推导,“ 1 ” 1” 1”代表在决定分析器的每步动作时需要向前查看下一个输人符号(即输入指针所指向的符号)。除了没有公共左因子外, L L ( 1 ) LL(1) LL(1)文法还有一些明显的性质,它不是二义的,也不含左递归。

    举个栗子

    ( a ) (a) (a)证明下面文法是 L L ( 1 ) LL(1) LL(1)文法
    S → A a A b ∣ B b B a A → ϵ B → ϵ S→AaAb|BbBa\\ A→\epsilon\\ B→\epsilon S→AaAb∣BbBaA→ϵB→ϵ
    根据 L L ( 1 ) LL(1) LL(1)文法定义
    F i r s t ( A a A a ) = { a } , F i r s t ( B b B b ) = { b } First(AaAa)=\{a\},First(BbBb)=\{b\} First(AaAa)={a},First(BbBb)={b}
    F i r s t ( A a A a ) ∩ F i r s t ( B b B b ) = ϕ First(AaAa)∩First(BbBb)=\phi First(AaAa)∩First(BbBb)=ϕ,所以该文法是 L L ( 1 ) LL(1) LL(1)文法。

    再举个栗子

    在这里插入图片描述

    构造下面文法的 L L ( 1 ) LL(1) LL(1)分析表
    S → a B S ∣ b A S ∣ ϵ A → b A A ∣ a B → a B B ∣ b     F i r s t ( S ) = { a , b , ϵ } F i r s t ( A ) = { a , b } F i r s t ( B ) = { a , b } F o l l o w ( S ) = { $ } F o l l o w ( A ) = { a , b , $ } F o l l o w ( B ) = { a , b , $ } S→aBS|bAS|\epsilon\\ A→bAA|a\\ B→aBB|b\\ \ \\ \ \\

    First(S)={a,b,ϵ}First(A)={a,b}First(B)={a,b}Follow(S)={$}Follow(A)={a,b,$}Follow(B)={a,b,$}" role="presentation" style="position: relative;">First(S)First(A)First(B)Follow(S)Follow(A)Follow(B)={a,b,ϵ}={a,b}={a,b}={$}={a,b,$}={a,b,$}First(S)={a,b,ϵ}First(A)={a,b}First(B)={a,b}Follow(S)={$}Follow(A)={a,b,$}Follow(B)={a,b,$}
    S→aBS∣bAS∣ϵA→bAA∣aB→aBB∣b  First(S)First(A)First(B)Follow(S)Follow(A)Follow(B)​={a,b,ϵ}={a,b}={a,b}={$}={a,b,$}={a,b,$}​

    a a a b b b $ $ $
    S S S S → a B S S→aBS S→aBS S → b A S S→bAS S→bAS S → ϵ S→\epsilon S→ϵ
    A A A A → a A→a A→a A → b A A A→bAA A→bAA
    B B B B → a B B B→aBB B→aBB B → b B→b B→b

    什么是LR(0)文法

    L R ( 0 ) LR(0) LR(0)分析法是其他 L R LR LR分析法构造的基础, L L L表示从左往右扫描, R R R表示反向构造出一个最右推导, k k k表示向前看 k k k个字符,缺省为 1 1 1。
    在这里插入图片描述
    如何判断:如果文法G的LR(0)分析表项没有多重定义—即动作冲突;或者它的LR(0)项目规范族中的任一状态不能同时含有移进和归约的LR(0)项目,那么文法G是LR(0)的,

    举个栗子

    在这里插入图片描述
    在这里插入图片描述

    对于这个文法,它的LR(0)项目集规范族为:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    上述项目集族的状态转移图为:
    在这里插入图片描述

    什么是LR(1)文法

    构造 L R ( 1 ) LR(1) LR(1)项目集规范族的方法本质上和构造 L R ( 0 ) LR(0) LR(0)项目集规范族的方法是一样的,只需要修改 c l o s u r e closure closure函数和 g o t o goto goto函数。也就是LR(1)项目集在进行产生式归约时,只前看一个符号,也就是FOLLOW集中的第一个符号,若下一个符号与之匹配才进行归约。

    举个栗子

    在这里插入图片描述
    以下是该文法的 L R ( 1 ) LR(1) LR(1)项目集规范族以及 状态转换图
    在这里插入图片描述

    在这里插入图片描述
    以下是该文法的规范 L R LR LR分析表
    在这里插入图片描述

    LR分析表

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    新建和编辑共用一个表单,编辑之后新建,form表单resetFields失效
    XV6 Network解析-1
    Spring+SpringMVC+Jsp实现校园二手交易系统
    iOS 17上如何恢复数据?iOS 17 数据恢复软件
    云计算-虚拟化
    汽车电子——产品标准规范汇总和梳理(UDS诊断)
    从零开始的C语言学习第二十课:数据在内存中的存储
    CMIP6数据处理及在气候变化、水文、生态等领域中的实践技术应用
    C盘清理指南(一) 内存小的本质原因
    jQuery基础----绑定和解绑事件的方法
  • 原文地址:https://blog.csdn.net/weixin_56462041/article/details/127461184
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号