Skip to content

Latest commit

 

History

History
113 lines (80 loc) · 2.58 KB

bnf.adoc

File metadata and controls

113 lines (80 loc) · 2.58 KB

BNF 文法

BNF 概念

语法

语法是产生规则的集合,由一个或多个产生规则组成。

产生规则

产生规则格式如下:

symbol ::= expression

::= 左边的语法符号称为规则的左手边(LHS, left-hand side)。

::= 右边的语法符号称为规则的右手边(RHS, right-hand side)。

终结符

终结符只能出现在规则的右手边, 可以是符号/字符串/模式.

非终结符

非终结符可以出现在规则的左手边, 也可以出现在规则的右手边.

语法操作符

Table 1. 语法操作符表

操作符

说明

A?

可选 A

A B

匹配 A 后跟着 B

A | B

匹配 A 或者 B

A - B

匹配 A 不匹配 B

A+

至少匹配一个 A

A*

匹配 0 个或多个 A

W3C EBNF 语法

ENBF 是对 BNF 的扩展,EBNF 有很多变种, W3C EBNF 是其中一种。

W3C EBNF 是 BNF 的一种扩展,下面使用 W3C EBNF 描述了 W3C EBNF 的语法。

W3C EBNF Syntax
Grammar  ::= Production*
Production
         ::= NCName '::=' ( Choice | Link )
NCName   ::= [http://www.w3.org/TR/xml-names/#NT-NCName]
Choice   ::= SequenceOrDifference ( '|' SequenceOrDifference )*
SequenceOrDifference
         ::= (Item ( '-' Item | Item* ))?
Item     ::= Primary ( '?' | '*' | '+' )*
Primary  ::= NCName | StringLiteral | CharCode | CharClass | '(' Choice ')'
StringLiteral
         ::= '"' [^"]* '"' | "'" [^']* "'"
CharCode ::= '#x' [0-9a-fA-F]+
CharClass
         ::= '[' '^'? ( Char | CharCode | CharRange | CharCodeRange )+ ']'
Char     ::= [http://www.w3.org/TR/xml#NT-Char]
CharRange
         ::= Char '-' ( Char - ']' )
CharCodeRange
         ::= CharCode '-' CharCode
Link     ::= '[' URL ']'
URL      ::= [^#x5D:/?#]+ '://' [^#x5D#]+ ('#' NCName)?
Whitespace
         ::= S | Comment
S        ::= #x9 | #xA | #xD | #x20
Comment  ::= '/*' ( [^*] | '*'+ [^*/] )* '*'* '*/'

语法可视化

BNF 语法描述

算术表达式语法
expression ::= term | term "+" expression
term       ::= factor | factor "*" term
factor     ::= constant | variable | "(" expression ")"
variable   ::= "x" | "y" | "z"
constant   ::= digit | digit constant
digit      ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

语法铁道图

term ::= factor | factor "*" term

term

factor ::= constant | variable | "(" expression ")"

factor

variable ::= "x" | "y" | "z"

variable

digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

digit