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"
J'aime beaucoup, par ailleurs, la représentation railroad des grammaires.
Le site bottlecap.de offre en particulier de jolies représentations.
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"
no references
referenced by:
referenced by:
referenced by:
referenced by:
::= pre-release_identifier ( '.' pre-release_identifier )
referenced by:
referenced by:
referenced by:
referenced by:
referenced by:
::= '0'
referenced by:
referenced by:
referenced by:
referenced by:
referenced by:
digit ::= '0'
referenced by:
::= '1'
| '2'
| '3'
| '4'
| '5'
| '6'
| '7'
| '8'
| '9'
referenced by:
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:
![]() |