巴克斯-若尔范式(BNF)

概念

BNF(以及 EBNF)是一种通过编写文法来定于语言的预发的方式。其广泛用于解释和驱动语法制导翻译。

BNF 通过一系列产生式规则来描述一种语言。

1
2
3
4
5
6
7
//联系人信息的描述
contact mfowler {
email: fowler@acm.org
}

contact : 'contact' Identifier '{' 'email:' emailAddress '}' ;
emailAddress : localPart '@' domain ;

这里的文法由两条产生式规则组成,每条产生式规则分别由名称和主体两部分组成。

主体部分描述了如何将此规则分解成一系列元素,这些元素可能是别的规则或是终结符。

文法的扩展

以联系人信息添加电话号码为例,存在如下信息和文法

1
2
3
4
5
6
7
8
9
contact rparsons {
tel: 312-373-1000
}

contact : 'contact' username '{' line '}' ;
username: Identifier;
line : email | tel ;
email : 'email:' emailAddress ;
tel : 'tel:' TelephoneNumber ;
  • line 规则中的|表示选择符,表明 line 可以分为 email 或者 tel 两者情况。
  • username 规则只用来解析一个标识符,为了更清晰地展现文法的这一意图。

多重性符号

解析表达式文法

| 符号 | 含义 | 例子 |
| —- | ———- | —————- | —– | — |
| | | 选择 | email | tel |
| * | 0 个或多个 | tel* |
| + | 1 个或多个 | email+ |
| ? | 可选 | fullname? |
| ~ | 直到 | ~’}’ |
| .. | 范围 | ‘0’..’9’ |
| / | 有序选择 | us_tel / raw_tel |