Skip to content

Commit ef85ca5

Browse files
authored
Merge pull request #29 from PackageFactory/task/27/remove-arithmetics
TASK: Remove floating point numbers and arithmetic operations from language core
2 parents 279738d + 57b82e5 commit ef85ca5

File tree

46 files changed

+248
-736
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+248
-736
lines changed

src/Definition/BinaryOperator.php

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,6 @@ enum BinaryOperator: string
2929
case AND = 'AND';
3030
case OR = 'OR';
3131

32-
case PLUS = 'PLUS';
33-
case MINUS = 'MINUS';
34-
case MULTIPLY_BY = 'MULTIPLY_BY';
35-
case DIVIDE_BY = 'DIVIDE_BY';
36-
case MODULO = 'MODULO';
37-
3832
case EQUAL = 'EQUAL';
3933
case NOT_EQUAL = 'NOT_EQUAL';
4034
case GREATER_THAN = 'GREATER_THAN';
@@ -48,12 +42,6 @@ public static function fromTokenType(TokenType $tokenType): self
4842
TokenType::OPERATOR_BOOLEAN_AND => self::AND,
4943
TokenType::OPERATOR_BOOLEAN_OR => self::OR,
5044

51-
TokenType::OPERATOR_ARITHMETIC_PLUS => self::PLUS,
52-
TokenType::OPERATOR_ARITHMETIC_MINUS => self::MINUS,
53-
TokenType::OPERATOR_ARITHMETIC_MULTIPLY_BY => self::MULTIPLY_BY,
54-
TokenType::OPERATOR_ARITHMETIC_DIVIDE_BY => self::DIVIDE_BY,
55-
TokenType::OPERATOR_ARITHMETIC_MODULO => self::MODULO,
56-
5745
TokenType::COMPARATOR_EQUAL => self::EQUAL,
5846
TokenType::COMPARATOR_NOT_EQUAL => self::NOT_EQUAL,
5947
TokenType::COMPARATOR_GREATER_THAN => self::GREATER_THAN,
@@ -72,13 +60,6 @@ public function toPrecedence(): Precedence
7260

7361
self::OR => Precedence::LOGICAL_OR,
7462

75-
self::PLUS,
76-
self::MINUS => Precedence::DASH,
77-
78-
self::MULTIPLY_BY,
79-
self::DIVIDE_BY,
80-
self::MODULO => Precedence::POINT,
81-
8263
self::EQUAL,
8364
self::NOT_EQUAL => Precedence::EQUALITY,
8465

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
use PackageFactory\ComponentEngine\Parser\Tokenizer\TokenType;
2626

27-
enum NumberFormat: string
27+
enum IntegerFormat: string
2828
{
2929
case BINARY = 'BINARY';
3030
case OCTAL = 'OCTAL';
@@ -36,11 +36,10 @@ public static function fromTokenType(TokenType $tokenType): self
3636
return match ($tokenType) {
3737
TokenType::NUMBER_BINARY => self::BINARY,
3838
TokenType::NUMBER_OCTAL => self::OCTAL,
39-
TokenType::NUMBER_DECIMAL,
40-
TokenType::PERIOD => self::DECIMAL,
39+
TokenType::NUMBER_DECIMAL => self::DECIMAL,
4140
TokenType::NUMBER_HEXADECIMAL => self::HEXADECIMAL,
4241

43-
default => throw new \Exception('@TODO: Unknown Number Format: ' . $tokenType->value)
42+
default => throw new \Exception('@TODO: Unknown Integer Format: ' . $tokenType->value)
4443
};
4544
}
4645
}

src/Definition/Precedence.php

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ enum Precedence: int
3434

3535
case ACCESS = 18;
3636
case UNARY = 15;
37-
case POINT = 13;
38-
case DASH = 12;
3937
case COMPARISON = 10;
4038
case EQUALITY = 9;
4139
case LOGICAL_AND = 5;
@@ -55,13 +53,6 @@ public static function forTokenType(TokenType $tokenType): self
5553

5654
TokenType::OPERATOR_BOOLEAN_NOT => self::UNARY,
5755

58-
TokenType::OPERATOR_ARITHMETIC_MULTIPLY_BY,
59-
TokenType::OPERATOR_ARITHMETIC_DIVIDE_BY,
60-
TokenType::OPERATOR_ARITHMETIC_MODULO => self::POINT,
61-
62-
TokenType::OPERATOR_ARITHMETIC_PLUS,
63-
TokenType::OPERATOR_ARITHMETIC_MINUS => self::DASH,
64-
6556
TokenType::COMPARATOR_GREATER_THAN,
6657
TokenType::COMPARATOR_GREATER_THAN_OR_EQUAL,
6758
TokenType::COMPARATOR_LESS_THAN,

src/Parser/Ast/EnumMemberDeclarationNode.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ final class EnumMemberDeclarationNode implements \JsonSerializable
3030
{
3131
private function __construct(
3232
public readonly string $name,
33-
public readonly null|StringLiteralNode|NumberLiteralNode $value
33+
public readonly null|StringLiteralNode|IntegerLiteralNode $value
3434
) {
3535
}
3636

@@ -54,7 +54,7 @@ public static function fromTokens(\Iterator $tokens): self
5454
/** @phpstan-ignore-next-line */
5555
TokenType::STRING_QUOTED => StringLiteralNode::fromTokens($tokens),
5656
/** @phpstan-ignore-next-line */
57-
TokenType::NUMBER_DECIMAL => NumberLiteralNode::fromTokens($tokens),
57+
TokenType::NUMBER_DECIMAL => IntegerLiteralNode::fromTokens($tokens),
5858
default => throw new \Exception('@TODO: Unexpected Token ' . Scanner::type($tokens)->value)
5959
};
6060
/** @phpstan-ignore-next-line */

src/Parser/Ast/ExpressionNode.php

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
final class ExpressionNode implements \JsonSerializable
3434
{
3535
private function __construct(
36-
public readonly IdentifierNode | NumberLiteralNode | BinaryOperationNode | UnaryOperationNode | AccessNode | TernaryOperationNode | TagNode | StringLiteralNode | MatchNode | TemplateLiteralNode | BooleanLiteralNode | NullLiteralNode $root
36+
public readonly IdentifierNode | IntegerLiteralNode | BinaryOperationNode | UnaryOperationNode | AccessNode | TernaryOperationNode | TagNode | StringLiteralNode | MatchNode | TemplateLiteralNode | BooleanLiteralNode | NullLiteralNode $root
3737
) {
3838
}
3939

@@ -89,7 +89,7 @@ public static function fromTokens(\Iterator &$tokens, Precedence $precedence = P
8989
case TokenType::NUMBER_DECIMAL:
9090
case TokenType::NUMBER_HEXADECIMAL:
9191
case TokenType::PERIOD:
92-
$root = NumberLiteralNode::fromTokens($tokens);
92+
$root = IntegerLiteralNode::fromTokens($tokens);
9393
break;
9494
case TokenType::KEYWORD_TRUE:
9595
case TokenType::KEYWORD_FALSE:
@@ -134,11 +134,6 @@ public static function fromTokens(\Iterator &$tokens, Precedence $precedence = P
134134
switch (Scanner::type($tokens)) {
135135
case TokenType::OPERATOR_BOOLEAN_AND:
136136
case TokenType::OPERATOR_BOOLEAN_OR:
137-
case TokenType::OPERATOR_ARITHMETIC_PLUS:
138-
case TokenType::OPERATOR_ARITHMETIC_MINUS:
139-
case TokenType::OPERATOR_ARITHMETIC_MULTIPLY_BY:
140-
case TokenType::OPERATOR_ARITHMETIC_DIVIDE_BY:
141-
case TokenType::OPERATOR_ARITHMETIC_MODULO:
142137
case TokenType::COMPARATOR_EQUAL:
143138
case TokenType::COMPARATOR_NOT_EQUAL:
144139
case TokenType::COMPARATOR_GREATER_THAN:
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@
2222

2323
namespace PackageFactory\ComponentEngine\Parser\Ast;
2424

25-
use PackageFactory\ComponentEngine\Definition\NumberFormat;
25+
use PackageFactory\ComponentEngine\Definition\IntegerFormat;
2626
use PackageFactory\ComponentEngine\Parser\Tokenizer\Scanner;
2727
use PackageFactory\ComponentEngine\Parser\Tokenizer\Token;
2828

29-
final class NumberLiteralNode implements \JsonSerializable
29+
final class IntegerLiteralNode implements \JsonSerializable
3030
{
3131
private function __construct(
3232
public readonly string $value,
33-
public readonly NumberFormat $format
33+
public readonly IntegerFormat $format
3434
) {
3535
}
3636

@@ -40,7 +40,7 @@ private function __construct(
4040
*/
4141
public static function fromTokens(\Iterator $tokens): self
4242
{
43-
$format = NumberFormat::fromTokenType(Scanner::type($tokens));
43+
$format = IntegerFormat::fromTokenType(Scanner::type($tokens));
4444
$value = Scanner::value($tokens);
4545

4646
Scanner::skipOne($tokens);
@@ -54,7 +54,7 @@ public static function fromTokens(\Iterator $tokens): self
5454
public function jsonSerialize(): mixed
5555
{
5656
return [
57-
'type' => 'NumberLiteralNode',
57+
'type' => 'IntegerLiteralNode',
5858
'payload' => [
5959
'value' => $this->value,
6060
'format' => $this->format->value

src/Parser/Tokenizer/TokenType.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,6 @@ enum TokenType: string
5858
case OPERATOR_BOOLEAN_OR = 'OPERATOR_BOOLEAN_OR';
5959
case OPERATOR_BOOLEAN_NOT = 'OPERATOR_BOOLEAN_NOT';
6060

61-
case OPERATOR_ARITHMETIC_PLUS = 'OPERATOR_ARITHMETIC_PLUS';
62-
case OPERATOR_ARITHMETIC_MINUS = 'OPERATOR_ARITHMETIC_MINUS';
63-
case OPERATOR_ARITHMETIC_MULTIPLY_BY = 'OPERATOR_ARITHMETIC_MULTIPLY_BY';
64-
case OPERATOR_ARITHMETIC_DIVIDE_BY = 'OPERATOR_ARITHMETIC_DIVIDE_BY';
65-
case OPERATOR_ARITHMETIC_MODULO = 'OPERATOR_ARITHMETIC_MODULO';
66-
6761
case COMPARATOR_EQUAL = 'COMPARATOR_EQUAL';
6862
case COMPARATOR_NOT_EQUAL = 'COMPARATOR_NOT_EQUAL';
6963
case COMPARATOR_GREATER_THAN = 'COMPARATOR_GREATER_THAN';
@@ -117,6 +111,8 @@ public static function fromBuffer(Buffer $buffer): TokenType
117111
$value === 'false' => self::KEYWORD_FALSE,
118112
$value === 'null' => self::KEYWORD_NULL,
119113

114+
$value === '.' => self::PERIOD,
115+
120116
(bool) preg_match(
121117
'/^0[bB][0-1]+$/',
122118
$value
@@ -126,7 +122,7 @@ public static function fromBuffer(Buffer $buffer): TokenType
126122
$value
127123
) => self::NUMBER_OCTAL,
128124
$value !== '' && preg_match(
129-
'/^([-+]?[0-9]+)?(\.[0-9]+)?([eE][0-9]+)?$/',
125+
'/^([-+]?[0-9]+)$/',
130126
$value
131127
) => self::NUMBER_DECIMAL,
132128
(bool) preg_match(

src/Parser/Tokenizer/Tokenizer.php

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,7 @@ private static function block(\Iterator $fragments): \Iterator
8585
CharacterType::TEMPLATE_LITERAL_DELIMITER => self::templateLiteral($fragments),
8686
CharacterType::BRACKET_OPEN => self::block($fragments),
8787
CharacterType::ANGLE_OPEN => self::angle($fragments),
88-
CharacterType::PERIOD => match (TokenType::fromBuffer($buffer)) {
89-
TokenType::NUMBER_BINARY,
90-
TokenType::NUMBER_OCTAL,
91-
TokenType::NUMBER_DECIMAL,
92-
TokenType::NUMBER_HEXADECIMAL => null,
93-
default => self::period($fragments)
94-
},
88+
CharacterType::PERIOD => self::period($fragments),
9589
CharacterType::ANGLE_CLOSE,
9690
CharacterType::FORWARD_SLASH,
9791
CharacterType::SYMBOL => self::symbol($fragments),
@@ -235,27 +229,6 @@ public static function period(\Iterator $fragments): \Iterator
235229
$buffer = Buffer::empty()->append($fragments->current());
236230
$fragments->next();
237231

238-
if ($fragments->valid()) {
239-
$fragment = $fragments->current();
240-
241-
if (CharacterType::DIGIT->is($fragment->value)) {
242-
$buffer->append($fragment);
243-
$fragments->next();
244-
245-
while ($fragments->valid()) {
246-
$fragment = $fragments->current();
247-
248-
if (CharacterType::DIGIT->is($fragment->value)) {
249-
$buffer->append($fragment);
250-
$fragments->next();
251-
} else {
252-
yield from $buffer->flush(TokenType::NUMBER_DECIMAL);
253-
return;
254-
}
255-
}
256-
}
257-
}
258-
259232
yield from $buffer->flush(TokenType::PERIOD);
260233
}
261234

@@ -287,11 +260,6 @@ public static function symbol(\Iterator $fragments, ?Buffer $buffer = null): \It
287260
}
288261

289262
yield from match ($buffer->value()) {
290-
'+' => $buffer->flush(TokenType::OPERATOR_ARITHMETIC_PLUS),
291-
'-' => $buffer->flush(TokenType::OPERATOR_ARITHMETIC_MINUS),
292-
'*' => $buffer->flush(TokenType::OPERATOR_ARITHMETIC_MULTIPLY_BY),
293-
'/' => $buffer->flush(TokenType::OPERATOR_ARITHMETIC_DIVIDE_BY),
294-
'%' => $buffer->flush(TokenType::OPERATOR_ARITHMETIC_MODULO),
295263
'&&' => $buffer->flush(TokenType::OPERATOR_BOOLEAN_AND),
296264
'||' => $buffer->flush(TokenType::OPERATOR_BOOLEAN_OR),
297265
'!' => $buffer->flush(TokenType::OPERATOR_BOOLEAN_NOT),

src/Target/Php/Transpiler/BinaryOperation/BinaryOperationTranspiler.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,6 @@ private function transpileBinaryOperator(BinaryOperator $binaryOperator): string
3838
return match ($binaryOperator) {
3939
BinaryOperator::AND => '&&',
4040
BinaryOperator::OR => '||',
41-
BinaryOperator::PLUS => '+',
42-
BinaryOperator::MINUS => '-',
43-
BinaryOperator::MULTIPLY_BY => '*',
44-
BinaryOperator::DIVIDE_BY => '/',
45-
BinaryOperator::MODULO => '%',
4641
BinaryOperator::EQUAL => '===',
4742
BinaryOperator::NOT_EQUAL => '!==',
4843
BinaryOperator::GREATER_THAN => '>',

src/Target/Php/Transpiler/EnumDeclaration/EnumDeclarationTranspiler.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
use PackageFactory\ComponentEngine\Parser\Ast\EnumDeclarationNode;
2626
use PackageFactory\ComponentEngine\Parser\Ast\EnumMemberDeclarationNode;
27-
use PackageFactory\ComponentEngine\Parser\Ast\NumberLiteralNode;
27+
use PackageFactory\ComponentEngine\Parser\Ast\IntegerLiteralNode;
2828
use PackageFactory\ComponentEngine\Parser\Ast\StringLiteralNode;
2929

3030
final class EnumDeclarationTranspiler
@@ -62,7 +62,7 @@ public function transpile(EnumDeclarationNode $enumDeclarationNode): string
6262
private function transpileBackingType(EnumDeclarationNode $enumDeclarationNode): string
6363
{
6464
foreach ($enumDeclarationNode->memberDeclarations->items as $memberDeclarationNode) {
65-
if ($memberDeclarationNode->value instanceof NumberLiteralNode) {
65+
if ($memberDeclarationNode->value instanceof IntegerLiteralNode) {
6666
return 'int';
6767
} else {
6868
return 'string';
@@ -74,7 +74,7 @@ private function transpileBackingType(EnumDeclarationNode $enumDeclarationNode):
7474

7575
private function transpileMemberValue(EnumMemberDeclarationNode $enumMemberDeclarationNode): string
7676
{
77-
if ($enumMemberDeclarationNode->value instanceof NumberLiteralNode) {
77+
if ($enumMemberDeclarationNode->value instanceof IntegerLiteralNode) {
7878
return $enumMemberDeclarationNode->value->value;
7979
} else if ($enumMemberDeclarationNode->value instanceof StringLiteralNode) {
8080
return '\'' . $enumMemberDeclarationNode->value->value . '\'';

0 commit comments

Comments
 (0)