编译原理-LR(0)分析

LR(0)分析

通过一个书本的例子来说明:

文法G[S]为:

(1) S->aAcBe
(2) A->b
(3) A->Ab
(4) B->b

文法的LR(0)分析表如下:

这里写图片描述

此表时需要构造的,但是此处不详细叙述!直接使用了。

问题:现在根据文法G[S]判断字符串 abbcde# 是不是合法的?

对输入串 abbcde# 的分析过程

步骤状态栈符号栈输入串ACTIONGOTO
(1)0#abbcde#S2
(2)02#abbcde#S4
(3)024#abbcde#r23
(4)023#aAbcde#S6
(5)0236#aAbcde#r3
(6)023#aAcde#S53
(7)0235#aAcde#S8
(8)02358#aAcde#r47
(9)02357#aAcBe#S9
(10)023579#aAcBe#r11
(11)01#S#acc

现在从步骤(1)开始解释:

步骤状态栈符号栈输入串ACTIONGOTO
(1)0#abbcde#S2

步骤(1)

1:选取一个特殊的状态开始分析,在初态,终态和普通态中选一个,因为初态是唯一的,而终态和普通态都不一定是唯一的,所以选取初态作为分析的入口。
2:LR(0)分析表的第一列就是状态,所以0状态时符号栈为 # ,输入串为要分析的串,对应的 ACTION 为 S2,GOTO 为空。
步骤状态栈符号栈输入串ACTIONGOTO
(2)02#abbcde#S4

步骤(2)

1:符号栈和输入串是一个同步的过程,输入串从左向右 归约 的过程是一个 出栈 的过程。而对与符号栈就是一个 入栈 的过程。当输入串弹出一个元素,符号栈就要压入一个元素。(PS:这点很重要)
2:从步骤1 可得:ACTION为S2,就把 2 状态压入状态栈,得到 02 ,符号栈为 #a ,输入串为 bbcde# ,此时状态栈的栈顶元素为 2 ,由此从 LR(0)分析表 可得 2 状态对应的ACTION 为 S4 ,所以ACTION填入 S4。(PS: ACTION 由栈顶元素确定),GOTO为空。
步骤状态栈符号栈输入串ACTIONGOTO
(3)024#abbcde#r23
(4)023#aAbcde#S6

步骤(3,4)

1:输入串出栈,符号栈入栈,状态栈变为 024 ,此时4 对应的 r2 (PS:r-‘reduce’ 的意思是 缩小,减少)每当ACTION为 r 时 , GOTO就有值了。 
2:此时r2中的 2 代表就是 G[S]文法的第二条产生式,即 A->b ,现在用 A 替换 b .得 aA . GOTO 的值 为A 对应的值 3。同时符号栈弹出了 1 个元素 b ,相应的状态栈也要弹出一个元素,即弹出 4 。
3:同时把GOTO 的值 3 压入 步骤4 的状态栈,得 023. 栈顶 3 对应的 ACTION 为 S6 。步骤4 的GOTO为空。
(PS:符号栈替换的时候,会记录归约字符的长度(此处为 b ,长度为1 ,所以状态栈也要出栈 1 个元素))。
(PS:GOTO的状态不要忘记压入状态栈了)
步骤状态栈符号栈输入串ACTIONGOTO
(5)0236#aAbcde#r3
(6)023#aAcde#S53
(7)0235#aAcde#S8
(8)02358#aAcde#r47
(9)02357#aAcBe#S9
(10)023579#aAcBe#r11

步骤(5-10)

1:原理同上,只是步骤5符号栈归约的字符长度 为1(就是一个 b) ,而步骤10的长度 为5 ,就是字符串 aAcBe 的长度
步骤状态栈符号栈输入串ACTIONGOTO
(11)01#S#acc

步骤(11)

1:原理同上,最后只要可以得到输入串和符号栈连起来的字符是原字符就表示原字符是合法的。S -- ‘aAcBe’
输入串 # ,S + # -->  aAcBe# , ACTION 为 acc 表示接受。
  • 17
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
LR语法分析器是编译原理中的一种语法分析方法,它可以根据给定的文法规则,对输入的程序代码进行分析和解析。LR语法分析器使用自底向上的分析方法,通过构建一个状态机来识别输入的符号是否符合给定的文法规则。 LR语法分析器的实现通常使用工具,如Bison(Yacc的GNU版本),它可以根据给定的文法规则自动生成相应的语法分析器。LR语法分析器的工作原理如下: 1. 构建LR分析表:根据给定的文法规则,LR语法分析器会构建一个分析表,该表记录了在不同状态下,对应不同输入符号的移进、规约或接受操作。 2. 状态转移:LR语法分析器通过状态转移来处理输入符号。它从初始状态开始,根据当前状态和下一个输入符号,查找分析表中对应的操作,并执行相应的移进或规约操作。 3. 移进操作:当遇到终结符号时,LR语法分析器会将该符号移入中,并读取下一个输入符号。 4. 规约操作:当遇到非终结符号时,LR语法分析器会根据文法规则进行规约操作,将中的符号按照规约规则进行替换。 5. 接受操作:当输入符号被完全分析并符合文法规则时,LR语法分析器会执行接受操作,表示输入符号被成功地分析和解析。 通过使用LR语法分析器,可以对程序代码进行语法分析,并生成相应的抽象语法树(AST)。抽象语法树可以用于后续的语义分析和代码生成等编译过程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值