📜  自底向上或Shift减少解析器|套装2

📅  最后修改于: 2021-06-28 06:59:56             🧑  作者: Mango

在本文中,我们将讨论自下而上的解析器。
自下而上的解析器/ Shift减少解析器
从叶子到根构建解析树。自下而上的解析可以定义为通过反向搜索w的最右派生来将输入字符串w简化为语法的开始符号的尝试。
例如。

自底向上解析器的分类

一般的移位减少解析是LR解析。 L代表从左到右扫描输入,R代表反向构造最右边的导数。
LR解析的好处:

  1. 许多编程语言使用LR解析器的某些变体。应该注意的是,C++和Perl是它的例外。
  2. LR Parser可以非常有效地实现。
  3. 在从左到右扫描符号的所有解析器中,LR解析器会尽快检测到语法错误。

在这里,我们将通过使用所有四种LR解析技术来研究GOTO语法图的构建。为了在GATE中解决问题,我们必须直接为给定的语法构造GOTO,以节省时间。 LR(0)解析器
我们需要两个功能–
关闭()
去()

增强语法
如果G是具有起始符号S的语法,则G’(G的增强语法)是具有新的起始符号S’和产生式S’-> S的语法。此新的起始产生式的目的是向解析器指示什么时候应该停止解析并宣布接受输入。
让语法为S-> AA
A-> aA | b
以上语法的增强语法为
S’-> S
S-> AA
A-> aA | b

LR(0)件
LR(0)是语法的项G是G的生成物,在右边的某个位置带有点。
S-> ABC产生四个项目
S-> .ABC
S-> A.BC
S-> AB.C
S-> ABC。
生产A->ε仅生成一项A->.ε

关闭操作
如果我是语法G的一组项目,则闭包(I)是根据以下两个规则从I构造的一组项目:

  1. 最初,I中的每个项目都添加到了closure(I)中。
  2. 如果A->α.Bβ在闭包(I)中,并且B->γ是生成物,则将B->.γ添加到I(如果尚不存在)。我们将应用此规则,直到无法再将其他项添加到closure(I)中为止。

例如:
转到操作
Goto(I,X)=1。通过在X之后移动点来添加I。
2.对第一步进行封闭。
构造GOTO图-

  • 状态I 0 –增强的LR(0)项的关闭
  • 使用I 0借助DFA查找LR(0)项目集的所有集合
  • 将DFA转换为LR(0)解析表

LR(0)解析表的构造

  • 动作函数将状态i和终端a(或$,输入结束标记)作为参数。 ACTION [i,a]的值可以具有以下四种形式之一:
    1. 转移j,其中j是状态。
    2. 降低A->β。
    3. 接受
    4. 错误
  • 我们将在项目集上定义的GOTO函数扩展到状态:如果GOTO [I i ,A] = I j,则GOTO还将状态i和非终结点A映射到状态j。

例如:
考虑语法S-> AA
A-> aA | b
增强语法S’-> S
S-> AA
A-> aA | b

上面的GOTO图的LR(0)解析表将为–

该表的操作部分包含语法的所有结尾,而goto部分包含所有非结尾。对于goto图的每种状态,我们将所有goto操作写入表中。如果将goto应用于终端,则将其写入操作部分;如果将goto应用于非终端,则将其写入goto部分。如果在应用goto时减少了产量(即,如果点到达生产结束并且无法应用进一步的闭合),则将其表示为R i ;如果不减少(转移)产量,则将其表示为S i。
如果产生的结果减少,则将其写在产生的左边的尾部所给定的端子下面,例如:在I 5中, S-> AA减小,因此R 1被写入端子的以下位置(S)= LR(0)解析器中的{$}(要了解有关如何计算跟随函数的更多信息,请单击此处)。
如果在某种状态下语法的开始符号被减少,则它会在接受的$符号下书写。

注意:如果在任何状态下都存在归约和移位乘积,或者同时存在两个归约乘积,则称为冲突情况,该语法不是LR语法。