LL(1)文法 :解决 if-else/if-else 产生式二义性问题

注:本文适合对编译感兴趣的朋友阅读。

最近尝试用LL(1)文法构造 类似C语言结构的产生式。在构造 if/else 语句时,发现语法存在二义性(Statement、Expression部分省略 ):

Statement-> if ( Expression ) IfBlock

IfBlock-> Statement ElseBlock

ElseBlock-> else Statement |∑

 

算法分析结果指出:ElseBlock的首符集和随符集 同时出现 else 助记符;

结果一出,我顿时发懵,努力去修改产生式去消除 二义性,但是尝试2、3天后无果。于是在网上的一篇帖子中发现:这是if-else固有的二义属性;同时指出具体解决方法参考紫龙书 例4.33:

 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NzI5MzYy,size_16,color_FFFFFF,t_70

20190918145351879.png

 

解决方法:

产生式采用:

Statement-> if (Expression) IfBlock

ifBlock-> Statement ElseBlock

ElseBlock-> else Statment

我使用了一种捷径:在词法分析阶段,对Tokens序列进行检查。若if 分支后未监测到else,则在适当位置插入一个‘else;’序列,此阶段后在进行常规编译;

优点:既实现了if-else的灵活组合,又降低编译器的实现难度(不存在二义性问题)。

 

自研产品介绍:Plang高级编程语言

 

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChivenZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值