Instead edit one of the following:
* the grammar file grammar/zend_language_parser.phpy
* the parser skeleton grammar/kymacc.php.parser
* the preprocessing script grammar/rebuildParser.php
The skeleton for this parser was written by Moriyoshi Koizumi and is based on
the work by Masato Bito and is in the PUBLIC DOMAIN.
private function extract($file, ValidationExtractor $extractor = null) { if (!is_file($file = __DIR__ . '/Fixture/' . $file)) { throw new RuntimeException(sprintf('The file "%s" does not exist.', $file)); } $file = new \SplFileInfo($file); //use correct factory class depending on whether using Symfony 2 or 3 if (class_exists('Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory')) { $metadataFactoryClass = 'Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory'; } else { $metadataFactoryClass = 'Symfony\\Component\\Validator\\Mapping\\ClassMetadataFactory'; } if (null === $extractor) { $factory = new $metadataFactoryClass(new AnnotationLoader(new AnnotationReader())); $extractor = new ValidationExtractor($factory); } $lexer = new Lexer(); if (class_exists('PhpParser\\ParserFactory')) { $factory = new ParserFactory(); $parser = $factory->create(ParserFactory::PREFER_PHP7, $lexer); } else { $parser = new \PHPParser_Parser($lexer); } $ast = $parser->parse(file_get_contents($file)); $catalogue = new MessageCatalogue(); $extractor->visitPhpFile($file, $catalogue, $ast); return $catalogue; }
public static function parse($code) { $lexer = new \PHPParser_Lexer($code); $parser = new \PHPParser_Parser(); $ast = $parser->parse($lexer); $traverser = new \PHPParser_NodeTraverser(); $traverser->addVisitor(new NormalizingNodeVisitor()); $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); $ast = $traverser->traverse($ast); switch (count($ast)) { case 0: $ast = new BlockNode(array()); break; case 1: $ast = $ast[0]; break; default: $ast = new BlockNode($ast); } // This is currently only available when using the schmittjoh/PHP-Parser fork. if (class_exists('PHPParser_NodeVisitor_NodeConnector')) { $traverser = new \PHPParser_NodeTraverser(); $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); $traverser->traverse(array($ast)); } return $ast; }
/** * @dataProvider provideTestConversion */ public function testConversion($originalCode, $expectedCode, $expectedOutput) { $factory = new PHPBackporter_Factory; $parser = new PHPParser_Parser; $traverser = $factory->getTraverser(); $prettyPrinter = new PHPParser_PrettyPrinter_Zend; $stmts = $parser->parse(new PHPParser_Lexer('<?php ' . $originalCode)); $traverser->traverse($stmts); $code = $prettyPrinter->prettyPrint($stmts); if (false === strpos($expectedCode, '%')) { $this->assertEquals($expectedCode, $code); } else { $this->assertStringMatchesFormat($expectedCode, $code); } ob_start(); eval($code); $output = trim(ob_get_clean()); if (false === strpos($expectedOutput, '%')) { $this->assertEquals($expectedOutput, $output); } else { $this->assertStringMatchesFormat($expectedOutput, $output); } }
protected function doTestPrettyPrintMethod($method, $name, $code, $dump) { $parser = new PHPParser_Parser(new PHPParser_Lexer_Emulative()); $prettyPrinter = new PHPParser_PrettyPrinter_Default(); $stmts = $parser->parse($code); $this->assertEquals($this->canonicalize($dump), $this->canonicalize($prettyPrinter->{$method}($stmts)), $name); }
/** * The main filter method. * Implemented according to \php_user_filter class. Will loop over all stream buckets, buffer them and perform * the needed actions. * * @param resource $in Incoming bucket brigade we need to filter * @param resource $out Outgoing bucket brigade with already filtered content * @param integer $consumed The count of altered characters as buckets pass the filter * @param boolean $closing Is the stream about to close? * * @throws \Exception * @throws \PHPParser_Error * * @return integer * * @link http://www.php.net/manual/en/php-user-filter.filter.php * * TODO The buffering does not work that well, maybe we should implement universal buffering within parent class! */ public function filter($in, $out, &$consumed, $closing) { // Get our buckets from the stream $buffer = ''; while ($bucket = stream_bucket_make_writeable($in)) { $buffer .= $bucket->data; // Tell them how much we already processed, and stuff it back into the output $consumed += $bucket->datalen; // Save a bucket for later reuse $bigBucket = $bucket; } // Beautify all the buckets! $parser = new \PHPParser_Parser(new \PHPParser_Lexer()); $prettyPrinter = new \PHPParser_PrettyPrinter_Default(); try { // parse $stmts = $parser->parse($buffer); $data = '<?php ' . $prettyPrinter->prettyPrint($stmts); } catch (PHPParser_Error $e) { throw $e; } // Refill the bucket with the beautified data // Do not forget to set the length! $bigBucket->data = $data; $bigBucket->datalen = strlen($data); // Only append our big bucket stream_bucket_append($out, $bigBucket); return PSFS_PASS_ON; }
function snowscript_to_php($code, $debug = false, $return = false, $namespace = "Anonymous") { $lexer = new Snowscript_Lexer($code . "\n"); if ($debug) { debug_lexer($lexer); } $parser = new PHPParser_Parser(); $prettyPrinter = new PHPParser_PrettyPrinter_Zend(); $stmts = $parser->parse($lexer); $traverser = new PHPParser_NodeTraverser(); $scope_traverser = new Snowscript_Visitors_Scope($namespace); $traverser->addVisitor($scope_traverser); $stmts = $traverser->traverse($stmts); $nodeDumper = new PHPParser_NodeDumper(); if ($debug) { $nodeDumper = new PHPParser_NodeDumper(); echo $nodeDumper->dump($stmts) . "\n"; } $php = $prettyPrinter->prettyPrint($stmts) . "\n"; if ($return) { return $php; } else { print "<?php\n" . $php; } }
/** * @dataProvider getTests */ public function testIntegration($sourceFile) { $parser = new \PHPParser_Parser(); $ast = $parser->parse(new \PHPParser_Lexer(file_get_contents($sourceFile))); $traverser = new \PHPParser_NodeTraverser(); $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); $traverser->addVisitor(new NormalizingNodeVisitor()); $ast = $traverser->traverse($ast); if (count($ast) > 1) { $ast = array(new BlockNode($ast)); } $traverser = new \PHPParser_NodeTraverser(); $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); $traverser->traverse($ast); // do _NOT_ assign the ast here as it clones the nodes on traversal and leads to problems $cfa = new ControlFlowAnalysis(); $cfa->process($ast[0]); $cfg = $cfa->getGraph(); $serializer = new GraphvizSerializer(); $dot = $serializer->serialize($cfg); $dotFile = substr($sourceFile, 0, -4) . '.dot'; if (!is_file($dotFile)) { file_put_contents($dotFile . '.tmp', $dot); $this->fail(sprintf('Dotfile "%s" does not exist, wrote current output to "%s".', $dotFile, basename($dotFile . '.tmp'))); } $this->assertSame($dot, file_get_contents($dotFile)); }
/** * @dataProvider provideTestPrettyPrint * @covers PHPParser_PrettyPrinter_Zend<extended> */ public function testPrettyPrint($name, $code, $dump) { $parser = new PHPParser_Parser(new PHPParser_Lexer_Emulative()); $prettyPrinter = new PHPParser_PrettyPrinter_Zend(); $stmts = $parser->parse($code); $this->assertEquals($this->canonicalize($dump), $this->canonicalize($prettyPrinter->prettyPrint($stmts)), $name); }
function transform_code($code, callable $transform) { $parser = new \PHPParser_Parser(new \PHPParser_Lexer()); $prettyPrinter = new \PHPParser_PrettyPrinter_Default(); $ast = $parser->parse($code); $ast = $transform($ast); return '<?php' . "\n\n" . $prettyPrinter->prettyPrint($ast); }
public function testParsing() { $parser = new \PHPParser_Parser(new \PHPParser_Lexer()); $code = file_get_contents($this->refl->getFileName()); $record = new PhpFile($parser->parse($code)); $this->repo->persist($record); return (string) $record->getId(); }
function php_to_php($code, $debug = false) { $lexer = new PHPParser_Lexer($code . "\n"); $parser = new PHPParser_Parser(); $prettyPrinter = new PHPParser_PrettyPrinter_Zend(); $stmts = $parser->parse($lexer); $nodeDumper = new PHPParser_NodeDumper(); echo $nodeDumper->dump($stmts); }
/** * Returns the parsed AST */ function getSourceTree($src) { $lexer = new PHPParser_Lexer(); $parser = new PHPParser_Parser($lexer); try { return $parser->parse($src); } catch (Exception $e) { return null; } }
/** * @dataProvider provideTestParseFail */ public function testParseFail($name, $code, $msg) { $parser = new PHPParser_Parser(new PHPParser_Lexer_Emulative()); try { $parser->parse($code); $this->fail(sprintf('"%s": Expected PHPParser_Error', $name)); } catch (PHPParser_Error $e) { $this->assertEquals($msg, $e->getMessage(), $name); } }
/** * Parses given file and returns found gettext phrases * * @param string $file * @return array */ public function extract($file) { $this->data = array(); $parser = new PHPParser_Parser(new PHPParser_Lexer()); $stmts = $parser->parse(file_get_contents($file)); $traverser = new PHPParser_NodeTraverser(); $traverser->addVisitor($this); $traverser->traverse($stmts); $data = $this->data; $this->data = null; return $data; }
public function configParser() { if (file_exists($this->getConfigPath(false))) { $parser = new \PHPParser_Parser(new \PHPParser_Lexer()); $traverser = new \PHPParser_NodeTraverser(); $traverser->addVisitor(new ConfigVisitor()); $statements = $parser->parse(file_get_contents($this->getConfigPath(false))); $traverser->traverse($statements); return ConfigVisitor::getConfigValues(); } return array(); }
public function searchForHooksInFile($filename, $phpFile) { $code = file_get_contents($phpFile); if (false === strpos($code, 'postEvent')) { return array(); } $stmts = $this->parser->parse($code); $traverser = new \PHPParser_NodeTraverser(); $traverser->addVisitor(new MyConstantVisitor()); $traverser->addVisitor(new MyHookVisitor($filename)); $hooks = $traverser->traverse($stmts); return $hooks; }
public function traverse($contents) { $parser = new \PHPParser_Parser(new \PHPParser_Lexer()); $node_traverser = new \PHPParser_NodeTraverser(); $node_traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); $node_traverser->addVisitor($this->visitor); try { $stmts = $parser->parse($contents); $node_traverser->traverse($stmts); } catch (\PHPParser_Error $e) { echo 'Parse Error: ', $e->getMessage(); } }
/** * As we depend on a fully buffered bucket brigade we will do all the work here. * We will pretty-print the buffer and write the result as one big bucket into the stream * * @return void * @throws \AppserverIo\Doppelgaenger\Exceptions\GeneratorException */ public function finish() { // Beautify all the buckets! $parser = new \PHPParser_Parser(new \PHPParser_Lexer()); $prettyPrinter = new \PHPParser_PrettyPrinter_Default(); try { // parse $stmts = $parser->parse($this->bucketBuffer); $this->bucketBuffer = '<?php ' . $prettyPrinter->prettyPrint($stmts); } catch (\PHPParser_Error $e) { throw new GeneratorException($e->getMessage()); } }
protected function analyzeAst($fixtureName) { if (!is_file($path = __DIR__ . '/Fixture/' . $fixtureName)) { throw new \InvalidArgumentException(sprintf('The fixture file "%s" does not exist.', $path)); } $parser = new \PHPParser_Parser(); $ast = $parser->parse(new \PHPParser_Lexer(file_get_contents($path))); $traverser = new \PHPParser_NodeTraverser(); $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); foreach ($this->getVisitors() as $visitor) { $traverser->addVisitor($visitor); } return $traverser->traverse($ast); }
/** * Processes this test, when one of its tokens is encountered. * * @param PHP_CodeSniffer_File $phpcsFile All the tokens found in the document. * @param int $stackPtr The position of the current token in * the stack passed in $tokens. */ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) { $parser = new PHPParser_Parser(new PHPParser_Lexer()); $visitor = new Symfony2_Sniffs_ObjectCalisthenics_SmallClassSniff_NodeVisitor(); $visitor->setPHPCodeSnifferFile($phpcsFile); $traverser = new PHPParser_NodeTraverser(); $traverser->addVisitor($visitor); try { $code = file_get_contents($phpcsFile->getFilename()); $tree = $parser->parse($code); $tree = $traverser->traverse($tree); } catch (PHPParser_Error $e) { } }
private function extract($file, TranslationContainerExtractor $extractor = null) { if (!is_file($file = __DIR__ . '/Fixture/' . $file)) { throw new RuntimeException(sprintf('The file "%s" does not exist.', $file)); } $file = new \SplFileInfo($file); if (null === $extractor) { $extractor = new TranslationContainerExtractor(); } $lexer = new \PHPParser_Lexer(); $parser = new \PHPParser_Parser($lexer); $ast = $parser->parse(file_get_contents($file)); $catalogue = new MessageCatalogue(); $extractor->visitPhpFile($file, $catalogue, $ast); return $catalogue; }
protected final function extract($file, FileVisitorInterface $extractor = null) { if (!is_file($file = __DIR__ . '/Fixture/' . $file)) { throw new RuntimeException(sprintf('The file "%s" does not exist.', $file)); } $file = new \SplFileInfo($file); if (null === $extractor) { $extractor = $this->getDefaultExtractor(); } $lexer = new \PHPParser_Lexer(); $parser = new \PHPParser_Parser($lexer); $ast = $parser->parse(file_get_contents($file)); $catalogue = new MessageCatalogue(); $extractor->visitPhpFile($file, $catalogue, $ast); return $catalogue; }
/** * Processes this test, when one of its tokens is encountered. * * @param PHP_CodeSniffer_File $phpcsFile All the tokens found in the document. * @param int $stackPtr The position of the current token in * the stack passed in $tokens. */ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) { return; $parser = new PHPParser_Parser(new PHPParser_Lexer()); $visitor = new Symfony2_Sniffs_ObjectCalisthenics_UseAccessorsSniff_NodeVisitor(); $visitor->setPHPCodeSnifferFile($phpcsFile); $traverser = new PHPParser_NodeTraverser(); $traverser->addVisitor($visitor); try { $code = file_get_contents($phpcsFile->getFilename()); $tree = $parser->parse($code); //$tree[0]->setAttribute('visited', true); var_dump($tree); } catch (PHPParser_Error $e) { } die; }
/** * @return \PHPParser_Node[] */ private function getMethodInsideStatement() { $code = $this->getWeavedMethodTemplate(); $node = $this->parser->parse($code)[0]; /** @var $node \PHPParser_Node_Stmt_Class */ $node = $node->getMethods()[0]; return $node->stmts; }
private function createScope($src) { $lexer = new \PHPParser_Lexer('<?php class Foo { public function foo($param1, $param2) { ' . $src . ' } }'); $parser = new \PHPParser_Parser(); $ast = $parser->parse($lexer); $traverser = new \PHPParser_NodeTraverser(); $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); $traverser->addVisitor(new NormalizingNodeVisitor()); $ast = $traverser->traverse($ast); $traverser = new \PHPParser_NodeTraverser(); $traverser->addVisitor(new \PHPParser_NodeVisitor_NodeConnector()); $traverser->traverse($ast); $rootNode = $ast[0]; $scopeRoot = $ast[0]->stmts[0]; $sc = new SyntacticScopeCreator(); return $sc->createScope($scopeRoot, new Scope($rootNode)); }
private function extract($file, ValidationExtractor $extractor = null) { if (!is_file($file = __DIR__ . '/Fixture/' . $file)) { throw new RuntimeException(sprintf('The file "%s" does not exist.', $file)); } $file = new \SplFileInfo($file); if (null === $extractor) { $factory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); $extractor = new ValidationExtractor($factory); } $lexer = new \PHPParser_Lexer(); $parser = new \PHPParser_Parser($lexer); $ast = $parser->parse(file_get_contents($file)); $catalogue = new MessageCatalogue(); $extractor->visitPhpFile($file, $catalogue, $ast); return $catalogue; }
private function extract($file, FormExtractor $extractor = null) { if (!is_file($file = __DIR__ . '/Fixture/' . $file)) { throw new RuntimeException(sprintf('The file "%s" does not exist.', $file)); } $file = new \SplFileInfo($file); if (null === $extractor) { $docParser = new DocParser(); $docParser->setImports(array('desc' => 'JMS\\TranslationBundle\\Annotation\\Desc', 'meaning' => 'JMS\\TranslationBundle\\Annotation\\Meaning', 'ignore' => 'JMS\\TranslationBundle\\Annotation\\Ignore')); $docParser->setIgnoreNotImportedAnnotations(true); $extractor = new FormExtractor($docParser); } $lexer = new \PHPParser_Lexer(file_get_contents($file)); $parser = new \PHPParser_Parser(); $ast = $parser->parse($lexer); $catalogue = new MessageCatalogue(); $extractor->visitPhpFile($file, $catalogue, $ast); return $catalogue; }
private function extract($file, TranslationContainerExtractor $extractor = null) { if (!is_file($file = __DIR__ . '/Fixture/' . $file)) { throw new RuntimeException(sprintf('The file "%s" does not exist.', $file)); } $file = new \SplFileInfo($file); if (null === $extractor) { $extractor = new TranslationContainerExtractor(); } $lexer = new Lexer(); if (class_exists('PhpParser\\ParserFactory')) { $factory = new ParserFactory(); $parser = $factory->create(ParserFactory::PREFER_PHP7, $lexer); } else { $parser = new \PHPParser_Parser($lexer); } $ast = $parser->parse(file_get_contents($file)); $catalogue = new MessageCatalogue(); $extractor->visitPhpFile($file, $catalogue, $ast); return $catalogue; }
public function getFullyQualifiedClassName($file) { // use the emulative lexer here, as we are running PHP 5.2 but want to parse PHP 5.3 $parser = new \PHPParser_Parser(new \PHPParser_Lexer()); $traverser = new \PHPParser_NodeTraverser(); $prettyPrinter = new \PHPParser_PrettyPrinter_Default(); $nameSaver = new NamespaceConverter(); $traverser->addVisitor(new \PHPParser_NodeVisitor_NameResolver()); // we will need resolved names $traverser->addVisitor($nameSaver); try { // read the file that should be converted $code = file_get_contents($file); // parse $stmts = $parser->parse($code); // traverse $stmts = $traverser->traverse($stmts); return $nameSaver->name; } catch (PHPParser_Error $e) { return false; } }
/** * * @TODO: refactor (nearly the same as \MageCompability\Extension::addMethods) * * @param string $path * @return array array of potential performance issues */ protected function _scanForPerformanceLeaks($path) { $possiblePerformanceLeaks = array(); $parser = new \PHPParser_Parser(new \PHPParser_Lexer()); foreach (glob($path . '/*') as $item) { if (is_dir($item)) { $possiblePerformanceLeaks = array_merge($possiblePerformanceLeaks, $this->_scanForPerformanceLeaks($item)); } if (is_file($item) && is_readable($item)) { if ($this->_isUnitTestFile($item)) { continue; } /* we assume that there are only php files */ if (substr($item, -6) == '.stmts.xml') { unlink($item); continue; } $fileNameParts = explode('.', basename($item)); $extension = end($fileNameParts); if (false === in_array($extension, array('php', 'phtml'))) { continue; } try { $stmts = $parser->parse(file_get_contents($item)); $serializer = new \PHPParser_Serializer_XML(); $xml = $serializer->serialize($stmts); // file_put_contents($item . '.stmts.xml', var_export($xml, true)); $leaks = $this->_collectPerformanceKillers(simplexml_load_string($xml), $item); $possiblePerformanceLeaks = array_merge($possiblePerformanceLeaks, $leaks); } catch (\PHPParser_Error $e) { // no valid php continue; } } } return $possiblePerformanceLeaks; }