当前位置:网站首页>LL(1)文法 :解决 if-else/if-else 产生式二义性问题
LL(1)文法 :解决 if-else/if-else 产生式二义性问题
2022-08-02 03:30:00 【ChivenZhang】
注:本文适合对编译感兴趣的朋友阅读。
最近尝试用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:


解决方法:
产生式采用:
Statement-> if (Expression) IfBlock
ifBlock-> Statement ElseBlock
ElseBlock-> else Statment
我使用了一种捷径:在词法分析阶段,对Tokens序列进行检查。若if 分支后未监测到else,则在适当位置插入一个‘else;’序列,此阶段后在进行常规编译;
优点:既实现了if-else的灵活组合,又降低编译器的实现难度(不存在二义性问题)。
自研产品介绍:Plang高级编程语言
边栏推荐
猜你喜欢

uniCloud使用

GM8775C MIPI转LVDS调试资料分享

【Arduino 连接GP2Y1014AU0F 灰尘传感器】

Nest 的实现原理?理解了 reflect metadata 就懂了

SyntaxError: unexpected character after line continuation character

振芯科技GM8285C:功能TTL转LVDS芯片简介

【nRF24L01 与 Arduino 连接实现无线通信】
![[Arduino connects the clock module to display the time on LCD1602]](/img/88/5baac76a24924d1cfd675ff5da830e.png)
[Arduino connects the clock module to display the time on LCD1602]

【科普贴】I2C通讯协议详解——偏软件分析和逻辑分析仪实例分析

GM8775C规格书,MIPI转LVDS,MIPI转双路LVDS分享
随机推荐
I2C无法访问ATEC508A加密芯片问题
uniCloud使用
01背包问题(动态规划)
USB_ID介绍
【树莓派入门(2)树莓派的远程控制】
无源域适应(SFDA)方向的领域探究和论文复现(第一部分)
无向图的连通分支数(并查集)
NE5532运放加法器
TC358860XBG BGA65 东芝桥接芯片 HDMI转MIPI
Spark特征工程-one-hot 和 multi-hot
2020 - AAAI - Image Inpainting论文导读《Learning to Incorporate Structure Knowledge for Image Inpainting》
【Arduino使用旋转编码器模块】
[Arduino connected to GP2Y1014AU0F dust sensor]
【科普贴】MDIO接口详解
IoT solution
【nRF24L01 connects with Arduino to realize wireless communication】
【Arduino 连接 SD 卡模块实现数据读写】
Compatible with C51 and STM32 Keil5 installation method
MIPI解决方案 ICN6202:MIPI DSI转LVDS转换芯片
Spark MLlib特征处理 之 StringIndexer、IndexToString使用说明以及源码剖析