Browse Source

Expression bug fix replacing variables; add string literal

master
Adam Pippin 3 years ago
parent
commit
27774c84c6
  1. 32
      app/Cfnpp/Expression/Expression.php
  2. 70
      app/Cfnpp/Expression/Token/StringLiteral.php

32
app/Cfnpp/Expression/Expression.php

@ -13,6 +13,7 @@ class Expression
Token\NumericLiteral::class, Token\NumericLiteral::class,
Token\OperatorUnary::class, Token\OperatorUnary::class,
Token\OperatorBinary::class, Token\OperatorBinary::class,
Token\StringLiteral::class,
Token\Variable::class Token\Variable::class
]; ];
@ -48,6 +49,16 @@ class Expression
return $complete; return $complete;
} }
public function count()
{
return sizeof($this->nodes);
}
public function getValue()
{
return $this->nodes[0]->getValue();
}
public function toArray(): array public function toArray(): array
{ {
return static::unwrap($this->nodes); return static::unwrap($this->nodes);
@ -111,11 +122,16 @@ class Expression
return $stack->get(); return $stack->get();
} }
protected static function solve(array $nodes, array $variables = [], array $parameters = []) protected static function solve(array $nodes, array $variables = [], array $parameters = []): array
{ {
static::fillVariables($nodes, $variables, $parameters); $root = new GraphNode();
static::collapse($nodes); foreach ($nodes as $node)
return $nodes; {
$root->appendChild($node);
}
$nodes = static::fillVariables($root->getChildren(), $variables, $parameters);
$nodes = static::collapse($root->getChildren());
return $root->getChildren();
} }
protected static function execute(array $nodes, array $variables = [], array $parameters = []) protected static function execute(array $nodes, array $variables = [], array $parameters = [])
@ -128,6 +144,10 @@ class Expression
foreach ($nodes as $node) foreach ($nodes as $node)
{ {
$node->walk(static function($node) { $node->walk(static function($node) {
if (is_scalar($node->getValue()))
{
return;
}
if (!($node->getValue() instanceof ICloudformationNative)) if (!($node->getValue() instanceof ICloudformationNative))
{ {
throw new \Exception('Token '.basename(get_class($node->getValue())).' is not natively supported by CloudFormation.'); throw new \Exception('Token '.basename(get_class($node->getValue())).' is not natively supported by CloudFormation.');
@ -144,7 +164,7 @@ class Expression
return $nodes[0]->getValue(); return $nodes[0]->getValue();
} }
protected static function fillVariables(array $nodes, array $variables, array $parameters) protected static function fillVariables(array $nodes, array $variables, array $parameters): void
{ {
foreach ($nodes as $node) foreach ($nodes as $node)
{ {
@ -169,7 +189,7 @@ class Expression
} }
} }
protected static function collapse(array $nodes) protected static function collapse(array $nodes): void
{ {
foreach ($nodes as $node) foreach ($nodes as $node)
{ {

70
app/Cfnpp/Expression/Token/StringLiteral.php

@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace App\Cfnpp\Expression\Token;
use App\Cfnpp\Expression\Token;
use App\Cfnpp\Expression\TokenLiteral;
class StringLiteral extends TokenLiteral
{
protected $value;
public function __construct($value)
{
$this->value = $value;
}
public function getValue()
{
return $this->value;
}
public static function isToken(string $stream): bool
{
return $stream[0] == '"';
}
public static function getToken(string &$stream): Token
{
$buffer = '';
$in_string = false;
$escaped = false;
for ($i = 0; $i < strlen($stream); $i++)
{
if ($escaped)
{
$buffer .= $stream[$i];
$escaped = false;
}
elseif ($stream[$i] == '"')
{
if ($in_string)
{
break;
}
$in_string = true;
}
elseif ($stream[$i] == '\\')
{
$escaped = true;
}
else
{
$buffer .= $stream[$i];
}
}
$stream = substr($stream, $i + 1);
return new StringLiteral($buffer);
}
public function execute(?array $arguments = null)
{
return $this->getValue();
}
}
Loading…
Cancel
Save