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 testScan() { $scan = new I\Scanner(new I\StringReader("1+2"), $ctx = new I\Context()); $scan->next(); $this->assertSame('1', $scan->token()); $scan->next(); $this->assertSame('+', $scan->token()); $scan->next(); $this->assertSame('2', $scan->token()); }
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; }