An expression of the form: expr1 <: expr2 . expr3 Is parsed as: ( expr1 <: expr2 ) . expr3 If expr2 contains the empty string then it's possible for the machine to escape to expr3. This can be confusing. Perhaps <: should behave like expr1 <: ( expr2 . expr3 ) By using the implementation: expr1 $1 %0 . expr2 . expr3 The |> guarded operator and the <| guarded operator need to be added. The fixed size stack is a problem for manual recursion of unlimited depth. An option to turn off the removal of duplicate actions might be useful for analyzing unintentional nondeterminism. To avoid confusion, there should be a correspondence between state numbers in the generated code, graphviz and the XML. Might be a good idea to add in some protection against using up all of a system's memory. This protection could then be removed by people when someone is sure they want to use a lot of memory. fbreak should advance the current char. Depreciate fbreak and add fctl_break; fctl_return ; fctl_goto