It's basically advocating the ML subset of OCaml, Haskell, and now Rust. Those languages all feature algebraic data types and pattern matching, which were pioneered in ML. Rust is basically a cross between ML and C++, with C-ish syntax.
http://en.wikipedia.org/wiki/ML_(programming_language)
(None of C, C++, Java, JavaScript, Python, etc. have those features, and thus they are all suboptimal for writing parsers.)
A good clue is the name -- ML stands for "meta-language". It's literally a language for describing languages.
ADTs and pattern matching are basically two sides to the same coin -- data vs code. ADTs are how you describe variants in the data. Specifically, "sum types" are essentially type-safe tagged unions (if you are a C person). And pattern matching is how you describe variants in the code. The compiler checks that you have considered all cases.
This helps you tame code with nested conditionals. Nested conditionals give rise to the state space and code path explosion that I mentioned.
Here is more recent explanation:
https://queue.acm.org/detail.cfm?id=2038036
Take a look at the OCaml vs Java code snippets.
I imagine actuaries are about the most technical "nontechnical" users there are so a DSL seems a particularly good fit.