惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
月光博客
月光博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
美团技术团队
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
A
About on SuperTechFans
Jina AI
Jina AI
D
Docker
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog

姓王者的博客

Linux用户Secure Boot自主维护指南 | 姓王者的博客 MAD Bugs 已经开始——关于信息安全的军备竞赛 | 姓王者的博客 解决钉钉Dingtalk无法在Linux新版内核上启动问题-修复可执行栈错误 | 姓王者的博客 突发:GitHub 正遭受大规模 Issue 赌博广告轰炸 | 姓王者的博客 Ubuntu26.04-beta体验:坚毅浣熊! | 姓王者的博客 fakeclaw装作龙虾发贴吧 | 姓王者的博客 找回12年前的QQ记忆 | 姓王者的博客 在Linux上玩Flash网页游戏-洛克王国 | 姓王者的博客 Copilot将使用交互数据来训练 | 姓王者的博客 重要通知-请更新我的GPG公钥 | 姓王者的博客 为了自由Android | 姓王者的博客 GPL"2,3"事 | 姓王者的博客 短文-对VitePlus的一点🤏小贡献 | 姓王者的博客 Bing收录没了?亲测有效的快速恢复指南 | 姓王者的博客 解决桌面设备二维码快速识别的工具-ClipQR | 姓王者的博客 解决 Nautilus 自定义终端插件安装依赖问题 | 姓王者的博客 OpenClaw 该熄火了 | 姓王者的博客 Vite8 - 统一的基建开始 | 姓王者的博客 Astro 6 推出啦 | 姓王者的博客 ubuntu的openvpn异常暂停推送更新 | 姓王者的博客 Ubuntu 24.04 安装 Win10 虚拟机 | 姓王者的博客 ESA-后记:热爱阿里云 | 姓王者的博客 Moonbit 0.8.0 重大发布,我也要改一下我的包 | 姓王者的博客 ESA Pages 边缘开发大赛获奖 | 姓王者的博客 Astro: 优化katex,mermaid和灯箱使用 | 姓王者的博客 从edgeone迁移到esa | 姓王者的博客 出租人类:AI时代的荒诞与真实 | 姓王者的博客 Astro 5.17构建性能优化实践:从18s到13s | 姓王者的博客 Moonbit License Checker 开发使用 | 姓王者的博客 Stalux Astro博客主题自荐 | 姓王者的博客
编译原理:LL(1)文法 | 姓王者的博客
作者:xingwangzhe · 2025-03-26 · via 姓王者的博客

🕒 阅读时间:2 分钟 📝 字数:432 👀 阅读量: Loading...

S_文法

:::tip

S_文法(简单的确定性文法)

每个产生式的右部都以终结符开始

同一非终结符的各个候选式的首终结符都不同

S_文法不含ε\varepsilon产生式

:::

非终结符的后继符号集

可能在某个句型中,紧跟在A后边的终结符a的集合,记为FOLLOW(A) FOLLOW(A)={a∣S⇒∗αAaβ.a∈VT,α,β∈(VT∪VN)∗}\\FOLLOW(A) = \{a| S \Rightarrow {}^*\alpha Aa \beta.a \in V_T,\alpha , \beta \in (V_T \cup V_N )^* \}

:::info 如果A是某个句型的最右符号,则将结束符”$“添加到FOLLOW(A)中 :::

产生式的可选集

产生式A→βA \rarr \beta 的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为SELECT(A→β)SELECT(A \rarr \beta)

SELECT(A→aβ)={a}SELECT(A \rarr a\beta ) = \{ a \} SELECT(A→ε)=FOLLOW(A)SELECT(A \rarr \varepsilon ) = FOLLOW(A)

q_文法

  • 每个产生式的右部或为 ε\varepsilon ,或以终结符开始
  • 具有相同左部的产生式有不相交的可选集
    • q_文法不含右部以非终结符打头的产生式

串首终结符

串首第一个符号,并且是终结符,简称首终结符 给定一个文法符号 α\alpha ,α\alpha 的串首终结符集FIRST(α)FIRST(\alpha) 被定义为可以从α\alpha 推导出的所有串首终结符构成的集合.如果α⇒\*ε\alpha \Rightarrow {}^\* \varepsilon 那么varepsilonvarepsilon也在FIRST(α)FIRST(\alpha)

对于 ∀α∈(VT∪VN)+,FIRST(α)=a∣α⇒∗aβ,a∈VT,β∈(VT∪VN)∗∀α∈(V_T∪V_N)^+,FIRST(α)= {a | α ⇒* aβ,a ∈ V_T,β∈(V_T∪V_N)^*}

如果 α⇒∗ε,那么ε∈FIRST(α)α ⇒* ε,那么 ε∈FIRST(α)

产生式 A→α 的可选集 SELECT

  • 如果 ε∉FIRST(α),那么SELECT(A→α)=FIRST(α)ε∉FIRST(α),那么 SELECT(A→α)= FIRST(α)
  • 如果 ε∈FIRST(α),那么SELECT(A→α)=(FIRST(α)−ε)∪FOLLOW(A)ε∈FIRST(α),那么 SELECT(A→α)= (FIRST(α)-{ε})∪FOLLOW(A)

LL(1)文法

文法G是LL(1)的,当且仅当G的任意两个具有相同左部的产生式A→α∣βA \rarr \alpha|\beta 满足下面的条件

  • 如果α和β均不能推导出ε\alpha 和 \beta 均不能推导出 \varepsilon ,则 FIRST(α)∩FIRST(β)=∅FIRST(\alpha) \cap FIRST(\beta) = \emptyset
  • α和β\alpha 和 \beta至多有一个能推导出 ε\varepsilon
  • 如果 β⇒∗ε\beta \Rightarrow {}^* \varepsilon .则FIRST(α)∪FOLLOW(A)=∅FIRST(\alpha)\cup FOLLOW(A) = \emptyset
  • 如果 α⇒∗ε\alpha \Rightarrow {}^* \varepsilon .则FIRST(β)∪FOLLOW(A)=∅FIRST(\beta)\cup FOLLOW(A) = \emptyset

:::tip

同一非终结符的各个产生式的可选集互不相交 :::

  • 第一个L表示从左向右扫描输入
  • 第二个L表示产生最左推导
  • 1表示在每一步中只需要向前看一个输入符号来决定语法分析动作