编译原理(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)分析表的构造(附题目与答案 超详细)
1439 1
|
应用服务中间件 Linux API
acme.sh 快速实现 https 证书颁发与自动续期
借助acem.sh来迅速实现 let's encrypt 的泛域名 ssl 证书颁发与续期,基本上五分钟就可以解决战斗
5363 0
|
6月前
|
关系型数据库 MySQL 应用服务中间件
phpstudy_x64_8.1.1.3安装教程(含Apache/MySQL启动与端口修改)
PhpStudy 8.1.1.3(64位)是一款Windows本地PHP集成环境,一键安装Apache/Nginx、PHP、MySQL,支持Win7/10/11。安装简单,含图形化管理界面,轻松搭建测试站点,适合PHP开发与源码调试。(239字)
983 11
|
8月前
|
人工智能 数据可视化 API
看完《疯狂动物城》心痒痒?试试ComfyUI,让朱迪和尼克走进你的画布
看完《疯狂动物城》意犹未尽?用ComfyUI+Flux文生图模型,让朱迪和尼克跃然纸上!通过节点式工作流精准控制生成细节,还原动画级质感。毛发、表情、服饰皆栩栩如生,支持风格定制与角色一致性强的图像创作。无需高配硬件,Lab4AI平台一键部署,轻松实现你的创意构想。Anyone can create anything!
1272 1
看完《疯狂动物城》心痒痒?试试ComfyUI,让朱迪和尼克走进你的画布
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
289 0
|
JSON 中间件 Go
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
749 63
|
自然语言处理 JavaScript Java
《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS架构介绍
HarmonyOS采用分层架构设计,从下至上分为内核层、系统服务层、框架层和应用层。内核层支持多内核设计与硬件驱动;系统服务层提供核心能力和服务;框架层支持多语言开发;应用层包括系统及第三方应用,支持跨设备调度,确保一致的用户体验。
1510 81
|
编译器
区分LR(0),SLR(1),LR(1)和LALR(1)
区分LR(0),SLR(1),LR(1)和LALR(1)
2873 1
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1547 29
DFA与NFA的区别,由正规表达式构造DFA,以及DFA的相关化简
DFA与NFA的区别,由正规表达式构造DFA,以及DFA的相关化简
2846 1
DFA与NFA的区别,由正规表达式构造DFA,以及DFA的相关化简