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 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()); }