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;
 }
Beispiel #2
0
 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;
 }
Beispiel #3
0
 /**
  * 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;
 }
Beispiel #4
0
        }
        $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";
}
Beispiel #5
0
 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());
 }