diff --git a/src/SMPLang.php b/src/SMPLang.php index 7699792..66be2e0 100644 --- a/src/SMPLang.php +++ b/src/SMPLang.php @@ -25,16 +25,58 @@ public function __construct( public function evaluate(string $expression, array $vars = []): mixed { - if (empty($vars)) { - return $this->eval($expression); + $expressions = []; + $currentExpression = 0; + $results = []; + $inQuotes = false; + $quotes = ["\"", "'", "`"]; + + for ($i = 0; $i < strlen($expression); $i++) { + $char = $expression[$i]; + + if (in_array($char, $quotes)) { + if ($inQuotes === $char) { + $inQuotes = false; + } else { + $inQuotes = $char; + } + } + + if (! $inQuotes && $char == ';') { + $currentExpression++; + continue; + } + + if (! isset($expressions[$currentExpression])) { + $expressions[$currentExpression] = ''; + } + + $expressions[$currentExpression] .= $char; + } + + $evalute = function ($expression) use ($vars) { + if (empty($vars)) { + return $this->eval($expression); + } + + $instance = clone $this; + $instance->vars = [...$instance->vars, ...$vars]; + $result = $instance->eval($expression); + unset($instance); + return $result; + }; + + foreach ($expressions as $expression) { + $results[] = $evalute($expression); } - $instance = clone $this; - $instance->vars = [...$instance->vars, ...$vars]; - $result = $instance->eval($expression); - unset($instance); + if (count($results) < 1) { + return null; + } elseif (count($results) == 1) { + return $results[0]; + } - return $result; + return $results; } protected function eval(string $input): mixed diff --git a/tests/ExpressionTest.php b/tests/ExpressionTest.php index a29db9a..3c12f78 100644 --- a/tests/ExpressionTest.php +++ b/tests/ExpressionTest.php @@ -277,4 +277,20 @@ public function method(int $number): int assertEquals($smpl->evaluate("false ?: 'no'"), 'no'); }); +test('semicolons', function () { + $smpl = new SMPLang(); + + $code = '"hello world"; 1 + 5; null; [`hello`, `world`];'; + $multiline = "\"hello world\";\r\n 1 + 5;\r\n null\r\n; [`hello`,\r\n`world`\r\n]\r\n;"; + $result = [ + "hello world", + 6, + null, + ["hello", "world"], + ]; + + assertEquals($smpl->evaluate($code), $result); + assertEquals($smpl->evaluate($multiline), $result); +}); + // @todo add tests