anchor.diff:  
   -spec docopt(string(), string()) -> orddict:orddict().
   docopt(Doc, Args) ->
  -  Usage      = printable_usage(Doc),
  -  Options    = parse_doc_options(Doc),
  -  Pattern    = parse_pattern(formal_usage(Usage), Options),
  -  ParsedArgs = parse_args(Args, Options),
  +  Usage           = printable_usage(Doc),
  +  Opts0           = parse_doc_options(Doc),
  +  {Pattern, Opts} = parse_pattern(formal_usage(Usage), Opts0),
  +  ParsedArgs      = parse_args(Args, Opts),
     case match(fix_list_arguments(Pattern), ParsedArgs) of
       {true, [], Collected} ->
         ct:pal("\n"
  
positive.code:   %% Add spaces around []()| and ...
    Source = re:replace(Source0, "([\\[\\]\\(\\)\\|]|\\.\\.\\.)", " \\1 ",
                        [{return, list}, global]),
    State = #state{ tokens  = string:tokens(Source, " ")
                  , options = Options
                  , mode    = parse_pattern
                  },
    {Result, _} = parse_expr(State),
    #required{children=Result}.
  
  % expr ::= seq ( '|' seq )* ;
  parse_expr(State0) ->
  
negative.code:              "parsedargs: ~p\n"
               "collected:  ~p\n"
               "flat patns: ~p\n",
           [Args,Usage,Opts,Pattern,ParsedArgs,Collected,flatten(Pattern)]),
        lists:foldl(fun (Pat, Acc) ->
                        orddict:store(name(Pat), value(Pat), Acc)
                    end, orddict:new(), flatten(Pattern) ++ Options ++ Collected);
  