编译原理(1)----LL(1)文法(首符号集,后跟符号集,选择符号集)

简介: 编译原理(1)----LL(1)文法(首符号集,后跟符号集,选择符号集)
1.首符号集(First( ))

技巧:找最左边可能出现的终结符

例:

1.First(E)

E->T ,最左边为T,又因为T->F ,最左边为F,F->(E)|i,则最左边为{(,i }

2.First(T ):只需要看符号串最左边的符号,即=First(T)

T->F ,最左边为F,F->(E)|i,则最左边为{(,i }

3.First((E)):也只需要看最左边的

  First((E))={ ( }

4.First(i):终结符的first集就是它本身

First(i)={i}

其他以此类推:

2.后跟符号集(Follow( )):只针对非终结符


技巧:看”->“的右边,找出非终结符后面所能跟随的所有终结符


1. #  Follow (S),S为识别符号,即 ”#“要放在开始符号"S"的 Follow集中


2.若存在规则U->xWy,First(y)-{}(空串) Follow(W)


3.若存在规则U->xW或U->xWy,其中y能广义推导出(空串),则Follow(U)Follow(W)

Follow(E)

首先E是开始符号,Follow(E)={#}

在"->"右边找E,看E后面跟的所有终结符号,这里F->(E)| i,E的右边为")",终结符的First集就是它本身(对应第二条规则)

所以Follow(E)={#,)}

Follow(T)


首先找”->“的右边,看T后面跟的所有终结符号

E->T         ->+T |

T后面跟的是 的First集是{+, },将 去掉,

E->T         ->+T |    ”->“左边的E和 的follow集写上

Follow(T)={+,#,)}

Follow(E')

首先找”->“的右边,看E’后面跟的所有终结符号

E->T         ->+T |

后面没有符号, 的follow集就是”->“左边E和 的follow集

Follow( )={#,)}


以此类推:

总结

在"->"右边寻找需要求的非终结符,如果非终结符后面是终结符号,直接放到follow集中,如果非终结符后面是非终结符,就看非终结符的first集内容是什么,如果有(空串)


1.那么将空串去掉写入follow集中


2.并且将”->“左边的非终结集的follow集也写入该follow集中

例题:

3. 选择符号集:Select(A-> )

约束:有两条或两条以上产生式才算可选集

E->TE'        不用算可选集

E‘->+TE'|        算可选集

规则:

Select (E'->+TE')

根据规则,不能广义推导出 ,那么运用第一条规则

Select (E'->+TE')={+}

Select(E'-> )

运用第二条规则,”->“右边的首符号集-空串(这里- 后为空集),再并上E’的follow集

Select(E'-> ) ={#,)}

Select(T'->+FT')

”+"号的首符号集就是”+“,所以

Select(T'->+FT')={+}

以此类推:


4.构造LL(1)分析表

以例题的形式展开:

接下来构造LL(1)分析表,行表示终结符,列表示非终结符

由于FIRST(A)={a},所以:

FIRST(A')={a, },因为A'能推出 ,所以要到follow中看,folllow(A’)={#,d},所以将A'-> ,写到其中:

以此类推,得到最终的分析表:


如何判断是否为LL(1)文法:

A-->

:

其实这中间包含了求select集的过程:

对于A--> 而言:

是终结符,则SELECT(A)=

是非终结符,则SELECT(A)=FIRST( )

对于A-->

SELECT(A)=FOLLOW(A)

这里判断A--> 是否为LL(1)文法原理和上面是一模一样的

所以流程: ①消除左递归,消除回溯-->②计算FIRST集和Follow集--->③判断是否为LL(1)文法

5.输入串的分析

给出输入串 aad1#的分析过程

由于A->aA',反向写入符号栈中


此时符号栈的最顶层“a”,与当前输入符号“a”相同,所以可以消去

A‘->AB1| ,不能写空串,这样符号栈就为

以此类推:

到这上面这一步,因为A’不能推出d,又因为A‘->AB1| ,所以这里用A’--> ,将A‘消除

现通过完整的题目练习一下:

表达式文法为:

E-->E+T|T

T-->T*F|F

F-->i|(E)

(1)消除左递归

E-->TE'

E'-->+TE'|

T-->FT'

T'-->*FT'|

F-->i|(E)

预测分析表:

字符串得分析过程:

目录
相关文章
|
网络安全
编译原理复习二:Top-Down分析LL(1)文法的判断与LL(1)分析表的构造(附题目与答案 超详细)
编译原理复习二:Top-Down分析LL(1)文法的判断与LL(1)分析表的构造(附题目与答案 超详细)
1074 1
|
机器学习/深度学习 人工智能 算法
初识智能化测试
非常感谢您可以和我一起来聊一聊智能化测试的一些事。智能化测试是一个新鲜又老旧的问题,说新鲜是因为很多人当听到智能化测试都会联想到人工智能、机器学习、深度学习等高大上的技术,很多时候觉得离我们的实际工作还很远;说老旧,是因为智能化测试的一些技术的发展在行业里面已经很久了,例如符号执行、静态分析等技术已经有很长的历史了。近些年,随着测试技术的的飞速发展,智能化测试也有了越来越多的实践,优秀的开源项目慢慢的被行业推行并且落地。那么在这里我们就一起来聊聊智能化测试以及智能化测试好的思路、实践、方法以及技术落地过程。
1809 0
初识智能化测试
|
28天前
|
存储 编解码 算法
《音频格式优化的底层逻辑:场景拆解与解码兼容的实践指南》
本文聚焦音频文件格式优化的核心实践,跳出“能播放即合格”的表层认知,深挖格式未优化引发的隐性体验损耗。文章结合开发实践中的场景化案例,剖析音频格式与编码逻辑、设备解码能力、使用场景的适配失衡问题,指出优化的核心在于实现“编码效率、解码兼容、场景需求”的动态平衡。通过拆解场景维度、精准选型编码方案、精细化调校参数、构建全维度兼容性测试矩阵等实践路径,阐述如何解决不同设备、网络环境下的音质损耗、加载缓慢、卡顿等问题。强调音频格式优化不仅是技术层面的参数调整,更是对生态规则与用户感知的深度适配,为开发者提供兼具深度与实用性的技术思考,助力打造更具竞争力的多媒体应用体验。
116 3
|
11月前
|
机器学习/深度学习 测试技术
专家模型不要专家并行!微软开源MoE新路径
微软研究团队提出了一种名为“GRIN(GRadient-INformed MoE training)”的新型训练方法,针对专家混合(MoE)模型优化难题。MoE通过稀疏计算提高效率,但传统梯度优化难以直接应用。GRIN利用梯度信息指导专家路由,引入稀疏梯度估计和并行配置,克服了这一局限,显著提升了MoE模型的训练效率和性能。实验表明,GRIN在语言建模等任务上超越了密集模型,并在多个基准测试中取得领先。尽管存在计算复杂度高等挑战,GRIN为MoE模型训练提供了新思路。论文地址:https://arxiv.org/abs/2409.12136
291 24
编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)
编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)
369 0
|
11月前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
2760 17
Spring Boot 两种部署到服务器的方式
|
存储 监控 API
1688商品评论数据接口实战指南:挖掘电商洞察
要获取1688商品评论数据,先注册1688开放平台并登录,然后用Python等工具调用API获取评论信息,如内容、评分等,并存储或分析这些数据。使用时须遵守平台规定,保障数据安全及隐私,利用接口进行舆情监控、提升品牌形象,并留意接口更新以优化业务流程。
DFA与NFA的区别,由正规表达式构造DFA,以及DFA的相关化简
DFA与NFA的区别,由正规表达式构造DFA,以及DFA的相关化简
2085 1
DFA与NFA的区别,由正规表达式构造DFA,以及DFA的相关化简
|
存储 编译器 测试技术
【编译原理】LL(1)分析法:C/C++实现
【编译原理】LL(1)分析法:C/C++实现
1239 0