Search in: Word
Vietnamese keyboard: Off
Virtual keyboard: Show
Computing (FOLDOC) dictionary
Backus-Naur Form
Jump to user comments
language, grammar (BNF, originally "Backus Normal Form") A
formal metasyntax used to express context-free grammars.
Backus Normal Form was renamed Backus-Naur Form at the
suggestion of Donald Knuth.
BNF is one of the most commonly used metasyntactic notations
for specifying the syntax of programming languages, command
sets, and the like. It is widely used for language
descriptions but seldom documented anywhere (how do you
document a metasyntax?), so that it must usually be learned
by osmosis (but see RFC 2234).
Consider this BNF for a US postal address:
postal-address ::= name-part street-address zip-part
personal-part ::= name | initial "."
name-part ::= personal-part last-name [jr-part] EOL
| personal-part name-part
street-address ::= [apt] house-num street-name EOL
zip-part ::= town-name "," state-code ZIP-code EOL
This translates into English as: "A postal-address consists of
a name-part, followed by a street-address part, followed by a
zip-code part. A personal-part consists of either a first
name or an initial followed by a dot. A name-part consists of
either: a personal-part followed by a last name followed by an
optional "jr-part" (Jr., Sr., or dynastic number) and
end-of-line, or a personal part followed by a name part (this
rule illustrates the use of recursion in BNFs, covering the
case of people who use multiple first and middle names and/or
initials). A street address consists of an optional apartment
specifier, followed by a street number, followed by a street
name. A zip-part consists of a town-name, followed by a
comma, followed by a state code, followed by a ZIP-code
followed by an end-of-line."
Note that many things (such as the format of a personal-part,
apartment specifier, or ZIP-code) are left unspecified. These
lexical details are presumed to be obvious from context or
specified somewhere nearby.
There are many variants and extensions of BNF, possibly
containing some or all of the regexp wild cards such as
"*" or "+". EBNF is a common one. In fact the example
above isn't the pure form invented for the ALGOL 60 report.
"[]" was introduced a few years later in IBM's PL/I
definition but is now universally recognised. ABNF is
another extension.