protected function doScan(Scanner $scan) { $q = $scan->type(); $ok = false; $escape = false; $str = ''; while ($scan->next()) { if ($escape) { $escape = false; } else { if ($scan->token() === '\\') { $escape = true; continue; } if ($q === $scan->type()) { $ok = true; break; } } $str .= $scan->token(); } if ($ok && !$this->discard) { $scan->getContext()->push($str); } return $ok; }
protected function doScan(Scanner $scan) { $start = $scan->getState(); $int = $scan->token(); $scan->next(); if ($scan->token() !== '.') { $scan->setState($start); $res = is_null($this->number) || $this->number == $int; if ($res) { $scan->getContext()->push($int); // echo "$int | Parsed. Next token is not a point\n"; // } else { // echo "$int | Next token is not a point. Doesn't match {$this->number}\n"; } return $res; } if (!$scan->next() || $scan->type() !== Scanner::NUMBER) { $scan->setState($start); // echo "$int | Fail: not number after /\d+\./ \n"; return false; } $frac = $scan->token(); if (!is_null($this->number)) { if ("{$int}.{$frac}" != $this->number) { $scan->setState($start); // echo "$int.$frac | Parsed float doesn't match {$this->number}\n"; return false; } } $scan->getContext()->push("{$int}.{$frac}"); // echo "$int.$frac | Parsed\n"; return true; }
public function trigger(Scanner $scanner) { if ($scanner->type() !== Scanner::CHAR) { return false; } if (is_null($this->char)) { return true; } return $scanner->token() == $this->char; }
public function trigger(Scanner $scanner) { if ($scanner->type() !== Scanner::NUMBER) { return false; } if (is_null($this->num)) { return true; } return $scanner->token() == $this->num; }
public function trigger(Scanner $scanner) { if ($scanner->type() !== Scanner::WORD) { return false; } if (is_null($this->word)) { return true; } return $scanner->token() == $this->word; }
public function testState() { $scan = new I\Scanner(new I\StringReader("1+2"), $ctx = new I\Context()); $start = $scan->getState(); $scan->next()->next()->next()->next(); $this->assertSame(I\Scanner::EOF, $scan->type()); $scan->setState($start); $this->assertSame('1', $scan->next()->token()); $this->assertEquals(array(I\Scanner::CHAR, '+'), $scan->peek()); $this->assertEquals(array(I\Scanner::CHAR, '+'), $scan->peek()); }