CFG的应用与文法的二义性
从一棵语句的两棵推导树,看清二义性本质与消除路径
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
CFG的应用与文法的二义性
从一棵语句的两棵推导树,看清二义性本质与消除路径
CFG的应用
你写代码时 IDE 实时提示语法错误——这背后 CFG 在工作。它用一套产生式规则告诉机器「什么样的字符串算合法」。
规范规定墙体、门窗怎么合法拼接;产生式规定终结符、非终结符怎么合法组合
CFG的转化
一个文法写出来就能用吗?往往不能——里面藏着推不出终结符的符号、空串产生式、绕弯的单产生式。得按特定顺序一步步收拾成 Chomsky 范式这种标准形状,算法才能稳定工作。
先按类分拣再统一装箱,顺序反了后面的箱子就装不下
文法二义性
接上页CFG转化——即便改写后文法等价,文法本身的二义性仍会埋雷。本页拆解定义、文法与语言二义的差别、不可判定的深度,以及工程中最常遇到的陷阱。
同一字符串两种语法树,对应不同语义——文法只问能否这样拆
二义性的消除方法
上一页我们看到,文法二义性会让同一字符串对应多棵语法树。这一页介绍四种消除方法,从工程实践到理论边界。
约定×比+先算,高优先级放更深层,对应先归约
CFG的构造方法
无论设计JSON解析器还是定义SQL语法,第一步都是写出CFG。但CFG不会凭空冒出来,它有一套系统的构造方法。
固定措辞(终结符)、段落槽位(非终结符)、格式规则(产生式)
CFG的构造实例
上一页给了几条构造套路——这一页挑一个语言跑一遍,看每一步怎么落地。
小块拼成大块,对应终结符拼出非终结符,每层规则都可被复用
本节要点
- ✓CFG 是程序语言语法的形式化骨架
- ✓文法转化不改语言,只为适配分析器
- ✓二义性是文法的属性,不是语言的属性
- ✓消除二义性常借助优先级与结合性约束
- ✓构造 CFG 先定句子骨架,再细化规则
课后思考
先凭记忆回答,再翻看参考答案对照思路——重点不在对错,而在思考路径。
参考答案编译器要为每个句子生成唯一的语法树。无歧义文法保证任意串只有一棵树;二义性文法让同一句子对应多棵树,编译器无法确定该走哪条推导路径,导致语义歧义甚至报错。
参考答案理论上要构造两个不同语法树的句子,但不存在通用算法。实践靠试探:尝试找两棵不同的推导树,或归纳证明所有句子唯一。后者往往非常繁琐。
参考答案有的,叫本质二义语言——任何 CFG 描述它都必有二义。直觉上:语言层「句-义」本身多对一,换任何文法都榨不出唯一性。这是 CFG 表达力的理论边界。