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;
 }
Пример #2
0
 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;
 }
Пример #3
0
    /**
     * @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;
 }
Пример #6
0
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));
 }
Пример #8
0
 /**
  * @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);
 }
Пример #9
0
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);
}
Пример #10
0
 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();
 }
Пример #11
0
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);
}
Пример #12
0
/**
 * 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;
    }
}
Пример #13
0
 /**
  * @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);
     }
 }
Пример #14
0
 /**
  * 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;
 }
Пример #15
0
 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;
 }
Пример #17
0
 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();
     }
 }
Пример #18
0
 /**
  * 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;
 }
Пример #29
0
Файл: Php.php Проект: layla/cody
 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;
     }
 }
Пример #30
0
 /**
  *
  * @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;
 }