Making use of kgt in Emacs Org-mode with a new Babel driver.
kgt is an excellent tool written by @thingskatedid for converting E?BNF grammars into railroad diagrams. I like to write literate blog posts using Babel in Org-mode so I decided to flex my non-existent elisp powers and write a new Babel backend – that tiny bit of glue between Org-mode and a compiler, interpreter or useful CLI tool.
The ob-kgt driver has :in and :out parameters as well as the standard babel features. For example, the following source block will generate an ASCII railroad in a results block.
#+begin_src kgt :in bnf :out rrtext
<expr> ::= <term> "+" <expr>
| <term>
#+end_src
By default, :in=bnf and :out=rrutf8 for Unicode railroad diagrams.
Setting Up
ob-kgt.el is currently available from my dotfiles here:
You need to put ob-kgt.el in your Emacs load path and then add (kgt . t) to your
org-babel-load-languages.
kgt needs to be installed on your machine. You can get hold of kgt here:
You can find out more about Org Babel here:
ASCII Output
#+begin_src kgt :out rrtext
<expr> ::= <term> "+" <expr>
| <term>
#+end_src
expr:
||--v-- term -- "+" -- expr -->--||
| |
`--------- term ----------'
Unicode Output
#+begin_src kgt
<expr> ::= <term> "+" <expr>
| <term>
#+end_src
expr:
│├──╮── term ── "+" ── expr ──╭──┤│
│ │
╰───────── term ──────────╯
SVG Output
#+begin_src kgt :out svg :file expr.svg :results file
<expr> ::= <term> "+" <expr>
| <term>
<term> ::= <factor> "*" <term>
| <factor>
<factor> ::= "(" <expr> ")"
| <const>
<const> ::= <integer>
#+end_src