/** * if(<expr>) [{] <code> [}] [elseif(<expr>) { <code> }]+ [else { <code> }] * * @param $codeGenerator */ public function parse_if(CodeGenerator $codeGenerator) { // 'if' eaten $prec = new Precedence($this->scanner); $prec->run(); // If $token = $this->scanner->next(); $bodyCode = new CodeGenerator($codeGenerator->getIndent() + 1, $codeGenerator->getScope()); if ($token['code'] == T_LCURLY_PARENTHESIS) { $this->parse_body($bodyCode); $this->check(T_RCURLY_PARENTHESIS); } else { $this->scanner->back(); $this->parser_command($bodyCode); } $codeGenerator->addIf(new ExprGenerator($prec->getData(), $codeGenerator->getScope()), $bodyCode); //$codeGenerator->addVariables($prec->getUsedVariables()); // Elseif $token = $this->scanner->next(); while ($token['code'] == T_ELSEIF) { $prec = new Precedence($this->scanner); $prec->run(); $token = $this->scanner->next(); $bodyCode = new CodeGenerator($codeGenerator->getIndent() + 1, $codeGenerator->getScope()); if ($token['code'] == T_LCURLY_PARENTHESIS) { $this->parse_body($bodyCode); $this->check(T_RCURLY_PARENTHESIS); } else { $this->scanner->back(); $this->parser_command($bodyCode); } //$codeGenerator->addVariables($prec->getUsedVariables()); $codeGenerator->addElseif(new ExprGenerator($prec->getData(), $codeGenerator->getScope()), $bodyCode); $token = $this->scanner->next(); } // else if ($token['code'] == T_ELSE) { $token = $this->scanner->next(); $bodyCode = new CodeGenerator($codeGenerator->getIndent() + 1, $codeGenerator->getScope()); if ($token['code'] == T_LCURLY_PARENTHESIS) { $this->parse_body($bodyCode); $this->check(T_RCURLY_PARENTHESIS); } else { $this->scanner->back(); $this->parser_command($bodyCode); } //$codeGenerator->addVariables($prec->getUsedVariables()); $codeGenerator->addElse($bodyCode); } else { $this->scanner->back(); } }
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) { echo "Precedence errror\n"; echo $e; exit(5);