code: private AstRoot parseNext() {
      switch (skipWS()) {
        case '(':  return parseFunctionApplication();
        case '{':  return parseFunctionDefinition();
        case '[':  return parseList();
        case '\"': case '\'':
          return new AstStr(string());
        case ' ':  throw new IllegalASTException("Expected an expression but ran out of text");
        default :  return parseNumberOrId();
      }
    }
docs: Parse and return the next expression from the rapids string.
  '('   a nested function application expression ')
  '{'   a nested function definition  expression '}'
  '['   a numeric list expression, till ']'
  '"'   a String (double quote): attached_token
  "'"   a String (single quote): attached_token
  digits: a double
  letters or other specials: an ID