EBNF 语法图:把形式语法画成可读的推导图

EBNF 语法图:把形式语法画成可读的推导图

puml.online

简介

EBNF 是描述形式语言语法的标准记法:一条条产生式写下来,结构严谨,但对不熟悉的人来说像天书。expr = term , { ( "+" | "-" ) , term } ; 这一行里逗号是连接、{ } 是零次或多次、圆括号是分组、| 是择一,每种记号都对应不同的推导行为。

把文法画成图,规则的层次、循环和分支就一眼可见。PlantUML 内置了 @startebnf 引擎,直接吃标准 EBNF 文本输出推导图;Mermaid 没有文法引擎,但用流程图的节点和回环完全可以手工复现同一套结构。下面用一个小型算术表达式文法做对照。

PlantUML 版

PlantUML 的 @startebnf 基本就是 EBNF 本身:每行一条产生式,用 = 定义左侧符号、右侧是它的展开,末尾分号收尾。下面这段就是完整的表达式文法:

1
2
3
4
5
6
7
8
@startebnf
title Mini expression grammar
expr = term , { ( "+" | "-" ) , term } ;
term = factor , { ( "*" | "/" ) , factor } ;
factor = number | "(" , expr , ")" ;
number = digit , { digit } ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
@endebnf

渲染出来是一张自上而下的推导图:expr 在顶部,往下依次是 term、factor、number、digit。{ } 画成回环箭头,表示零次或多次;| 画成分叉;factor 到 "(" , expr , ")" 的那条边就是递归——左括号里又是一个 expr。

几个容易踩的记号:{ } 前面的逗号是连接符,不能省;| 两边要有空格("+" | "-" 而不是 "+"|"-");? 是特殊序列标记,* 是重复次数标记,都是 PlantUML 的扩展而不是标准 EBNF。想给规则加注释,用 (* ... *) 写在元素后面即可。

Mermaid 版

Mermaid 没有文法引擎,所以要把每条产生式翻译成节点:菱形表示”重复还是停止”的判定,回环箭头表示 { },两条出边分别对应 | 的两个分支。

1
2
3
4
5
6
7
8
9
10
11
12
flowchart TD
EXPR["expr"] --> TERM["term"]
TERM --> TOP{"repeat ( '+' | '-' ) term"}
TOP -->|yes| TERM
TOP -->|no| FACTOR["factor"]
FACTOR --> NUMBER["number"]
FACTOR --> PAREN["'(' expr ')'"]
PAREN --> EXPR
NUMBER --> DIGIT["digit"]
DIGIT --> DREP{"repeat digit"}
DREP -->|yes| DIGIT
DREP -->|no| FIN(["end of expr"])

对照着看: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 进行许可。
目录
EBNF 语法图:把形式语法画成可读的推导图