mirror of https://github.com/LeOS-GSI/LeOS-Genesis
35 lines
934 B
PHP
35 lines
934 B
PHP
|
<?php
|
||
|
|
||
|
|
||
|
|
||
|
abstract class flex_scanner {
|
||
|
/*
|
||
|
Let's face it: PHP is not up to lexical processing. GNU flex handles
|
||
|
it well, so I've created a little protocol for delegating the work.
|
||
|
Extend this class so that executable() gives a path to your lexical
|
||
|
analyser program.
|
||
|
*/
|
||
|
abstract function executable();
|
||
|
function __construct($path) {
|
||
|
if (!is_readable($path)) throw new Exception("$path is not readable.");
|
||
|
putenv("PHP_LIME_SCAN_STDIN=$path");
|
||
|
$scanner = $this->executable();
|
||
|
$tokens = explode("\0", `$scanner < "\$PHP_LIME_SCAN_STDIN"`);
|
||
|
array_pop($tokens);
|
||
|
$this->tokens = $tokens;
|
||
|
$this->lineno = 1;
|
||
|
}
|
||
|
function next() {
|
||
|
if (list($key, $token) = each($this->tokens)) {
|
||
|
list($this->lineno, $type, $text) = explode("\1", $token);
|
||
|
return array($type, $text);
|
||
|
}
|
||
|
}
|
||
|
function feed($parser) {
|
||
|
while (list($type, $text) = $this->next()) {
|
||
|
$parser->eat($type, $text);
|
||
|
}
|
||
|
return $parser->eat_eof();
|
||
|
}
|
||
|
}
|