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
:out=rrutf8 for Unicode railroad diagrams.
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
kgt needst to be installed on your machine. You can get hold of kgt here:
You can find out more about Org Babel here:
#+begin_src kgt :out rrtext <expr> ::= <term> "+" <expr> | <term> #+end_src
expr: ||--v-- term -- "+" -- expr -->--|| | | `--------- term ----------'
#+begin_src kgt <expr> ::= <term> "+" <expr> | <term> #+end_src
expr: │├──╮── term ── "+" ── expr ──╭──┤│ │ │ ╰───────── term ──────────╯
#+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