EBNF 语法图:把形式语法画成可读的推导图
简介
EBNF 是描述形式语言语法的标准记法:一条条产生式写下来,结构严谨,但对不熟悉的人来说像天书。expr = term , { ( "+" | "-" ) , term } ; 这一行里逗号是连接、{ } 是零次或多次、圆括号是分组、| 是择一,每种记号都对应不同的推导行为。
把文法画成图,规则的层次、循环和分支就一眼可见。PlantUML 内置了 @startebnf 引擎,直接吃标准 EBNF 文本输出推导图;Mermaid 没有文法引擎,但用流程图的节点和回环完全可以手工复现同一套结构。下面用一个小型算术表达式文法做对照。
PlantUML 版
PlantUML 的 @startebnf 基本就是 EBNF 本身:每行一条产生式,用 = 定义左侧符号、右侧是它的展开,末尾分号收尾。下面这段就是完整的表达式文法:
1 | @startebnf |
渲染出来是一张自上而下的推导图:expr 在顶部,往下依次是 term、factor、number、digit。{ } 画成回环箭头,表示零次或多次;| 画成分叉;factor 到 "(" , expr , ")" 的那条边就是递归——左括号里又是一个 expr。
几个容易踩的记号:{ } 前面的逗号是连接符,不能省;| 两边要有空格("+" | "-" 而不是 "+"|"-");? 是特殊序列标记,* 是重复次数标记,都是 PlantUML 的扩展而不是标准 EBNF。想给规则加注释,用 (* ... *) 写在元素后面即可。
Mermaid 版
Mermaid 没有文法引擎,所以要把每条产生式翻译成节点:菱形表示”重复还是停止”的判定,回环箭头表示 { },两条出边分别对应 | 的两个分支。
1 | flowchart TD |
对照着看:TERM 下面的菱形就是 term = factor , { ( "*" | "/" ) , factor } 里的花括号,yes 分支回到 TERM 自身、no 分支往下走,正好是”重复或终止”的语义;FACTOR 的两条出边对应 number 和 "(" , expr , ")" 两条产生式;PAREN 指回 EXPR,把递归画了出来。
注意 Mermaid 里标签中的特殊字符要放进双引号,节点文字里的 (、) 也用引号包住更稳妥。另外 end 是 Mermaid 的流程图关键字,用作节点 id 会让渲染报错,所以上面的终止节点用了 FIN 这样的名字。
对比 / Side-by-side
| 维度 | PlantUML @startebnf |
Mermaid flowchart |
|---|---|---|
| 输入方式 | 直接粘贴标准 EBNF 文法 | 需要人工把每条产生式拆成节点和边 |
循环 { } 的表达 |
引擎自动画成回环箭头 | 手写回环边(节点指向自身) |
择一 | 的表达 |
引擎自动分叉 | 手写两条带 yes/no 标签的出边 |
| 递归 | 自动识别并画成回到自身的边 | 手写回指边,容易漏 |
| 扩展记号 | 支持 ? 特殊序列、* 重复次数、(* 注释 *) |
只能塞进节点文字,没有语义 |
| 文法更新时的成本 | 改一行文法,图跟着变 | 每条规则都要手动改节点 |
小结
@startebnf 的思路是”把文法交给引擎”,标准 EBNF 贴进去就能得到一张规范的推导图,适合写语言规范、做评审;Mermaid 的思路是”把文法翻译成流程图”,多花功夫,但能随意加中文注释、配色和业务说明。做技术文档时先用 PlantUML 快速生成骨架,确认规则无误后再决定要不要补一张更易读的 Mermaid 版,往往是最高效的组合。
- 标题: EBNF 语法图:把形式语法画成可读的推导图
- 作者: puml.online
- 创建于 : 2026-10-26 01:00:51
- 更新于 : 2026-10-26 01:06:21
- 链接: https://puml.online/blog/ebnf-grammar-as-diagram/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。