+title: Laundry: Org mode for Racket
An organized racket?
How about money laundering?
Laundry list!
laundry-mode
An attempt to specify a formal grammar for [[https://orgmode.org/worg/dev/org-syntax.html][Org syntax]].
The grammars lives in [[file:./laundry/grammar/][laundry/grammar]]. The top level is in [[./laundry/grammar/org.rkt][org.rkt]]. \
The grammars are implemented using Racket's [[https://docs.racket-lang.org/brag/#%28part._.The_language%29][#lang brag]]. \
The details of the implementation are in the comments.
For an overview of the approach see [[file:./docs/overview.org]].
Laundry is available from the Racket package catalog and can be installed via
+begin_src bash
raco pkg install org laundry
+end_src
To install the development version you can run the
following from the location of this readme.
+begin_src bash
raco pkg install laundry/ laundry-test/ org/ org-tools/
+end_src
Once everything is installed you can run the tests by invoking the
following in the directory of this readme.
+begin_src bash
raco test laundry laundry-test org org-tools
+end_src
You can also parse individual Org files using [[file:./laundry-test/cli.rkt]].
+begin_src bash :results drawer
laundry-test/cli.rkt docs/thoughts.org laundry-test/test.org
+end_src
- Status
Laundry can parse most of Org syntax, though there are still issues
with the correctness of the parse in a number of cases.
In particular there are a number of edge cases in the interaction
between the syntax for various Org objects that have not been
resolved.
- Objectives
The primary objective of this work is to provide a reference grammar
and implementation that can be used to test other implementations of
org mode. The elisp implementation has inconsistent behavior in a
number of critical areas, such as the parsing of headline tags. A
reference grammar will help to elucidate the issues.
This work was originally inspired by a desire to regularize the
behavior of Org babel, however the lack of a consistent reference for
the grammar of Org as a whole turned out to be a significant stumbling
block due to the fact that Org babel interacts with nearly every
aspect of Org. Therefore work to standardize Org syntax became a
priority.
The long term goal of this work is to provide a reference that can be
used to standardize Org syntax and behavior and to specify various
levels of compliance for an implementation of Org mode.
- Performance
Until recently the performance of the parser was exceptionally bad due
to some hidden quadratic behavior in Racket =parser-tools=. To work
around this issue the tokenizer has been made more complex, so sometimes
you may find that there is an opaque token appearing in the grammar
that obscures some of the details. In most cases the full grammar
is retained, but unless it has been tested with the less complex and
slower tokenizer the full grammar may be incorrect.
- A note on terminology
The current terminology used in the [[file:./laundry/grammar][grammars]] matches the terminology
used in [[https://orgmode.org/worg/dev/org-syntax.html][Org syntax]]. This is expected to change so that, for example
terms such as =headline= will be renamed to =heading=. This has not
been done to simplify comparison to the existing Org syntax document
during early development. As such the names of the elements of the
parse tree should not be considered to be stable.
- Debugging
Change ~[debug #f]~ on line 32 of =br-parser-tools-lib= [[file:~/.racket/8.2/pkgs/br-parser-tools-lib/br-parser-tools/yacc.rkt::32][yacc.rkt]] to
point to a file (e.g. ~[debug "/tmp/parser-debug-output.rktd"]~) and then
when the parser fails you can check that file for a dump of the full
parser state at the time of failure.
Unfortunately for some reason providing that debug value does not
result in the behavior that is articulated in the documentation, and
on error the stack is not printed. You can go in and tamper inside
the parsing loop of the same file and sort of get a view into what is
going on.
https://alphapapa.github.io/org-almanac/#Parsing