1
0
mirror of https://github.com/danog/PHP-Parser.git synced 2024-11-30 04:19:30 +01:00

Decouple NodeDumper from NodeAbstract

This commit is contained in:
nikic 2011-05-30 19:21:25 +02:00
parent 22ea3d6a70
commit 8a3074db38
6 changed files with 61 additions and 49 deletions

7
README
View File

@ -17,8 +17,7 @@ Usage:
// the return value of Parser->yyparse will either be false (which // the return value of Parser->yyparse will either be false (which
// signifies that an error occured) or an array of statements (Nodes) // signifies that an error occured) or an array of statements (Nodes)
if (false !== $stmts) { if (false !== $stmts) {
// dump the AST // dump nodes
foreach ($stmts as $stmt) { $nodeDumper = new NodeDumper();
echo $stmt, "\n"; echo $nodeDumper->dump($stmts);
}
} }

View File

@ -25,39 +25,4 @@ abstract class NodeAbstract implements IteratorAggregate
public function getIterator() { public function getIterator() {
return new ArrayIterator($this->subNodes); return new ArrayIterator($this->subNodes);
} }
public function __toString() {
$r = '[' . $this->getType() . ']';
foreach ($this->subNodes as $key => $value) {
$r .= "\n" . ' ' . $key . ': ';
if (null === $value) {
$r .= 'null';
} elseif (false === $value) {
$r .= 'false';
} elseif (true === $value) {
$r .= 'true';
} elseif (is_scalar($value)) {
$r .= $value;
} elseif ($value instanceof NodeAbstract) {
$lines = explode("\n", $value);
$r .= array_shift($lines);
foreach ($lines as $line) {
$r .= "\n" . ' ' . $line;
}
} elseif (is_array($value)) {
foreach ($value as $v) {
$lines = explode("\n", $v);
foreach ($lines as $line) {
$r .= "\n" . ' ' . $line;
}
}
} else {
die('UNEXPECTED!!!');
}
}
return $r;
}
} }

43
lib/NodeDumper.php Normal file
View File

@ -0,0 +1,43 @@
<?php
class NodeDumper
{
/**
* Dumps a Node, scalar or array to a string.
*
* @param mixed $node Value to dump
* @return string Dumped value
*/
public function dump($node) {
if (is_array($node) || $node instanceof NodeAbstract) {
if (is_array($node)) {
$r = 'array(';
} else {
$r = $node->getType() . '(';
}
foreach ($node as $key => $value) {
$r .= "\n" . ' ' . $key . ': ';
$lines = explode("\n", $this->dump($value));
$r .= array_shift($lines);
foreach ($lines as $line) {
$r .= "\n" . ' ' . $line;
}
}
return $r . "\n" . ')';
} elseif (null === $node) {
return 'null';
} elseif (false === $node) {
return 'false';
} elseif (true === $node) {
return 'true';
} elseif (is_scalar($node)) {
return $node;
} else {
throw new InvalidArgumentException('Unexpected node type.');
}
}
}

View File

@ -632,10 +632,16 @@ class PrettyPrinter_Zend extends PrettyPrinterAbstract
public function pEncapsList(array $encapsList) { public function pEncapsList(array $encapsList) {
$return = ''; $return = '';
foreach ($encapsList as $element) { foreach ($encapsList as $i => $element) {
if (is_string($element)) { if (is_string($element)) {
$return .= addcslashes($element, "\n\r\t\f\v$\"\\"); $return .= addcslashes($element, "\n\r\t\f\v$\"\\");
} elseif ($element instanceof Node_Variable && is_string($element->name)) { } elseif ($element instanceof Node_Variable
&& is_string($element->name)
&& (!isset($encapsList[$i + 1])
|| !is_string($encapsList[$i + 1])
|| '[' !== $encapsList[$i + 1][0]
)
) {
$return .= '$' . $element->name; $return .= '$' . $element->name;
} else { } else {
$return .= '{' . $this->p($element) . '}'; $return .= '{' . $this->p($element) . '}';

View File

@ -6,7 +6,9 @@ function __autoload($class) {
echo '<pre>'; echo '<pre>';
$parser = new Parser(); $parser = new Parser;
$prettyPrinter = new PrettyPrinter_Zend;
$nodeDumper = new NodeDumper;
// Output Demo // Output Demo
$stmts = $parser->yyparse(new Lexer( $stmts = $parser->yyparse(new Lexer(
@ -24,14 +26,11 @@ $stmts = $parser->yyparse(new Lexer(
); );
if (false !== $stmts) { if (false !== $stmts) {
foreach ($stmts as $stmt) { echo htmlspecialchars($nodeDumper->dump($stmts));
echo htmlspecialchars($stmt), "\n";
}
} }
echo "\n\n"; echo "\n\n";
$prettyPrinter = new PrettyPrinter_Zend;
$code = $prettyPrinter->pStmts( $code = $prettyPrinter->pStmts(
$parser->yyparse( $parser->yyparse(
new Lexer(file_get_contents( new Lexer(file_get_contents(

View File

@ -6,9 +6,9 @@ function __autoload($class) {
is_file($file = '../lib/' . strtr($class, '_', '/') . '.php') && require_once $file; is_file($file = '../lib/' . strtr($class, '_', '/') . '.php') && require_once $file;
} }
$parser = new Parser(); $parser = new Parser;
$prettyPrinter = new PrettyPrinter_Zend; $prettyPrinter = new PrettyPrinter_Zend;
$nodeDumper = new NodeDumper;
echo '<!DOCTYPE html> echo '<!DOCTYPE html>
<style> <style>
@ -86,7 +86,7 @@ foreach (new RecursiveIteratorIterator(
++$ppCount; ++$ppCount;
if (false !== $ppStmts) { if (false !== $ppStmts) {
++$compareCount; ++$compareCount;
if ($stmts == $ppStmts) { if ($nodeDumper->dump($stmts) == $nodeDumper->dump($ppStmts)) {
echo ' echo '
<td class="pass">PASS</td> <td class="pass">PASS</td>
<td>' . $time . 's</td> <td>' . $time . 's</td>