Detalhes do pacote

ebnf2railroad

matthijsgroen617MIT1.14.1

EBNF to Railroad diagram

ebnf, context-free grammar, railroad, railroad diagram

readme (leia-me)

EBNF 2 RailRoad

npm code style: prettier license

A command line tool to create great documentation including railroad diagrams based on the ISO/IEC 14977 specification

Features

  • Creates optimized visual syntax diagrams based on the EBNF syntax
  • Quick navigation using references of used declarations
  • Nice comment markup using markdown
  • Validates if document is complete and has no duplicate declarations
  • Shows pretty printed text syntax in the document
  • Pretty printing of the sourcefile
  • Table of contents indicating root elements, character sets, common elements and recursion
  • Generation of large overview diagrams for root elements

Installation

npm install -g ebnf2railroad

Usage from command line

Usage: ebnf2railroad [options] <file>

Converts an ISO/IEC 14977 EBNF file to a HTML/Markdown file with SVG railroad diagrams

Options:

  -V, --version          output the version number
  -q, --quiet            suppress output to STDOUT
  -o, --target [target]  output the file to target destination.
  --no-target            skip writing output HTML
  -t, --title [title]    title to use for HTML document
  --lint                 exit with status code 2 if EBNF document has warnings
  --write-style          rewrites the source document with styled text
  --no-optimizations     does not try to optimize the diagrams
  --no-overview-diagram  skip creating overview diagrams for root elements
  --no-diagram-wrap      does not wrap diagrams for width minimization
  --no-text-formatting   does not format the output text version (becomes single line)
  --dump-ast             dump EBNF file AST to target destination for further processing
  --read-ast             input file is in the AST format
  -h, --help             output usage information

Examples

To generate HTML documentation of the EBNF file:

ebnf2railroad --title 'My Title' inputfile.ebnf -o outputfile.html

To only verify the EBNF file:

ebnf2railroad --lint inputfile.ebnf --no-target

To prettify the source EBNF file:

ebnf2railroad --write-style inputfile.ebnf --no-target

Online examples

Check the examples folder for an example input file and the generated result page.

Optimizations

The following optimizations are applied:

  • Ungrouping of groups that do not affect meaning of syntax
  • Untangling of nested choice elements
  • Duplicate choices are removed
  • Pretty printing of original syntax, with wrapping, column alignment

View html result online View source View markdown result

Usage as module

const { parseEbnf, createDocumentation } = require("ebnf2railroad");

const ebnf = "definition = 'a', other, { other } | item, 'b';";
const ast = parseEbnf(ebnf); // can throw parse error exceptions
const htmlOutput = createDocumentation(ast);

Licence

The code is licensed under MIT (see LICENSE file).

Contributing

Thanks for your interest in contributing! There are many ways to contribute to this project. Get started here

Acknowledgements

changelog (log de mudanças)

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[1.14.1] - 2023-04-13

Fixed

  • Fixed an issue where repeaters written back as text did not reverse repeater sequences. (a, b, { c, d, a, b } was turned into a, b, { d, c, a, b } in the output text version).

[1.14.0] - 2023-04-13

Added

  • One ore more. Support for 'zero or more' with an empty exception. { a }- which, according to section section 5.8 of ISO/IEC 14977 means 'one or more'. Text using ( a , b ), { a, b } will automatically be optimized to { a, b }-

[1.13.1] - 2023-02-19

Fixes

  • Fix height calculation of 'Choice' element. (Had to take over element from railroad-diagrams package)

[1.13.0] - 2020-10-24

Added

  • Support for markdown output, by using a .md extension on the target filename

Fixes

  • Only remove optional around repetition if repetition is zero or more

[1.12.0] - 2020-10-10

Changes

  • Deduplication of choices is improved. Now also works for text output, and can deduplicate items when one of them has a comment.

    a | a | a (* comment *) | b => a (* comment *) | b
    
  • Improve height of overview diagrams

  • Update color scheme of dark theme
  • Improved styling of blockquotes in markdown >

Fixes

  • Exception when non-terminal lacks definition

[1.11.1] - 2020-09-23

Fixes

  • Overview diagrams should also optimize its sub elements

[1.11.0] - 2020-09-23

Added

  • Support for generation overview diagrams on root elements, skippable with --no-overview-diagram
  • Support for optimizing source definition file using --rewrite
  • Skip only diagram wrapping with --no-diagram-wrap
  • Breaking of long elements over multiple lines in optional items []
  • Plain text will now also be optimized when reasonable: Text will not be optimized when using the --no-optimizations flag.

    [ [ a ] ] => [ a ]
    [ { a } ] => { a }
    a | b | [ c | [ d | e ] ] => [ a | b | c | d | e ]
    
  • Support of detection of pure character sets. Character sets are now listed seperately at the bottom of the table of contents. A character sets is a choice of terminals, or a choice where the non-terminals are also character sets

  • Support for comments before an optional, placing the comment on the skip line and make the skip line the main line
  • Support for _ (underscore) in identifiers

Fixes

  • When elements in choices are grouped, it will now maintain the original order
  • Running out of memory for big documents

Changed

  • Show line underneath comments in railroad diagram

[1.10.0] - 2020-09-16

Added

  • Support for --dump-ast and --read-ast options to allow external processing
  • Support for identifiers starting with an uppercase letter
  • Improved error reporting. Exceptions now contain a data element with the following:

    • line The line number of the error (starting from 1)
    • pos The position within the line of the error (starting from 1)
    • expected the types of token expected by the parser (array)
    • token the token received by the parser
  • Optimisation to prevent double skip lines

Security

  • Updated dependencies to solve security vulnerabilities

Fixed

  • Display of proper line number in CLI output

[1.9.0] - 2019-01-22

Fixed

  • Improved detection for recursion and roots

[1.8.2] - 2019-01-21

Changed

  • Updated example outputs

Fixed

  • Optimization issue in choice length

[1.8.1] - 2019-01-21

Changed

  • Skip all optimizations with --no-optimizations

[1.8.0] - 2018-11-26

Added

  • Dark and light color theme

[1.7.0] - 2018-11-22

Added

  • Syntax diagram will wrap if sequences become very long
  • Split navigation bar in 3 parts. Root elements, Normal elements, Common elements
  • Added Marker of recursion in navigation list
  • Responsive design, mobile navigation, overall styling

Fixed

  • Small pretty print issues that caused weird line breaks

[1.6.0] - 2018-11-13

Added

  • Formatting of text output in the document
  • Long sequences will wrap over multiple lines
  • Choice lists between 3 and 6 items will be displayed under eachother
  • Choice lists over 6 items will be displayed as a grid
  • Option --no-text-formatting to write all text on a single line
  • Option --no-optimizations to write diagrams as-is
  • Option --no-target to skip writing documentation
  • Option --write-style to 'prettify' source documents

[1.5.0] - 2018-11-10

Added

  • Support to use package as library within other projects
  • Support for alternative characters: | -> /, !, [ ] -> (/ /), { } -> (: :)
  • Table of contents, showing structure in alphabet, or as hierarchy overview at the bottom.
  • Optimize EBNF syntax as a | a into a
  • Optimize EBNF syntax as a | a, b into a, [ b ]
  • Optimize EBNF syntax as a, b, c, g | a, b, d, g into a, b, ( c | d ), g

Fixed

  • Closing tag for Terminals with single quotes
  • Issue when the chain was optimized without repeater a, b, c, { b, c }.

[1.4.0] - 2018-11-03

Added

  • Optimize EBNF syntax as [ a | b ] in diagram as single choice with integrated skip
  • Optimize EBNF syntax as [ a | ( b | c ) ] in diagram as single choice
  • Optimize EBNF syntax as [ a | [ b | c ] ] in diagram as single choice with integrated skip
  • Demo file to demontrate markup and optimizations
  • Auto linking plain links in comments
  • HTML escaping in definition inline comments
  • Syntax highlight in text presentation of EBNF
  • Improved 'breaking' of EBNF over multiple lines

Fixed

  • Issue with optimizer in repeating elements a, b, c, { d, b, c }. the repetition showed c, b instead of b, c

[1.3.0] - 2018-11-02

Added

  • Add support for comments within statements, that will be rendered within the diagram
  • Option --title to add a title to the output document
  • Show different start/end indicators if diagram is 'complex' (refers to other definitions)
  • Better optimization of repeating elements. a, b, c, { d, b, c } will display a followed by a loop containing b, c with d as repeater.
  • Extra example file, based on json.org

Fixed

  • Text dedenting issue in comments before sending comments to markdown parser

[1.2.0] - 2018-11-01

Added

  • Show validation warnings for duplicate declarations
  • Show validation warnings for missing references
  • Option --validate to exit with status code 2 if document has warnings
  • Option --quiet to suppress output to console
  • Optimize EBNF syntax as ( a ), { a } in diagram as a+ (one or more)
  • Optimize EBNF syntax as a | { b } in diagram as choice with "skip", "a", or one or more "b"
  • Optimize EBNF syntax as a | [ b ] in diagram as choice with "skip", "a", or "b"

Changed

  • Long choice lists are now spread over multiple columns, if the length exceeds 10.
  • Updated styling of document

[1.1.0] - 2018-10-30

Added

  • --target option to specify output file
  • Parse and render EBNF comments as markdown
  • Add references to other definitions (reference To)
  • Improved exception display and exit status code
  • Support for ? special sequences ?
  • Support for 4 * "repeatable" (now fully ISO compliant... I think)
  • Let non-terminals link to definition in diagram
  • Indent multi-line statements in EBNF output
  • Optimize EBNF syntax as a, { a } in diagram as a+ (one or more)

[1.0.0] - 2018-10-29

Added

  • Parser to parse ISO/IEC 14977 EBNF files (limited support only)
  • HTML output file based on filename of input file
  • list definitions that reference another defintion (referenced From)