Пример #1
0
 public function next(Scanner $scan)
 {
     // @todo: make \s skipping customizable
     do {
         // echo "\n\t{$this->name}: ".$scan->token();
         $scan->next();
         // echo ", ".$scan->token()."\n";
     } while ($scan->type() === Scanner::WHITESPACE);
 }
Пример #2
0
 /**
  * [type] $name [= default]
  *
  * @return array
  * @throws Exception
  */
 public function parse_args()
 {
     $token = $this->scanner->next();
     if ($token['code'] === T_RPARENTHESIS) {
         // No arguments
         $this->scanner->back();
         return [];
     }
     $arg = ['type' => 'mixed', 'name' => NULL, 'value' => [FALSE, NULL]];
     if ($token['code'] === T_ARRAY || $token['code'] === T_STRING) {
         // type
         $arg['type'] = $token['value'];
         $token = $this->scanner->next();
     }
     if ($token['code'] === T_VARIABLE) {
         $arg['name'] = $token['value'];
         $token = $this->scanner->next();
     }
     if ($token['code'] === T_ASSIGN) {
         $token = $this->scanner->next();
         $arg['value'] = [TRUE, $token['value']];
         if ($token['value'] == '[') {
             // TODO: allow initialization with non-empty arrays
             $this->check(T_ARRAY_CLOSE);
         }
         $token = $this->scanner->next();
     }
     if ($token['code'] === T_RPARENTHESIS) {
         $this->scanner->back();
         if (is_null($arg['name'])) {
             return [];
         }
         return [$arg];
     } elseif ($token['code'] == T_COMMA) {
         return array_merge([$arg], $this->parse_args());
     }
 }
Пример #3
0
 */
if (PHP_VERSION_ID < 50501) {
    echo "Neni splnena minimalni verze PHP 5.5";
    exit(15);
}
require_once __DIR__ . '/lib/debug.php';
require_once __DIR__ . '/scanner/Scanner.php';
require_once __DIR__ . '/parser/Parser.php';
require_once __DIR__ . '/precedence/Precedence.php';
if ($argc < 2) {
    die("Wrong argument count. Usage is:\n\t./app source.php [--precedence]\n\tor\n\t./app folder");
}
try {
    $scanner = new Scanner($argv[1]);
    if ($argc > 2 and $argv[2] == '--precedence') {
        $scanner->next();
        // Skip open tag
        $precedence = new Precedence($scanner);
        $precedence->run();
        echo "Generated expression: " . $precedence->getCode() . "\n";
    } else {
        $parser = new Parser($scanner);
        $parser->parse_file();
    }
} catch (EndOfFileException $e) {
    echo "Code:\n\n\n";
    $code = $parser->generator->getCode();
    file_put_contents('test.cpp', $code);
    echo $code;
    echo "\n\n\nDone\n";
} catch (PrecedenceException $e) {