文法
文法
1. 考点:基础概念
形式文法定义:一个形式文法是一个有序四元组 ,其中:
- :非终结符。不是语言组成部分,不是最终结果,可理解为占位符。
- :终结符。是语言的组成部分,是最终结果。且 。
- :起始符。是语言的开始符号。
- :产生式。用终结符替代非终结符的规则,形如 。
正则闭包与闭包:
- 正则闭包 ( ) :(也就是所有正幂的组合,表示 个)。
- 闭包 ( ) :(在正则闭包的基础上,加上 ,表示 个)。
常见示例:
- 若
- 若
重点与口诀:
- 表示 个, 表示 个, 表示 个。
- 口诀:加 () (至少 个),乘 () (可有 个)。
2. 考点 :文法与推导树例题详解
2.1 题目描述
已知文法 G=({a,b},{S,A},S,P)G=({a,b},{S,A},S,P),其中产生式 PP 如下:
S→aASS→aAS
S→aS→a
A→SbAA→SbA
A→SSA→SS
A→baA→ba
问题:请构造句型 aabAa 的推导树。
2.2 文法基础概念回顾
在开始推导前,先明确符号的含义(结合图片右侧提示):
V(非终结符) :{S, A}。代表还没展开的“占位符”,可以被替换。
T(终结符) :{a, b}。代表最终结果,不能再被替换。
S(起始符) :S。所有推导的起点。
P(产生式) :形如 α→βα→β 的替换规则。
2.3 详细推导过程(自顶向下,从左到右)
我们的目标是生成字符串 aabAa。推导的核心思路是:每次替换最左边的非终结符,不断匹配目标串的前缀,直到生成完整的句子。
2.3.1 展开起始符 S
当前状态:起始符 SS。
目标分析:目标串 aabAa 以 a 开头。
选择规则:
规则 S→aS→a 虽然也能生成 a,但生成后只有一个字符,推导就会结束,无法得到长度为 5 的 aabAa。
所以必须选择规则 S→aASS→aAS,保留后续继续推导的能力。
执行替换:将 SS 替换为 aAS。
当前句型:a A S
树结构(对应图中第 1 棵树) :
根节点 SS 生出三个子节点:a、A、S。
2.3.2 展开第一个非终结符 A
当前状态:a A S。目标串是 aabAa。
目标分析:我们已经有了首字符 a,现在需要生成第二个字符 a(目标串的 aa...)。当前最左侧的非终结符是 A。
选择规则:观察 AA 的产生式:
A→baA→ba:以 b 开头,不符合目标串第二个字符 a,排除。
A→SSA→SS:会导致 a SSS,不好控制。
A→SbAA→SbA:可以配合 S→aS→a 生成 abA,正好匹配目标串的 ab... 前缀。
所以选择 A→SbAA→SbA。
执行替换:将 A 替换为 SbA。
当前句型:a S b A S (注意:a + SbA + S)。
树结构(对应图中第 2 棵树) :
在第一步的树基础上,节点 A 生出三个子节点:S、b、A。
2.3.3 展开最左侧的 S
当前状态:a S b A S。目标串 aabAa。
目标分析:我们现在需要让句型变成 a a b ...。当前句型是 a S b ...,中间的 S 必须变成 a 才能匹配。
选择规则:应用规则 S→aS→a。
执行替换:将第二个位置的 S 替换为 a。
当前句型:a a b A S
树结构(对应图中第 3 棵树) :
在第二步的树基础上,节点 A 下面的第一个子节点 S 生出子节点 a。
2.3.4 完成推导(图中未画出,但必不可少)
当前状态:a a b A S。目标串 aabAa。
目标分析:句型当前是 aabAS,目标串是 aabAa。最后一个字符需要是 a。
选择规则:应用规则 S→aS→a。
执行替换:将最后的 S 替换为 a。
最终句型:a a b A a,即 aabAa。
推导完成 ✅
2.4 完整的最左推导序列
用符号 ⇒⇒ 表示一次推导(替换),完整过程如下:
S⇒aAS(使用 S→aAS)⇒aSbAS(使用 A→SbA)⇒aabAS(使用 S→a)⇒aabAa(使用 S→a)S⇒aAS(使用 S→aAS)⇒aSbAS(使用 A→SbA)⇒aabAS(使用 S→a)⇒aabAa(使用 S→a)---
2.5 推导树结构分析
结合图片中的三棵树,推导树从根到叶的生长过程如下:
树 1:根节点 SS,生子节点 a、A、S。
树 2:将树 1 中的 A 展开,生子节点 S、b、A。
树 3:将树 2 中 A 下面的第一个 S 展开,生子节点 a。
最终树(隐含) :将树 3 中最右侧的 S 展开,生子节点 a。
最终推导树的叶子节点从左到右依次为:a、a、b、A、a,即句型 aabAa。
3. 经典例题
3.1 题目一
题目: 简单算术表达式的结构可以用下面的上下文无关文法进行描述( 为开始符号),请判断下列选项中,( )是符合该文法的句子。
文法产生式 :
- A、
- B、
- C、
- D、
【解析】
正确答案:B
解析说明:
选项 A::式子中的 是二元减号,而文法中 只出现在 里,是一元负号(如 的负号),文法不存在二元减法规则,无法推导,排除。
选项 B::各部分都能由文法生成—— 提供加法, 提供乘法, 提供一元负号, 提供数字,推导过程见下。
选项 C::文法的产生式中没有定义括号 ,无法推导,排除。
选项 D::与选项 A 同理, 是二元减号,文法不支持,排除。
选项 B 的推导过程:
因此 可以由该文法推导出来,是正确的。
正确答案:B()。
3.2 题目二
题目: 大多数程序设计语言的语法规则用( )描述即可。
- A、正规文法
- B、上下文无关文法
- C、上下文有关文法
- D、短语结构文法
【解析】
正确答案:B
解析说明:
关于选项 B(上下文无关文法) :大多数程序设计语言的语法规则可以用上下文无关文法来描述。上下文无关文法足够描述程序语言的语法结构,如表达式、语句、程序块等。
其他选项说明:
- A、正规文法:用于描述词法规则(如标识符、常数),不足以描述语法规则。
- C、上下文有关文法:比上下文无关文法更强大,但过于复杂,不常用于描述程序语言语法。
- D、短语结构文法:最一般的文法,包括所有文法类型,但过于宽泛,不适用于实际程序设计语言的语法描述。
正确答案:B(上下文无关文法)。
3.3 题目三
题目: 程序设计语言的大多数语法现象可以用 CFG(上下文无关文法)表示。下面的 CFG 产生式集用于描述简单算术表达式,其中 、、 表示加、减、乘运算, 表示单个字母表示的变量,那么符合该文法的表达式为( )。
文法产生式 :
- A、
- B、
- C、
- D、
【解析】
正确答案:A
解析说明:
选项 A: 的推导过程:
因此 可以由该文法推导出来,是正确的。
选项 C: 的推导过程:
到这里,最后一项需要匹配 。但 只能推导为:
,而 只表示单个字母变量,不能是数字 。
因此, 无法由 推导出来,推导过程在最后一步卡住,选项 C 不正确。
选项 B::文法中没有定义括号 ,无法推导。
选项 D::文法中没有定义除法 ,无法推导。
正确答案:A()。
