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