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

巴科斯-诺尔范式与抽象语法树:CMake语法实例教程

巴科斯-诺尔范式与抽象语法树:CMake语法实例教程

在CMake的官方文档中,很多语法描述都借鉴了BNF(巴科斯-诺尔范式,Backus-Naur Form)。这是一种形式化语言描述工具,广泛用于编译器设计、解释器开发以及DSL(领域特定语言)的语法解析。

本教程将通过一个完整的CMake示例,一步步拆解BNF常见元素,并结合**BNF树(Parse Tree)AST(抽象语法树)**的概念,助你快速掌握这门必备技能。


1️⃣ BNF基础与常用符号

✨ 基本概念

符号/术语说明
<非终结符>语法结构的抽象表示,不直接出现在代码中。
"终结符"代码中必须完全一致出现的符号(含引号)。
``
*表示前面的元素可以重复0次或多次。
+表示前面的元素必须至少出现1次。
?表示前面的元素最多出现1次(可选)。
[]常用于文档说明中,表示可选,但在BNF里一般不出现。

2️⃣ CMake示例:find_package

我们以CMake最常用的 find_package 语句作为示例,先给出一条示例调用:

find_package(Qt6 6.4 REQUIRED COMPONENTS Core Widgets)

这是一个典型的调用,告诉CMake需要找到Qt6版本6.4及其Core和Widgets组件。


3️⃣ BNF完整描述示例

以下是一个示范性的BNF(并非官方,仅作教学用途):

<find_package_invocation> ::= "find_package" "(" <package_name> [<version>] [<options>] [<components>] ")"<package_name> ::= <identifier><version> ::= <number> ("." <number>)*<options> ::= <option>*<option> ::= "REQUIRED" | "QUIET" | "EXACT"<components> ::= "COMPONENTS" <component_name>+<component_name> ::= <identifier><identifier> ::= <letter> (<letter> | <digit>)*<letter> ::= "A" | ... | "Z" | "a" | ... | "z" | "_"<digit> ::= "0" | ... | "9"

🚀 一步步拆解BNF元素

  1. 非终结符(尖括号括起):
    例子:<find_package_invocation><package_name><version>等。

  2. 终结符(用引号括起):
    例子:"find_package""(""REQUIRED""COMPONENTS"

  3. 管道符(|)
    例子:"REQUIRED" | "QUIET" | "EXACT" 表示三选一。

  4. 星号(*)
    例子:<option>* 表示 <option> 可以重复0次或多次。

  5. 加号(+)
    例子:<component_name>+ 表示至少一个 <component_name>

  6. 中括号([])
    这里表示可选,并非严格BNF符号,而是文档中的辅助说明。


4️⃣ 解析示例:BNF树与AST

🌳 BNF树(Parse Tree)

对示例 find_package(Qt6 6.4 REQUIRED COMPONENTS Core Widgets),BNF树如下(简化):

<find_package_invocation>├── "find_package"├── "("├── <package_name>: Qt6├── <version>│     ├── <number>: 6│     └── "." <number>: 4├── <options>│     └── "REQUIRED"├── <components>│     ├── "COMPONENTS"│     ├── <component_name>: Core│     └── <component_name>: Widgets└── ")"

BNF树完整地展示了每一步的解析过程,包括括号和所有中间节点。


🌟 AST(抽象语法树)

相比BNF树,AST更关注语义,省略了括号等不重要的符号:

FindPackageInvocation├── PackageName: Qt6├── Version: 6.4├── Options:│     └── REQUIRED└── Components:├── Core└── Widgets

5️⃣ 小结:BNF与AST的意义

✅ 通过BNF可以:

  • 精确描述语言的语法规则。
  • 为工具(如CMake)提供严格的语法校验。

✅ 通过BNF树可以:

  • 看到每一步推导过程,适合调试语法分析器。

✅ 通过AST可以:

  • 聚焦程序的实际结构(省略括号、标点等)。
  • 为编译器/解释器提供语义分析的输入。

6️⃣ 为什么要掌握这些?

🌟 读者学了BNF及AST后,可以:

  • 更快看懂CMake的文档,尤其是复杂的find_package用法。
  • 编写自己的DSL语言或工具。
  • 理解编译器、解释器的底层工作原理。
  • 轻松跨语言迁移(BNF和AST是语言无关的)。

结语

BNF(巴科斯-诺尔范式)和AST(抽象语法树)是编程语言世界里的两把瑞士军刀,学会了它们,你就能快速解构任何语法描述,如同读懂一门新语言的说明书。🚀

如果你准备好踏上语言解析的旅程,不妨先用CMake试试手吧!

http://www.xdnf.cn/news/12159.html

相关文章:

  • 深入学习RabbitMQ队列的知识
  • RabbitMQ实用技巧
  • 18650锂电池组点焊机:高效组装锂电池的关键工具|比斯特自动化
  • c++ openssl 使用 DES(数据加密标准)进行加密和解密的基本操作
  • ​减少交通拥堵、提高效率、改善交通安全的智慧交通开源了。
  • c++算法学习4——广度搜索bfs
  • html文字红色粗体,闪烁渐变动画效果,中英文切换版本
  • 【Linux手册】冯诺依曼体系结构
  • buuctf——web刷题第二页
  • 自定义Spring Boot Starter的全面指南
  • 解决el-select选择框右侧下拉箭头遮挡文字问题
  • 自建 Derp 中继节点
  • golang 如何定义一种能够与自身类型值进行比较的Interface
  • 【论文解读】MemGPT: 迈向为操作系统的LLM
  • 13.4 AI颠覆语言学习:预录制视频+GPT-4评估如何实现60%成本降低与40%留存飙升
  • 阿里云域名怎么绑定
  • Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
  • React---day9
  • Python爬虫与Java爬虫深度对比:从原理到实战案例解析
  • 用函数实现模块化程序设计(适合考研、专升本)
  • 自定义注解facade 实现切面 进行日志记录和参数校验
  • Xcode 16.4 + iOS 18 系统运行时崩溃:___cxa_current_primary_exception 符号丢失的原因与解决方案
  • 用 n8n 提取静态网页内容:从 HTTP Request 到 HTML 节点全解析
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice在线编辑word文件保存数据同时保存文件
  • Ubuntu20.04设置为开机后直接自动进入纯命令行界面
  • mysql复合查询mysql子查询
  • 深度学习姿态估计实战:基于ONNX Runtime的YOLOv8 Pose部署全解析
  • IDEA:配置 Git 需要完成 Git 路径设置、账号认证以及仓库关联三个主要步骤
  • 目标检测实战:让AI“看见“并定位物体(superior哥AI系列第11期)
  • [Zynq] Zynq Linux 环境下 AXI UART Lite 使用方法详解(代码示例)