C# 语法分析器(四)二义性文法
系列导航
- (一)语法分析介绍
- (二)LR(0) 语法分析
- (三)LALR 语法分析
- (四)二义性文法
- (五)错误恢复
- (六)构造语法分析器
二义性文法,指的是一个可以为某个句子生成多颗语法分析树。最常见的例子就是算式的例子:
它可以为
二义性文法显然无法被 LR 语法分析器处理,那为什么要使用二义性文法?主要原因就是在表达式这样的语言构造中,二义性文法能够提供比任何等价的二义性文法更短、更自然的归约;同时,我们还可以通过一些消除二义性的规则,使得语言的归约在整体上是无二义性的,并构造出其 LR 语法分析器。
以上面的二义性文法为例,看一下二义性的来源,以下是 LR(0) 项集族:
图 1 二义性算式文法的 LR(0) 项集族
再构造得到 LALR 语法分析表(包含冲突):
图 2 二义性算式文法的 LALR 语法分析表(包含冲突)
可以看到,由于
消除二义性的一个实用方法就是优先级和结合性,如果我们设定
这里还有一个细节,就是为什么
对于其它未指定的情况,可以选择使用通用策略:在遇到移入-归约冲突时优先选择移入,遇到归约-归约冲突时选择列在前面的产生式。或者可以报错要求开发者解决。
本系列相关代码都可以在这里找到。
作者:CYJB
出处:http://www.cnblogs.com/cyjb/
GitHub:https://github.com/CYJB/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)