Jump to content

Syntax diagram

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Gregg-Irwin (talk | contribs) at 22:05, 26 January 2021 (Add ABNF and Red Parse grammar examples. Tried up upload new diagram to match all examples, but wasn't allowed.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Syntax diagrams (or railroad diagrams) are a way to represent a context-free grammar. They represent a graphical alternative to Backus–Naur form or to EBNF as metalanguages. Early books using syntax diagrams include the "Pascal User Manual" written by Niklaus Wirth [1] (diagrams start at page 47) and the Burroughs CANDE Manual.[2] In the compilation field, textual representations like BNF or its variants are usually preferred. BNF is text-based, and used by compiler writers and parser generators. Railroad diagrams are visual, and may be more readily understood by laypeople, sometimes incorporated into graphic design. The canonical source defining the JSON data interchange format provides yet another example of a popular modern usage of these diagrams.

Principle of syntax diagrams

The representation of a grammar is made of a set of syntax diagrams. Each diagram defines a non-terminal. There is a main diagram which defines the language in the following way: to belong to the language, a word must describe a path in the main diagram.

Each diagram has an entry point and an end point. The diagram describes possible paths between these two points by going through other nonterminals and terminals. Terminals are represented by round boxes while nonterminals are represented by rectangular boxes.

Example

We use arithmetic expressions as an example, in various grammar formats.

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"

EBNF:

expression = term , [ "+" , expression ];
term       = factor , [ "*" , term ];
factor     = constant | variable | "(" , expression , ")";
variable   = "x" | "y" | "z"; 
constant   = digit , { digit };
digit      = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";

ABNF:

expression = term ["+" expression]
term       = factor ["*" term]
factor     = constant / variable / "(" expression ")"
variable   = "x" / "y" / "z"
constant   = 1*digit
DIGIT      = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"

Note that ABNF also supports ranges, e.g. `DIGIT = %30-39`, but it is not used here for consistency with the other examples.

Red Language Parse Dialect:

expression: [term opt ["+" expression]]
term:       [factor opt ["*" term]]
factor:     [constant | variable | "(" expression ")"]
variable:   ["x" | "y" | "z"]
constant:   [some digit]
digit:      ["0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"]

Note that this format also supports ranges, e.g. `digit: charset [#"0" - #"9"]`, but it is not used here for consistency with the other examples.


One possible set of syntax diagrams for either of these grammars is:

See also

References

Note: the first link is sometimes blocked by the server outside of its domain, but it is available on archive.org. The file was also mirrored at standardpascal.org.