道生一,一生二,二生三,三生万物
https://en.wikipedia.org/wiki/Context-free_grammar
1. 名词解释
Context-free grammar
:就是上下文无关文法,是一种形式文法(formal grammar)。形式文法
是形式语言(formal language)的文法,由一组产生规则(production rules)组成,描述该形式语言中所有可能的字符串形式。形式文法一般可分为四大类:无限制文法(unrestricted grammars),上下文相关文法,上下文无关文法和正则文法(Regular grammar)。
Terminal symbols
: 终结符,可以理解为基础符号,词法符号,是不可替代的,天然存在,不能通过文法规则生成!
Nonterminal symbols
: 非终结符,或者句法变量。
Production rules
: grammar 是由终结符集和、非终结符集和和产生规则共同组成。产生规则定义了符号之间如何转换替代。规则的左侧是规则头,是可以被替代的符号;右侧是规则体,是具体的内容。
例如:
<digit> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
<integer> ::= ['-'] <digit> {<digit>}
符号(-,0,1,2,3,4,5,6,7,8,9)是终结符,符号(<digit>,<integer>
)是非终结符。那么根据 integer 的生成规则,字符串 “0056, 0000, -000, -111” 都符合文法,可被解析。
再例如:
S -> cAd
A -> a|ab
该例中,(a, b, c, d) 为终结符,(S, A) 为非终结符,字符串"cad",“cabd” 符合文法规则。
2. BNF
在语言学中,Context-free grammar 常被称为短语结构文法(phrase structure grammar );在计算机领域,Context-free grammar 被称为 Backus normal form (BNF)。
BNF 主要用于对编程语言、文档格式、指令集、或者通信协议等的语法定义。它的应用非常广泛,大到使用BNF定义编程语言和语法规则(编程语言,SQL语法)、指令集,小到使用BNF编写伪代码,以便于他人也能够读懂其中的含义。
BNF的核心是推导规则(产生式)、约定符号和关键字(文本约定),使用这些约定的符号和产生式就可以完成某种语义的描述。
例如:
关键字
identifier ::= unquoted_identifier | quoted_identifier
unquoted_identifier ::= re('[a-zA-Z][a-zA-Z0-9_]*')
quoted_identifier ::= '"' (any character where " can appear if doubled)+ '"'
常量
constant ::= string | integer | float | boolean | uuid | blob | NULL
string ::= '\'' (any character where ' can appear if doubled)+ '\''
'$$' (any character other than '$$') '$$'
integer ::= re('-?[0-9]+')
float ::= re('-?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9+])?') | NAN | INFINITY
boolean ::= TRUE | FALSE
uuid ::= hex{8}-hex{4}-hex{4}-hex{4}-hex{12}
hex ::= re("[0-9a-fA-F]")
blob ::= '0' ('x' | 'X') hex+
BNF定义自身的例子
syntax := { rule }
rule := identifier ":=" expression
expression:= term { "|" term }
term := factor { factor }
factor := identifier |
quoted_symbol |
"(" expression ")" |
"[" expression "]" |
"{" expression "}"
identifier:= letter { letter | digit }
quoted_symbol:= """ { any_character } """
该段的含义是:
- syntax 由一个或多个 rule 组成;
- rule 由 identifier 加上符号
:=
和 expression 表示; - expression 由一个或多个由
|
分割的 term 组成; - term 由一个或多个 factor 组成;
- factor 由 identifier 或 quoted_symbol 或 3 种括号括起来的 expression 表示;
- identifier 由字符或者数字组成;
- quoted_symbol 由双引号括起来的任何字符组成;
3. ASN.1
BNF 标记了 ASN.1, 使它称为一种抽象的数据描述语言,类似于编程语言,ASN.1 也有相应的语法。ASN.1 种的基本元素包括:标识符,关键字,基本词汇/词。由这些基本的元素和类型,可推导出更复杂的、抽象的数据类型和结构。
ASN.1: Specification of basic notation
ASN.1 中常见的符号及含义: