my $DSL = <<'DSL'; :default ::= action => ::first lexeme default = latm => 1 start ::= sexp sexp ::= list | atom list ::= LPAREN elements RPAREN action => Sexp::Tiny::Actions::do_list elements ::= element* action => Sexp::Tiny::Actions::do_elements element ::= sexp atom ::= string | symbol string ::= DQUOTE string_chars DQUOTE action => Sexp::Tiny::Actions::do_string | DQUOTE DQUOTE action => Sexp::Tiny::Actions::do_empty_string string_chars ::= string_char+ action => Sexp::Tiny::Actions::do_join string_char ::= STRCHAR DQUOTE ~ '"' STRCHAR ~ [^"] symbol ::= symbol_chars action => Sexp::Tiny::Actions::do_symbol symbol_chars ::= symbol_char+ action => Sexp::Tiny::Actions::do_join symbol_char ::= SYMCHAR SYMCHAR ~ [^()\s"] LPAREN ~ '(' RPAREN ~ ')' :discard ~ WS WS ~ [\s]+ DSL