# Railroad diagrams

Right now this is WIP - work in progress!

But let me tell you: Railroad diagrams are a great thing!

Let's start by collecting the pieces

## Grammar tools and generators

### KGT: Kate's Grammar Tool

[Kate's Grammar Tool](https://katef.github.io/kgt/)
> Do you want to convert various kinds of BNF to other kinds of BNF? No? Well imagine if you did! This would be the tool for you.

Try it online at https://arthursonzogni.com/Diagon/#code_area

![146.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1606157367014/FcQDVmzIJ.png)

Building KGT on Ubuntu 20.04:

    git clone https://github.com/katef/kgt.git
    cd kgt
    sudo apt update
    sudo apt install pmake build-essential
    pmake
    build/bin/kgt --help

Assume this file `INPUT.abnf.txt`:
```
expr = term "+" expr / term

term = factor "*" term / factor

factor = "(" expr ")" / const

const = integer
```

Create all known output formats from file `INPUT.abnf.txt`:

```
#!/bin/bash
set -x

# AST - input or output
kgt -l abnf -e abnf     < INPUT.abnf.txt >result.abnf.txt
kgt -l abnf -e bnf      < INPUT.abnf.txt >result.bnf.txt
kgt -l abnf -e iso-ebnf < INPUT.abnf.txt >result.iso-ebnf.txt
kgt -l abnf -e wsn      < INPUT.abnf.txt >result.wsn.txt

# AST - output
kgt -l abnf -e ebnfhtml5 < INPUT.abnf.txt >result.ebnfhtml5.txt
kgt -l abnf -e blab      < INPUT.abnf.txt >result.blab.txt
kgt -l abnf -e dot       < INPUT.abnf.txt >result.dot.txt
kgt -l abnf -e sid       < INPUT.abnf.txt >result.sid.txt

# RRD tree
kgt -l abnf -e rrdot    < INPUT.abnf.txt >result.rrdot.txt
kgt -l abnf -e rrdump   < INPUT.abnf.txt >result.rrdump.txt
kgt -l abnf -e rrll     < INPUT.abnf.txt >result.rrll.txt
kgt -l abnf -e rrparcon < INPUT.abnf.txt >result.rrparcon.txt
kgt -l abnf -e rrta     < INPUT.abnf.txt >result.rrta.txt

# tnode tree
kgt -l abnf -e svg      < INPUT.abnf.txt >result.svg.txt
kgt -l abnf -e rrtext   < INPUT.abnf.txt >result.rrtext.txt
kgt -l abnf -e rrtdump  < INPUT.abnf.txt >result.rrtdump.txt
``` 

This is how `result.svg.svg` looks like:
![144.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1606153420498/8jEbDJjOx.png)

Here is `result.rrutf8.txt`:
```
expr:
    │├──╮── term ── "+" ── expr ──╭──┤│
        │                         │
        ╰───────── term ──────────╯

term:
    │├──╮── factor ── "*" ── term ──╭──┤│
        │                           │
        ╰───────── factor ──────────╯

factor:
    │├──╮── "(" ── expr ── ")" ──╭──┤│
        │                        │
        ╰──────── const ─────────╯

const:
    │├── integer ──┤│
```


This is how `result.rrtext.txt` looks like:

```
expr:
    ||--v-- term -- "+" -- expr -->--||
        |                         |
        `--------- term ----------'

term:
    ||--v-- factor -- "*" -- term -->--||
        |                           |
        `--------- factor ----------'

factor:
    ||--v-- "(" -- expr -- ")" -->--||
        |                        |
        `-------- const ---------'

const:
    ||-- integer --||
```
Here is file `result.rrta.txt`:
```
add('expr', Diagram(
  Choice(0,
    Sequence(
      NonTerminal("term"),
      Terminal("+"),
      NonTerminal("expr")),
    NonTerminal("term"))));

add('term', Diagram(
  Choice(0,
    Sequence(
      NonTerminal("factor"),
      Terminal("*"),
      NonTerminal("term")),
    NonTerminal("factor"))));

add('factor', Diagram(
  Choice(0,
    Sequence(
      Terminal("("),
      NonTerminal("expr"),
      Terminal(")")),
    NonTerminal("const"))));

add('const', Diagram(
  NonTerminal("integer")));
```

'tabatkins' generator then can produce output like

![grafik.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1606156830076/CBOao_PVj.png)


### tabatkins/railroad-diagrams !!!
[Railroad-diagram Generator](https://github.com/tabatkins/railroad-diagrams)

> A small JS+SVG library for drawing railroad syntax diagrams, like on JSON.org. Now with a Python port!

[online demo](https://tabatkins.github.io/railroad-diagrams/generator.html) // 
[Python README](https://github.com/tabatkins/railroad-diagrams/blob/gh-pages/README-py.md)

### parcon
> [Parcon](http://www.opengroove.org/parcon/parcon-tutorial.html) is a Python parser combinator library written by Alexander Boyd. It's designed to be easy to learn, easy to use, and to provide informative error messages. Parcon also allows parsing using BNF grammars.

[`pip install parcon`](https://pypi.org/project/parcon/)

### Sid
> [sid](http://www.tendra.org/sid-userguide) turns specifications of languages into programs that recognise those languages (Katherine Flavel, The TenDRA Project).

### lukaslueg railroad_dsl
> [A small DSL](https://github.com/lukaslueg/railroad_dsl) to generate syntax diagrams


