/**
  * Convert a simple option list into a dict. For example:
  *
  *    legs=4, eyes=2
  *
  * ...becomes:
  *
  *    array(
  *      'legs' => '4',
  *      'eyes' => '2',
  *    );
  *
  * @param   string  Input option list.
  * @return  dict    Parsed dictionary.
  * @task parse
  */
 public function parse($input)
 {
     $result = array();
     $lexer = new PhutilSimpleOptionsLexer();
     $tokens = $lexer->getNiceTokens($input);
     $state = 'key';
     $pairs = array();
     foreach ($tokens as $token) {
         list($type, $value) = $token;
         switch ($state) {
             case 'key':
                 if ($type != 'word') {
                     return array();
                 }
                 if (!strlen($value)) {
                     return array();
                 }
                 $key = $this->normalizeKey($value);
                 $state = '=';
                 break;
             case '=':
                 if ($type == '=') {
                     $state = 'value';
                     break;
                 }
                 if ($type == ',') {
                     $pairs[] = array($key, true);
                     $state = 'key';
                     break;
                 }
                 return array();
             case 'value':
                 if ($type == ',') {
                     $pairs[] = array($key, null);
                     $state = 'key';
                     break;
                 }
                 if ($type != 'word') {
                     return array();
                 }
                 $pairs[] = array($key, $value);
                 $state = ',';
                 break;
             case ',':
                 if ($type == 'word') {
                     $pair = array_pop($pairs);
                     $pair[1] .= $value;
                     $pairs[] = $pair;
                     break;
                 }
                 if ($type != ',') {
                     return array();
                 }
                 $state = 'key';
                 break;
         }
     }
     if ($state == '=') {
         $pairs[] = array($key, true);
     }
     if ($state == 'value') {
         $pairs[] = array($key, null);
     }
     $result = array();
     foreach ($pairs as $pair) {
         list($key, $value) = $pair;
         if ($value === null) {
             unset($result[$key]);
         } else {
             $result[$key] = $value;
         }
     }
     return $result;
 }
 private function getNiceTokens($input)
 {
     $lexer = new PhutilSimpleOptionsLexer();
     return $lexer->getNiceTokens($input);
 }