code: function parse(sent, grammar, tokenizer) {
    let tokens = (tokenizer || tokenize)(sent, grammar || rules.rules);
    let states = earley(tokens, grammar || rules.rules);
    return dfs(states, tokens);
  }
docs: Tokenizes, then parses, the input string with the given grammar. The result
  is a parse tree represented with plain objects. See
  {@link module:lib/parser.dfs|dfs()} for an example of the structure of a
  parse tree
  
  @function parse
  @memberof module:lib/parser
  @param {string} sent - Input string to parse
  @param {Rule[]|CFG} grammar - Set of Rules that define a language
  @param {Function} [tokenizer=#tokenize} - Function that accepts a string and
  a grammar (optionally) and splits the input string into tokens, each
  representing a symbol in the language
  @return {object} Root node of the parse tree