예제 #1
0
 /**
  * Consume
  *
  * @param  [:text.parse.Rule] $rules
  * @param  text.parse.Tokens $tokens
  * @param  var[] $values
  * @return text.parse.Consumed
  */
 public function consume($rules, $tokens, $values)
 {
     while (isset($this->tokens[$tokens->token()[0]])) {
         $token = $tokens->token();
         $values[] = is_array($token) ? $token[1] : $token;
         $tokens->forward();
     }
     return new Values($values);
 }
예제 #2
0
 /**
  * Consume
  *
  * @param  [:text.parse.Rule] $rules
  * @param  text.parse.Tokens $tokens
  * @param  var[] $values
  * @return text.parse.Consumed
  */
 public function consume($rules, $tokens, $values)
 {
     $case = $tokens->token();
     if (isset($this->lookup[$case[0]])) {
         $tokens->forward();
         return $this->lookup[$case[0]]->consume($rules, $tokens, [is_array($case) ? $case[1] : $case]);
     } else {
         return new Unexpected(sprintf('Unexpected %s, expecting to match %s', $tokens->nameOf($case), implode(', ', array_map([$tokens, 'nameOf'], array_keys($this->lookup)))), $tokens->line());
     }
 }
예제 #3
0
 /**
  * Consume
  *
  * @param  [:text.parse.Rule] $rules
  * @param  text.parse.Tokens $tokens
  * @param  var[] $values
  * @return text.parse.Consumed
  */
 public function consume($rules, $tokens, $values)
 {
     $token = $tokens->token();
     if ($token[0] === $this->token) {
         $tokens->forward();
         return new Values(is_array($token) ? $token[1] : $token);
     } else {
         return new Unexpected(sprintf('Unexpected %s, expecting %s', is_array($token) ? token_name($token[0]) : $token, is_int($this->token) ? token_name($this->token) : $this->token), $tokens->line());
     }
 }
예제 #4
0
 /**
  * Consume
  *
  * @param  [:text.parse.Rule] $rules
  * @param  text.parse.Tokens $tokens
  * @param  var[] $values
  * @return text.parse.Consumed
  */
 public function consume($rules, $tokens, $values)
 {
     $token = $tokens->token();
     foreach ($this->rules as $try) {
         $result = $try->consume($rules, $tokens, []);
         if ($result->matched()) {
             return $result;
         }
     }
     return new Unexpected('Unexpected ' . $tokens->nameOf($token), $tokens->line());
 }
예제 #5
0
 /**
  * Consume
  *
  * @param  [:text.parse.Rule] $rules
  * @param  text.parse.Tokens $tokens
  * @param  var[] $values
  * @return text.parse.Consumed
  */
 public function consume($rules, $tokens, $values)
 {
     $text = '';
     do {
         $token = $tokens->token();
         if ("\n" === $token) {
             break;
         } else {
             $text .= is_array($token) ? $token[1] : $token;
         }
         $tokens->forward();
     } while ($token);
     return new Values(trim($text));
 }
예제 #6
0
 /**
  * Consume
  *
  * @param  [:text.parse.Rule] $rules
  * @param  text.parse.Tokens $tokens
  * @param  var[] $values
  * @return text.parse.Consumed
  */
 public function consume($rules, $tokens, $values)
 {
     if (!$this->started) {
         $first = $tokens->token();
         if ($first === $this->open) {
             $tokens->forward();
         } else {
             return new Unexpected($tokens->nameOf($first) . ', expecting ' . $this->open, $tokens->line());
         }
     }
     if (null === ($block = $tokens->block($this->open, $this->close))) {
         return new Unexpected('End of file', $tokens->line());
     } else {
         return new Values(trim($block));
     }
 }