`
yidongkaifa
  • 浏览: 4073546 次
文章分类
社区版块
存档分类
最新评论

自顶向下的语法分析(修改)

 
阅读更多

自顶向下语法分析可以被看作是为输入串构造语法分析树的问题,它从语法分析树的根结点开始,按照先序遍历创建这棵语法分析树的各个结点。自顶向下语法分析也可以被看作寻找输入串的最左推导的过程。



递归下降的语法分析

一个递归下降语法分析程序由一组过程组成,每个非终结符号有一个对应的过程。程序的执行从开始符号对应的过程开始,如果这个过程的过程体扫描了整个输入串,它就停止执行并宣布语法分析成功完成。


一个左递归的文法会使它的递归下降语法分析器进入一个无限循环。即使是带回溯的语法分析器也是如此。也就说,当我们试图展开一个非终结符号A的时候,我们可能会没有读入任何输入符号就再次试图展开A



FIRSTFOLLOW

自顶向下和自底向上语法分析器的构造可以使用和文法G相关的两个函数FIRSTFOLLOW来实现。在自顶向下语法分析过程中,FIRSTFOLLOW使得我们可以根据下一个输入符号来选择应用哪个产生式。在恐慌模式的错误恢复中,由FOLLOW产生的词法单元集合可以作为同步词法单元。


FIRST(α)被定义为可从α推导得到的串的首符号(终止符号)的集合,其中α是任意的文法符号串。

计算各个文法符号XFIRST(X)时,不断应用下列规则,直到再没有新的终结符号或ε可以被加到任何FIRST集合中为止。

1)如果X是一个终结符号,那么FIRST(X)=X

2)如果X是一个非终结符号,且X--->Y1Y2...Yk是一个产生式,其中k>=1,那么如果对于某个iaFIRST(Yi)中且ε在所有的FIRST(Y1)FIRST(Y2)...FIRST(Yi-1)中,就把a加到FIRST(X)中。也就是说,Y1...Yi-1==>*ε。如果对于所有的j=12...k,ε在FIRST(Yj)中,那么将ε加到FIRST(X)中。比如,FIRST(Y1)中的所有符号一定在FIRST(X)中。如果Y1不能推导出ε,那么我们就不会再向FIRST(X)中加入任何符号,但是如果Y1==>*ε,那么我们就加上FIRST(Y2),依此类推。

3)如果X--->ε是一个产生式,那么将ε加入到FIRST(X)中。




对于非终结符号AFOLLOW(A)被定义为可能在某些句型中紧跟在A右边的终结符号的集合。也就是说,如果存在形如S--->αAaβ的推导,终结符号a就在FOLLOW(A)中,其中

α和β是文法符号串。注意,在这个推导的某个阶段,Aa之间可能存在一些文法符号。但如果是这样,这些符号会推导得到ε并消失。另外,如果A是某些句型的最右符号,那么$也在FOLLOW(A)中。($是一个特殊的“结束标记”符号,我们假设它不是任何文法的符号)

计算所有非终结符号AFOLLOW(A)集合时,不断应用下面的规则,直到再没有新的终结符号可以加到任意FOLLOW集合中为止。

1)$放到FOLLOW(S)中,其中S是开始符号,而$是输入右端的结束标记。

2)如果存在一个产生式A--->αBβ,那么FIRST(β)中除ε之外的所有符号都在FOLLOW(B)中。

3)如果存在一个产生式A--->αB,或存在产生式A--->αBβ且FIRST(β)包含ε,那么FOLLOW(A)中的所有符号都在FOLLOW(B)中。




上面的计算方法理解起来比较费劲,我们来看下面的比较容易理解的方法:


FIRST集的定义:如果α是任意的文法符号串,则我们定义FIRST(α)是从α推导出的串的开始符号的终结符集合,即

FIRST(α)={a|α==>*a,a是终结符}。如果α==>*ε,则ε也属于FIRST(α)


FOLLOW集的定义:A是一个非终结符,则定义FOLLOW(A)是包含所有在句型中紧跟在A后面的终结符a的集合,即FOLLOW(A)={a|S==>*αAaβ,a是终结符}。注意,在推导的某一时刻,在Aa之间可能有符号,但如果是这样,它们将推导出ε并消失。如果A是某个句型的最右符号或开始符号,那么$属于FOLLOW(A)(:$是输入串的结束符)


例:求下列文法各个非终结符号的FIRSTFOLLOW集合。

自顶向下的语法分析——龙书笔记 - Jesse - ONE PIECE

解答:(注意==>*表示经过多次推导)

由于

E==>*(E)T'E'

E==>*idT'E'

FIRST(E)={(,id}

同理

FIRST(T)=FIRST(F)={(,id}

FIRST(E')={+,ε}

FIRST(T')={*,ε}

由于

E==>*(E)E是开始符号

FOLLOW(E)={),$}

由于

E==>TE',即E'是该句型的最右符号

E==>*+(E)

FOLLOW(E')={),$}

由于

E==>*T,即T是该句型的最右符号

E==>*T+T

E==>*(T)

FOLLOW(T)={),+,$}

同理

FOLLOW(T')={),+,$}

FOLLOW(E')={),+,$}

FOLLOW(F)={*,),+,$}

分享到:
评论

相关推荐

    词法分析器、语法分析器、语义分析器一起实现

    本C程序实现了对c语言的词法分析、语法分析、语义分析,整个过程一步到位,对数字分析没有支持,稍加修改就可以完成所有分析,利用递归向下分析。。。

    代码语法错误分析工具pclint8.0

    它不仅可以检查出一般的语法错误,还可以检查出那些虽然符合语法要求但不易发现的潜在错误。 C语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C编译器不进行强制类型检查,也带来了代码编写...

    antlr4权威指南

    识别表达式最自然的语法对于传统的自顶向下的语法分析器生成器(如ANTLR 3)是无效的。现在,利用ANTLR 4,你可以通过如下规则匹配表达式:  类似expr的自引用规则是递归的,更准确地说,是左递归(left recursive...

    编译原理(第2版)课件

    练习第5章 自顶向下语法分析方法 5.1 确定的自顶向下分析思想 5.2 LL(1)文法的判别 5.3 某些非LL(1)文法到LL(1)文法的等价变换 5.4 不确定的自顶向下分析思想 5.5 确定的自顶向下分析方法 5.5.1 递归子程序法 ...

    SIC-XE-Simple-Compiler:适用于SICXE的简单编译器

    SIC-XE-简单编译器用于SIC / XE的简单编译器用于SIC / XE的简单编译器,将HIGH-LEVEL语言转换为机器级别,#阶段1:词法分析... 使用的解析技术是递归下降,这是一种自顶向下的方法,递归下降解析器由语法中每个非终端

    SQL语法大全

    rs.delete 删除当前记录,但记录指针不会向下移动 rs.addnew 添加记录到数据表末端 rs.update 更新数据表记录 --------------------------------------- Recordset对象...

    Web笔记(第五天)

    -使用都是1.0版本(1.1不向下兼容) 3、xml的应用 不同系统之间传输数据 -qq之间的数据传输 -画图分析 用来表示生活中有关系的数据 经常用在配置文件 -比如现在连接数据库 肯定知道数据库的用户名和密码,...

    ASP.NET 2.0 跟我一起学Visual.Studio2005 2/9

    跟我一起学Visual Studio 2005(2):C#语法篇(下) (Level 200) 课程简介:随着Dot NET Framework 2.0和Visual Studio 2005的发布,dot net平台的应用程序开发实力不断增强,越来越多的开发者加入到dot net开发大平营...

    实验二 递归子程序方法

    (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i

    统计软件spss教程

    首先,它采用现今广为流行的电子表格形式作数据管理器,使用户变量命名、定义数据格式、数据输入与修改等过程一气呵成,免除了原DOS版本在文本方式下数据录入的诸多不便;其次,采用菜单方式选择统计分析命令,采用...

    shell程序 财务账单管理系统 linux作业

    内容概要:linux课程作业,使用shell设计一个终端下的财务账单管理系统程序,含数据增删改查,分类查询,数据分析,数据排序等功能模块。纯原创,仅用于学习。详细见程序说明手册。能学到什么:1.linux shell相关...

    Windows 系统错误代码简单分析

    Microsoft Windows 系统错误代码简单分析:  0000 操作已成功完成。  0001 错误的函数。  0002 系统找不到指定的文件。  0003 系统找不到指定的路径。  0004 系统无法打开文件。  0005 拒绝访问。...

    MySQL 5.1中文手冊

    5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制...

    MySQL 5.1参考手册 (中文版)

    5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制...

    ApkIDE——安卓反编译

    10、内置adb功能,包括使用adb向设备(或模拟器)安装、卸载修改后的apk进行测试,并嵌入adb log、ddms等功能监测修改apk的运行状况,以便于分析和查找错误。 11、支持多国语言界面,支持界面换肤。 注意事项: 1、...

    mysql官方中文参考手册

    5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制...

    MYSQL中文手册

    5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4....

    MySQL 5.1参考手册中文版

    5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. ...

    MySQL 5.1参考手册

    5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1中的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制...

Global site tag (gtag.js) - Google Analytics