protected function doScan(Scanner $scanner) { $quotechar = $scanner->tokenType(); $ret = false; $string = ""; while ($token = $scanner->nextToken()) { if ($token == $quotechar) { $ret = true; break; } $string .= $scanner->token(); } if ($string && !$this->discard) { $scanner->getContext()->pushResult($string); } return $ret; }
final function scan(Scanner $scanner) { if ($scanner->tokenType() == Scanner::SOF) { $scanner->nextToken(); } $ret = $this->doScan($scanner); if ($ret && !$this->discard && $this->term()) { $this->push($scanner); } if ($ret) { $this->invokeHandler($scanner); } if ($this->term() && $ret) { $this->next($scanner); } $this->report("::scan returning {$ret}"); return $ret; }
/** * sign: '!' sign | '+' sign | '-' sign | index */ private static function parseSign(Scanner $scanner) { switch ($scanner->tokenType()) { case '!': $scanner->nextToken(); $result = new NotExpression(self::parseSign($scanner)); break; case '+': $scanner->nextToken(); $result = self::parseSign($scanner); break; case '-': $scanner->nextToken(); $result = new MinusExpression(self::parseSign($scanner)); break; default: $result = self::parseIndex($scanner); } return $result; }
} $char = substr($this->in, $this->pos, 1); $this->pos++; return $char; } public function getPos() { return $this->pos; } public function pushBackChar() { $this->pos--; } public function string() { return $this->in; } } /** * Demo */ $context = new Context(); $user_in = "\$input equals '4' or \$input equals 'four'"; $reader = new StringReader($user_in); $scanner = new Scanner($reader, $context); while ($scanner->nextToken() != Scanner::EOF) { // var_dump($scanner->token(), $scanner->char_no(), $scanner->getTypeString()); print $scanner->token(); print "\t{$scanner->char_no()}"; print "\t{$scanner->getTypeString()}\n"; }
public function testPeekToken() { $grammar = "comment :== literal ."; $scanner = new Scanner(trim($grammar)); $scanner->nextToken(); $t = $scanner->currentToken(); $this->assertEquals("comment", $t->getValue()); $this->assertEquals(":==", $scanner->peekToken()->getValue()); $scanner->nextToken(); $t = $scanner->currentToken(); $this->assertEquals(":==", $t->getValue()); $this->assertEquals("literal", $scanner->peekToken()->getValue()); $scanner->nextToken(); $t = $scanner->currentToken(); $this->assertEquals("literal", $t->getValue()); $scanner->nextToken(); $t = $scanner->currentToken(); $this->assertEquals(".", $t->getValue()); $scanner->nextToken(); $t = $scanner->currentToken(); $this->assertEquals(Token::EOF, $t->getType()); }