bnf.rst
author Oleksandr Gavenko <gavenkoa@gmail.com>
Mon, 09 Oct 2017 10:49:36 +0300
changeset 2188 e95731eef030
parent 1912 8b81a8f0f692
child 2228 837f1337c59b
permissions -rw-r--r--
Fixed: NameError: name 'locale_encoding' is not defined File /bin/rst2html.py, line 17, in <module> from docutils.core import publish_cmdline, default_description File /usr/lib/python2.7/site-packages/docutils/core.py, line 20, in <module> from docutils import frontend, io, utils, readers, writers File /usr/lib/python2.7/site-packages/docutils/frontend.py, line 41, in <module> import docutils.utils File /usr/lib/python2.7/site-packages/docutils/utils/__init__.py, line 20, in <module> import docutils.io File /usr/lib/python2.7/site-packages/docutils/io.py, line 18, in <module> from docutils.utils.error_reporting import locale_encoding, ErrorString, ErrorOutput File /usr/lib/python2.7/site-packages/docutils/utils/error_reporting.py, line 60, in <module> codecs.lookup(locale_encoding or '') # None -> '' NameError: name 'locale_encoding' is not defined

.. -*- coding: utf-8; -*-

=====
 BNF
=====

What is BNF?
============
.. contents::
   :local:

BNF is an acronym for "Backus Naur Form". John Backus and Peter Naur introduced
for the first time a formal notation to describe the syntax of a given language
(ALGOL 60 programming language).

See: :rfc:`2234`.

BNF syntax
==========

The meta-symbols of BNF are:

  ``::=``
    Meaning "is defined as".
  ``|``
    Meaning "or".
  ``<``,  ``>``
    Angle brackets used to surround category names (some times skipped).
  ``[``,  ``]``
    Optional items are enclosed in.
  ``{``,  ``}``
    Repetitive items (zero or more times) are enclosed in.
  ``"abc..."``
    Terminals are enclosed in to distinguish them from meta-symbols.

BNF in 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 } """