当前位置: 首页 > news >正文

文法定义了一个典型的表达式文法,支持加法和乘法,具有左递归以实现左结合

给定文法 $ P = { E \to E + T \mid T, \quad T \to T * F \mid F, \quad F \to (E) \mid \text{id} } $,我们以句子 $ \text{id}_1 + \text{id}_2 * \text{id}_3 $ 为例,进行最右推导、语法树构建和短语分析。


1. 最右推导过程

最右推导(规范推导)是指在每一步推导中,总是替换最右侧的非终结符。从开始符号 $ E $ 出发:

E⇒E+T(使用 E→E+T)⇒E+T∗F(使用 T→T∗F)⇒E+T∗id3(使用 F→id)⇒E+F∗id3(使用 T→F)⇒E+id2∗id3(使用 F→id)⇒T+id2∗id3(使用 E→T)⇒F+id2∗id3(使用 T→F)⇒id1+id2∗id3(使用 F→id) \begin{align*} E & \Rightarrow E + T \quad \text{(使用 } E \to E + T\text{)} \\ & \Rightarrow E + T * F \quad \text{(使用 } T \to T * F\text{)} \\ & \Rightarrow E + T * \text{id}_3 \quad \text{(使用 } F \to \text{id}\text{)} \\ & \Rightarrow E + F * \text{id}_3 \quad \text{(使用 } T \to F\text{)} \\ & \Rightarrow E + \text{id}_2 * \text{id}_3 \quad \text{(使用 } F \to \text{id}\text{)} \\ & \Rightarrow T + \text{id}_2 * \text{id}_3 \quad \text{(使用 } E \to T\text{)} \\ & \Rightarrow F + \text{id}_2 * \text{id}_3 \quad \text{(使用 } T \to F\text{)} \\ & \Rightarrow \text{id}_1 + \text{id}_2 * \text{id}_3 \quad \text{(使用 } F \to \text{id}\text{)} \end{align*}EE+T(使用EE+T)E+TF(使用TTF)E+Tid3(使用Fid)E+Fid3(使用TF)E+id2id3(使用Fid)T+id2id3(使用ET)F+id2id3(使用TF)id1+id2id3(使用Fid)

✅ 最终得到句子:$ \text{id}_1 + \text{id}_2 * \text{id}_3 $

注意:这是最右推导,因此每次都优先展开最右边的非终结符(如先处理 $ T $ 中的 $ F $,再往左处理 $ E $)。


2. 推导的树结构(语法树)

E / | \ E + T /| \ / | \ T F T * F /|\ \ /|\ \ F id2 id3 | id1

更清晰地表示为:

E / | \ E + T | / \ T T * | | | F F id3 | | id1 id2

但实际上,根据推导顺序,应为:

E / | \ E + T | / \ T T * | | | F F F | | | id1 id2 id3

但注意:由于 $ T \to T * F $,所以中间的 $ T $ 应该是递归生成的。正确语法树如下:

E / | \ E + T /|\ /|\ T T * F | | | F F id3 | | id1 id2

而最底层的 $ T \to F \to \text{id}_2 $,所以完整结构是左递归展开。

最终语法树反映了左结合的+*,且*优先级高于+


3. 短语分析

基于上述最右推导过程,识别短语与直接短语:

  • 短语:在一个句型中,能被某个非终结符逐步推导出的子串称为该非终结符的短语。
  • 直接短语(素短语):仅通过一步推导就能得到的短语(即使用一次产生式替换)。

分析句型 $ \text{id}_1 + \text{id}_2 * \text{id}_3 $ 的各部分:

子串对应非终结符是否为短语是否为直接短语理由
$ \text{id}_1 $$ F $$ F \Rightarrow \text{id}_1 $
$ \text{id}_2 $$ F $$ F \Rightarrow \text{id}_2 $
$ \text{id}_3 $$ F $$ F \Rightarrow \text{id}_3 $
$ \text{id}_2 * \text{id}_3 $$ T $$ T \Rightarrow T * F \Rightarrow^* \text{id}_2 * \text{id}_3 $
$ \text{id}_1 + \text{id}_2 * \text{id}_3 $$ E $整个句子由 $ E $ 推导而来

此外:

  • $ \text{id}_1 $ 是相对于 $ T $ 的短语吗?→ 是,因为 $ T \Rightarrow F \Rightarrow \text{id}_1 $
  • 直接短语只有那些一步推出的:$ \text{id}_1, \text{id}_2, \text{id}_3 $
  • 句柄(handle)是最左直接短语,在最右推导中用于规约的关键部分,此处为 $ \text{id}_3 $(首次规约对象)

总结

  • 文法定义了一个典型的表达式文法,支持加法和乘法,具有左递归以实现左结合。
  • 最右推导展示了如何从 $ E $ 一步步生成目标句子,强调了运算符优先级(*高于+)。
  • 语法树直观体现结构:+的右操作数是一个T(即id2 * id3),说明*先结合。
  • 短语分析有助于理解语义计算和语法分析器设计(如 LR 分析器中的规约动作)。
http://www.jsqmd.com/news/156236/

相关文章:

  • 从文法的开始符号出发,尝试通过一系列最左推导,构造出与输入串完全匹配的语法树
  • 2025.11.5社区智慧共享资源管理系统(部署和运行文档)
  • 2025.10.28校园绿色能源监测与管理MIS系统(功能模块)
  • PyTorch-CUDA-v2.6镜像更新日志:新增支持哪些功能?
  • Springmvc的底层原理流程描述
  • (旧文)聊聊在Android跑RPG Maker游戏那点事
  • 布尔表达式的文法与代码结构在编译原理中属于**中间代码生成**阶段的重要内容
  • 2025.11.1非遗声景漫游馆(用户使用文档)
  • 2025.10.29校园绿色能源监测与管理MIS系统(部署和运行指南)
  • 2025.11.2非遗声景漫游馆(项目完成报告)
  • 2025.10.25故事生成系统介绍
  • 水处理自动化:西门子1500PLC与WinCC7.5的完美结合
  • FIRST/FOLLOW 集是编译原理中语法分析阶段的重要工具,主要用于自顶向下语法分析(如 LL(1) 分析)
  • 质子交换膜燃料电池:稳态与动态建模、仿真分析及特性研究
  • 质子交换膜燃料电池:稳态与动态建模、仿真分析及特性研究
  • 自动驾驶,AutoWareAuto框架全框架梳理思维导图及代码注释。 授人以鱼不如授人以渔,涵...
  • 三菱通过485BD板CRC指令通讯示例(不含详细校验程序)
  • 江湖四门:邪术门派的绝密智慧
  • 【Wireshark网络抓包】完整教程 原理+实操+实战 零基础精通
  • 昆仑 MCGS 与台达 B2 伺服通过 Modbus RTU 通讯控制教程
  • 12款常见降ai率工具大汇总(含免费降ai率版)
  • 西门子S7 - 200与两台变频器Modbus RTU通信实战
  • 112-西门子1200PLC博途程序,博图版本V14及以上,具体为双行星动力搅拌桨混合机项目...
  • **预测分析法** 是一种 **自顶向下** 的语法分析技术,常用于实现如 **LL(1)** 分析器
  • 西门子博图电机控制块实战指南
  • 2款常见降ai率工具大汇总(含免费降ai率版,还有免费ai查重!)
  • 基于卷积神经网络的图像识别算法实现
  • 线程池配置-七大关键参数
  • 如何在PyTorch中使用混合精度训练加速模型收敛?
  • 目标是对输入串 `abbcde#` 进行**自底向上的规范归约**,即使用 LR 分析技术中的“移进-归约”方式