You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何消除下述文法的二义性?目标字符串为bbaaa

如何将歧义文法转换为无二义性文法

首先,我们先拆解你遇到的这个文法问题:
原文法 S -> Sa | SbSa | ε 之所以存在歧义,是因为生成某些字符串时存在多种推导路径——比如你的目标字符串 bbaaa,原文法可以通过不同的规则应用顺序得到它,导致推导树不唯一。

要构造无二义性文法,核心是给推导过程规定唯一的生成顺序,避免分支选择的模糊性。针对这个文法对应的语言(所有满足「总a数≥b数,且任意后缀中a数≥b数」的a/b字符串),我们可以设计如下无二义文法:

S -> a S | T
T -> b S a | ε

为什么这个文法无二义?

这个文法通过明确的规则限制了推导的选择:

  • 如果字符串以a开头,只能用 S -> a S 规则,递归推导剩余的子串;
  • 如果字符串以b开头,必须用 T -> b S a 规则(因为S的另一个分支是a S,无法生成b开头的串),这意味着每个b必须对应后面的一个a,中间的部分由S递归生成,完全消除了选择歧义。

用目标字符串bbaaa验证推导过程

唯一的推导路径如下:

S → T → b S a → b T a → b (b S a) a → b b (a S) a a → b b a (T) a a → b b a ε a a → bbaaa

整个过程每一步都没有其他规则可选,推导树完全唯一,不存在歧义。

内容的提问来源于stack exchange,提问作者Ricky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:03:34