当前位置:网站首页>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高级编程语言
边栏推荐
猜你喜欢

AD8361检波器

【nRF24L01 与 Arduino 连接实现无线通信】

Temporal Segment Networks:Towards Good Practices for Deep TSN论文精读笔记

Compatible with C51 and STM32 Keil5 installation method

How to remotely debug PLC?

【科普贴】MDIO接口详解
![[Arduino connected to GPS module (NEO-6M) to read positioning data]](/img/16/30ce36f4c11f285d42473d0fec91f0.png)
[Arduino connected to GPS module (NEO-6M) to read positioning data]
![[Spark]-协同过滤](/img/18/8129e96758160b7e5cc9814d50d882.jpg)
[Spark]-协同过滤

Scala 中的集合(二):集合性能比较

目标检测(一):R-CNN系列
随机推荐
【Arduino使用旋转编码器模块】
远程调试PLC,到底如何操作?
联阳IT66121FN提供SDI转HDMI方案分享
基于树莓派的智能箱包开发环境搭建
【MQ-3 酒精检测器与 Arduino检测酒精】
Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset I3D论文精读
Transformer结构解析及常见问题
完全背包问题(动态规划)
OneNET Studio与IoT Studio对比分析
使用批处理脚本修改hosts文件
GM8284DD,GM8285C,GM8913,GM8914,GM8905C,GM8906C,国腾振芯LVDS类芯片
BSN:Boundary-Sensitive Network for Temporal Action Proposal Generation论文阅读笔记
如何快速搭建属于自己的物联网平台?
哈工大2021机器学习期末考试题
GM7150 CVBS转BT656视频解码芯片详细内容及设计要求
ICN6211:MIPI DSI转RGB视频转换芯片方案介绍 看完涨知识了呢
蛮力法求解凸包问题
GM8775C规格书,MIPI转LVDS,MIPI转双路LVDS分享
【NTC 热敏电阻与 Arduino 读取温度】
LT9211芯片资料分享