【编译原理】自底向上的算符优先分析

本文详细介绍了算符优先分析的过程,包括FirstVT和LastVT集合的计算,算符优先关系表的构建,以及自底向上分析的具体步骤。通过文法G(S)和输入串(a,a)#的实例,展示了如何进行分析并最终接受输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文用一个例子作为演示,通俗易懂

 
 

Qs:

已知文法G(S)为:

S → a ∣ ∧ ∣ ( T ) S→a | ∧ | (T) Sa(T)

T → T , S ∣ S T→T,S | S TT,SS

对输入串(a,a)#进行自底向上的算符优先分析

 
 

An:

一·计算FirstVT和LastVT

方法:

  1. 求FirstVT集:从左向右找第一个终结符VT,可以忽视非终结符VN
  2. 求LastVT集:从右向左找第一个终结符VT,可以忽视非终结符VN
FirstVTLastVT
Sa ∧ () ∧ a
Ta ∧ ( ,) ∧ a ,

 
 

二·构造算符优先关系表

方法:

  1. 先加上一个生成式:S’ → #S#
  2. A → …aBb…,则 a = b
  3. A → …bB…,则 b < FirstVN(B)
  4. A → …Bb…,则 LastVN(B) > b

根据生成式可写出:

( < FirstVT(T)

LastVT(T) > (

LastVT(T) > ,

,< FirstVT(S)

# < FirstVT(S)

LastVT(S) > #

# = #

( = )
 
据此画出算符优先关系表:

a^()#
a>>>
^>>>
(<<<=<
)>>>
<<<>>
#<<<=

 
 

二·算符优先分析过程

方法:

  1. 先画上 栈 串1 串2 操作
  2. 当栈顶(最接近栈顶的VT) <或= 串1,则移进move
  3. 当栈顶(最接近栈顶的VT) > 串1,则归约reduce
  4. 一个思想是:非终结符VN完全是无关紧要的东西

完整分析过程:

操作
#(a,a)#move
#(a,a)#move
#(a,a)#reduce
#(S,a)#move
#(S,a)#move
#(S,a)#reduce
#(S,S)#reduce
#(S)#move
#(S)#move
#S#Accept

 
 
 
 

 
 
 
 

 
 
 
 

E N D END END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值