首页 > 编程语言 >LL(1)分析算法

LL(1)分析算法

时间:2024-11-16 21:00:40浏览次数:1  
标签:分析 终结符 NULLABLE LL beta 算法 集合 First FIRST

LL(1) 分析算法

  • 从左(L)向右读入程序,最左(L)推导,采用一个(1)前看符号.
    • 分析高效(线性时间)
    • 错误定位和诊断信息准确
    • 有很多开源或商业的生成工具
      • ANTLR
  • 算法基本思想
    • 表驱动的分析算法
graph LR x1["词法分析器"]--"记号\n\n"-->x2["语法分析器"]---->x3["树"] x2---->x4["分析栈"] x2---->x5["分析表"] x6["语法分析器"]---->x5

一般条件下 LL(1) 分析表构造

  • 一般情况下需要知道某个非终结符是否可以推出空串

  • NULLABLE

  • 并且一般需要知道在某个非终结符后面跟着什么符号

    • 跟随集FOLLOW

NULLABLE集合

归纳定义:

非终结符X属于集合 NULLABLE ,当且仅当:

  • 基本情况:
    • \(X \rightarrow \epsilon\)
  • 归纳情况
    • \(X\rightarrow Y_1 \cdots Y_n\)
      • \(Y_1 \cdots Y_n\) 是n个非终结符,且都属于NULLABLE 集

FIRST 集合的完整计算公式

  • 基于归纳的计算规则:

    • 基本情况:

      • \(X\rightarrow a\)

        • \(FIRST(X) \cup = \{a\}\)
      • 归纳情况:

      • \(X \rightarrow Y_1 Y_2\cdots Y_n(Y_i \subset NULLABLE)\)

        • \(FIRST(X) \cup = FIRST(Y_i) (i=1,2,3,4,5....,n)\)

不动点算法计算FOLLOW集合:

\(while(some set is changing):\)

​ \(foreach(production p: N->\beta_1 \cdots \beta_n )\)

​ \(foreach(\beta_i from \beta_1 to \beta_n)\)

​ \(if(\beta_i == a...)\)

​ \(FIRST(N) \cup = \{a\}\)

​ \(break\)

​ \(if(\beta_i == M)\)

​ \(FIRST(N)\ \ \cup = FIRST(M)\)

​ \(break\)


First集定义:

​ \(First\)集合是对产生式右部的字符串而言的,求取的是非终结符\(V_T\)(或终结符、空字符、文法符号串)的开始符号集合,集合中包含的是由左部非终结符\(V_T\)推导得到的终结符\(V_N\)或空字符ε。以α表示一个文法的字符串,FIRST(α) 表示由α推导出的串的首个终结符或空字符组成的集合。

​ 本质就是一条关系能够出现的能确定的前缀

Follow集定义:

​ Follow集合是对某个非终结符而言的,求取的是非终结符\(V_T\)的后继符号集合,集合中包含的是由非终结符VT后面紧跟的终结符\(V_N\)和结束符,不能出现空字符ε 。以X表示一个非终结符,FOLLOW(X) 表示当X通过规约出现时,接下来的输入可能是哪些终结符。

​ 本质就是一条关系可能产生的后随符号集

First_s集合的计算:

​ 对于每一条产生式规则的而言,即产生式能够产生的所有 First 的集合

​ 指一组关系中能够产生的所有的前缀的集合,右部,从左往右的NULLABLE产生式的First集的并集,直到遇到第一个非NULLABLE产生式或最后一个产生式,再并上该产生式的First集,就是整个关系的First_s集.

处理LL(1)文法中的冲突:
  • 消除左递归,存在左递归的文法会引起 \(LL(1)\) 冲突

LR(0)分析算法

  • 自底向上分析的基本思想:
    • \(\epsilon\)

标签:分析,终结符,NULLABLE,LL,beta,算法,集合,First,FIRST
From: https://www.cnblogs.com/cxjy0322/p/18549802

相关文章

  • 泷羽sec-----shell脚本编程(2--3)
    声明!学习视频来自B站up主泷羽sec有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页B站泷......
  • shell(2)永久环境变量和字符串显位
    ......
  • 一篇文章教会什么是股票量化分析
    股票量化是金融领域的一种交易方式,利用计算机程序、统计学和数学模型来进行交易决策,以规避人为情绪干扰,提高交易效率和收益。在股票量化中,涉及到一些重要的名词和概念。股票量化是利用计算机程序、统计学和数学模型进行交易决策,以规避情绪干扰、提高交易效率和收益。量化分析涉......
  • JDBC学习笔记(四)--JdbcUtil工具类的底层实现、解决 java.sql.SQLException: Operation
    目录(一)为什么要使用JdbcUtil工具类(二)创建一个prorperties文件1.在文件目录或src目录下,选择新建FIle2.创建properties文件 3.编写配置文件Java基础:反射4.获取资源的方式第一种第二种 ​编辑 第三种(一)为什么要使用JdbcUtil工具类问题:在编写jdbc的时候,在每一......
  • 【转载】遗传算法—HyperNEAT Explained——Advancing Neuroevolution
    原文地址:https://hunterheidenreich.com/posts/next-gen-neuroevolution-hyperneat/ExpandingNeuroEvolutionLastweek,IwroteanarticleaboutNEAT(NeuroEvolutionofAugmentingTopologies)andwediscussedalotofthecoolthingsthatsurroundedthealgori......
  • Python实现Graham Scan算法并进行凸包计算
    目录使用GrahamScan算法进行凸包计算第一部分:GrahamScan算法概述1.1什么是GrahamScan算法?1.2算法的应用场景1.3算法的优点和局限第二部分:算法的数学基础与步骤2.1凸包的定义与性质2.2算法的关键步骤2.3极角计算公式2.4算法流程图第三部分......
  • Jarvis March算法详解及Python实现(附设计模式案例)
    目录JarvisMarch算法详解及Python实现(附设计模式案例)第一部分:JarvisMarch算法概述与原理1.1什么是JarvisMarch算法?1.2算法原理1.3算法流程1.4时间复杂度第二部分:JarvisMarch算法的Python实现(面向对象设计)2.1面向对象设计2.2代码实现2.3代......
  • 基于爬虫+数据可视化的服装数据分析系统设计和实现(源码+论文+部署)
    目录:目录:博主介绍: 完整视频演示:你应该选择我技术栈介绍:需求分析:系统各功能实现一览:1.注册2.登录部分代码参考: 项目功能分析: 项目论文:源码获取:博主介绍: ......
  • langchain_chatchat+ollama部署本地知识库,联网查询以及对数据库(Oracle)数据进行查询
    langchain_chatchat+ollama部署本地知识库,联网查询以及对数据库(Oracle)数据进行查询涉及的内容其实挺多的,所以尽量减少篇幅目录langchain_chatchat+ollama部署本地知识库,联网查询以及对数据库(Oracle)数据进行查询准备工作:部署ollama以及拉取模型部署langchain_chatchat部署ora......
  • 基于Hadoop短视频流量数据分析与可视化
    作者主页:编程千纸鹤作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与......