10 February 2021

blog ebnf railroad visualization

En travaillant sur le workfow de production de code, je reprend la description de version sémantique, vers laquelle MAA m'avait orienté.

Cette description offre une jolie grammaire EBNF.

<valid semver> ::= <version core>
                 | <version core> "-" <pre-release>
                 | <version core> "+" <build>
                 | <version core> "-" <pre-release> "+" <build>

<version core> ::= <major> "." <minor> "." <patch>

<major> ::= <numeric identifier>

<minor> ::= <numeric identifier>

<patch> ::= <numeric identifier>

<pre-release> ::= <dot-separated pre-release identifiers>

<dot-separated pre-release identifiers> ::= <pre-release identifier>
                                          | <pre-release identifier> "." <dot-separated pre-release identifiers>

<build> ::= <dot-separated build identifiers>

<dot-separated build identifiers> ::= <build identifier>
                                    | <build identifier> "." <dot-separated build identifiers>

<pre-release identifier> ::= <alphanumeric identifier>
                           | <numeric identifier>

<build identifier> ::= <alphanumeric identifier>
                     | <digits>

<alphanumeric identifier> ::= <non-digit>
                            | <non-digit> <identifier characters>
                            | <identifier characters> <non-digit>
                            | <identifier characters> <non-digit> <identifier characters>

<numeric identifier> ::= "0"
                       | <positive digit>
                       | <positive digit> <digits>

<identifier characters> ::= <identifier character>
                          | <identifier character> <identifier characters>

<identifier character> ::= <digit>
                         | <non-digit>

<non-digit> ::= <letter>
              | "-"

<digits> ::= <digit>
           | <digit> <digits>

<digit> ::= "0"
          | <positive digit>

<positive digit> ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<letter> ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J"
           | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T"
           | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d"
           | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n"
           | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x"
           | "y" | "z"
		   

Représentation railroad

J'aime beaucoup, par ailleurs, la représentation railroad des grammaires.

Le site bottlecap.de offre en particulier de jolies représentations.

Adaptation de la grammaire

Par contre, la syntaxe est légèrment différente sur le site.

Les terminaux sont indiqués sans les crochets <>, et ne peuvent pas comprendre d'espace.

En retirant les crochets, et en substituant les espaces par des '_', on obtient

validSemver ::= versionCore
                 | versionCore "-" preRelease
                 | versionCore "+" build
                 | versionCore "-" preRelease "+" build

versionCore ::= major "." minor "." patch

major ::= numeric_identifier

minor ::= numeric_identifier

patch ::= numeric_identifier

preRelease ::= dot-separated_pre-release_identifiers

dot-separated_pre-release_identifiers ::= pre-release_identifier
                                          | pre-release_identifier "." dot-separated_pre-release_identifiers

build ::= dot-separated_build_identifiers

dot-separated_build_identifiers ::= build_identifier
                                    | build_identifier "." dot-separated_build_identifiers

pre-release_identifier ::= alphanumeric_identifier
                           | numeric_identifier

build_identifier ::= alphanumeric_identifier
                     | digits

alphanumeric_identifier ::= non-digit
                            | non-digit identifier_characters
                            | identifier_characters non-digit
                            | identifier_characters non-digit identifier_characters

numeric_identifier ::= "0"
                       | positive_digit
                       | positive_digit digits

identifier_characters ::= identifier_character
                          | identifier_character identifier_characters

identifier_character ::= digit
                         | non-digit

non-digit ::= letter
              | "-"

digits ::= digit
           | digit digits

digit ::= "0"
          | positive_digit

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

letter ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J"
           | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T"
           | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d"
           | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n"
           | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x"
           | "y" | "z"

Représentation graphique railroad


validSemver:



validSemver

         ::= versionCore ( '-' preRelease )? ( '+' build )?


no references


versionCore:



versionCore

         ::= major '.' minor '.' patch


referenced by:



major:




referenced by:



minor:




referenced by:



patch:




referenced by:



preRelease:




referenced by:



build:




referenced by:



pre-release_identifier:



pre-release_identifier

         ::= alphanumeric_identifier

           | numeric_identifier


referenced by:



build_identifier:



build_identifier

         ::= alphanumeric_identifier

           | digits


referenced by:



alphanumeric_identifier:




referenced by:



numeric_identifier:



numeric_identifier

         ::= '0'

           | positive_digit digits?


referenced by:



identifier_characters:




referenced by:



identifier_character:



identifier_character

         ::= digit

           | non-digit


referenced by:



non-digit:



non-digit

         ::= letter

           | '-'


referenced by:



digits:



digits   ::= digit+


referenced by:



digit:



digit    ::= '0'

           | positive_digit


referenced by:



positive_digit:



positive_digit

         ::= '1'

           | '2'

           | '3'

           | '4'

           | '5'

           | '6'

           | '7'

           | '8'

           | '9'


referenced by:



letter:



letter   ::= 'A'

           | 'B'

           | 'C'

           | 'D'

           | 'E'

           | 'F'

           | 'G'

           | 'H'

           | 'I'

           | 'J'

           | 'K'

           | 'L'

           | 'M'

           | 'N'

           | 'O'

           | 'P'

           | 'Q'

           | 'R'

           | 'S'

           | 'T'

           | 'U'

           | 'V'

           | 'W'

           | 'X'

           | 'Y'

           | 'Z'

           | 'a'

           | 'b'

           | 'c'

           | 'd'

           | 'e'

           | 'f'

           | 'g'

           | 'h'

           | 'i'

           | 'j'

           | 'k'

           | 'l'

           | 'm'

           | 'n'

           | 'o'

           | 'p'

           | 'q'

           | 'r'

           | 's'

           | 't'

           | 'u'

           | 'v'

           | 'w'

           | 'x'

           | 'y'

           | 'z'


referenced by:












 
... generated by RR - Railroad Diagram Generator