Skip to content

Commit 9e396af

Browse files
feat: enhance SetStatement with body support and update parsing logic
- Modify SetStatement to accept an optional body array for block statements. - Update the Parser to handle new SetStatement structure, allowing for statements within the set. - Introduce new token type 'EndSet' for proper parsing of set blocks. - Adjust Interpreter logic to evaluate the body when the value is null.
1 parent d7c1145 commit 9e396af

5 files changed

Lines changed: 30 additions & 5 deletions

File tree

src/AST/SetStatement.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,14 @@ class SetStatement extends Statement
99
{
1010
public string $type = "Set";
1111

12+
/**
13+
* @param Expression $assignee
14+
* @param ?Expression $value
15+
* @param Statement[] $body
16+
*/
1217
public function __construct(
1318
public Expression $assignee,
14-
public Expression $value
19+
public ?Expression $value,
20+
public array $body = []
1521
) {}
1622
}

src/Core/Interpreter.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,10 @@ private function evaluateFilterExpression(FilterExpression $node, Environment $e
317317
};
318318
});
319319
return new ArrayValue($operand->value);
320+
case "join":
321+
return new StringValue(implode('', $operand->value));
322+
case "string":
323+
return new StringValue(json_encode($operand->value));
320324
default:
321325
throw new \Exception("Unknown ArrayValue filter: {$node->filter->value}");
322326
}
@@ -670,7 +674,8 @@ private function evaluateMemberExpression(MemberExpression $expr, Environment $e
670674

671675
private function evaluateSet(SetStatement $node, Environment $environment): NullValue
672676
{
673-
$rhs = $this->evaluate($node->value, $environment);
677+
$rhs = $node->value ? $this->evaluate($node->value, $environment) : $this->evaluateBlock($node->body, $environment);
678+
674679
if ($node->assignee->type === "Identifier") {
675680
$environment->setVariable($node->assignee->value, $rhs);
676681
} elseif ($node->assignee->type === "MemberExpression") {

src/Core/Parser.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,23 @@ private function parseSetStatement(): Statement
191191

192192
if ($this->is(TokenType::Equals)) {
193193
$this->current++;
194-
$value = $this->parseSetStatement();
194+
$value = $this->parseExpression();
195195

196-
return new SetStatement($left, $value);
196+
return new SetStatement($left, $value, []);
197+
} else {
198+
$body = [];
199+
200+
$this->expect(TokenType::CloseStatement, "Expected closing statement token");
201+
202+
while ($this->not(TokenType::OpenStatement, TokenType::EndSet)) {
203+
$body[] = $this->parseAny();
204+
}
205+
206+
$this->expect(TokenType::OpenStatement, "Expected opening statement token");
207+
$this->expect(TokenType::EndSet, "Expected endset token");
208+
209+
return new SetStatement($left, null, $body);
197210
}
198-
return $left;
199211
}
200212

201213
private function parseIfStatement(): IfStatement

src/Core/Token.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class Token
1717
'is' => TokenType::Is,
1818
'if' => TokenType::If,
1919
'else' => TokenType::Else,
20+
'endset' => TokenType::EndSet,
2021
'endif' => TokenType::EndIf,
2122
'elif' => TokenType::ElseIf,
2223
'endfor' => TokenType::EndFor,

src/Core/TokenType.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ enum TokenType: string
4747
case Is = "Is";
4848
case NotIn = "NotIn";
4949
case Else = "Else";
50+
case EndSet = "EndSet";
5051
case EndIf = "EndIf";
5152
case ElseIf = "ElseIf";
5253
case EndFor = "EndFor";

0 commit comments

Comments
 (0)