Skip to content

Commit

Permalink
Rename ConstantRegistry::register() to ConstantRegistry::registerLabe…
Browse files Browse the repository at this point in the history
…l(), allow registering ConstantInfo directly using ConstantRegistry::register()
  • Loading branch information
Muqsit committed Nov 15, 2022
1 parent 4493f04 commit 1b0d2d5
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 28 deletions.
14 changes: 14 additions & 0 deletions src/muqsit/arithmexp/constant/ConstantInfo.php
@@ -0,0 +1,14 @@
<?php

declare(strict_types=1);

namespace muqsit\arithmexp\constant;

use muqsit\arithmexp\Parser;
use muqsit\arithmexp\token\builder\ExpressionTokenBuilderState;
use muqsit\arithmexp\token\IdentifierToken;

interface ConstantInfo{

public function writeExpressionTokens(Parser $parser, string $expression, IdentifierToken $token, ExpressionTokenBuilderState $state) : void;
}
57 changes: 33 additions & 24 deletions src/muqsit/arithmexp/constant/ConstantRegistry.php
Expand Up @@ -4,6 +4,7 @@

namespace muqsit\arithmexp\constant;

use InvalidArgumentException;
use const INF;
use const M_1_PI;
use const M_2_PI;
Expand All @@ -28,40 +29,48 @@ final class ConstantRegistry{

public static function createDefault() : self{
$registry = new self();
$registry->register("pi", M_PI);
$registry->register("e", M_E);
$registry->register("log2e", M_LOG2E);
$registry->register("log10e", M_LOG10E);
$registry->register("ln2", M_LN2);
$registry->register("ln10", M_LN10);
$registry->register("pi2", M_PI_2);
$registry->register("pi4", M_PI_4);
$registry->register("m_1pi", M_1_PI);
$registry->register("m_2pi", M_2_PI);
$registry->register("sqrtpi", M_SQRTPI);
$registry->register("m_2sqrtpi", M_2_SQRTPI);
$registry->register("sqrt2", M_SQRT2);
$registry->register("sqrt3", M_SQRT3);
$registry->register("sqrt12", M_SQRT1_2);
$registry->register("lnpi", M_LNPI);
$registry->register("euler", M_EULER);
$registry->register("nan", NAN);
$registry->register("inf", INF);
$registry->registerLabel("pi", M_PI);
$registry->registerLabel("e", M_E);
$registry->registerLabel("log2e", M_LOG2E);
$registry->registerLabel("log10e", M_LOG10E);
$registry->registerLabel("ln2", M_LN2);
$registry->registerLabel("ln10", M_LN10);
$registry->registerLabel("pi2", M_PI_2);
$registry->registerLabel("pi4", M_PI_4);
$registry->registerLabel("m_1pi", M_1_PI);
$registry->registerLabel("m_2pi", M_2_PI);
$registry->registerLabel("sqrtpi", M_SQRTPI);
$registry->registerLabel("m_2sqrtpi", M_2_SQRTPI);
$registry->registerLabel("sqrt2", M_SQRT2);
$registry->registerLabel("sqrt3", M_SQRT3);
$registry->registerLabel("sqrt12", M_SQRT1_2);
$registry->registerLabel("lnpi", M_LNPI);
$registry->registerLabel("euler", M_EULER);
$registry->registerLabel("nan", NAN);
$registry->registerLabel("inf", INF);
return $registry;
}

/** @var array<string, int|float> */
public array $registered = [];
/** @var array<string, ConstantInfo> */
private array $registered = [];

public function __construct(){
}

public function register(string $operator, int|float $value) : void{
$this->registered[$operator] = $value;
public function register(string $identifier, ConstantInfo $info) : void{
$this->registered[$identifier] = $info;
}

public function registerLabel(string $identifier, int|float $value) : void{
$this->register($identifier, new SimpleConstantInfo($value));
}

public function get(string $identifier) : ConstantInfo{
return $this->registered[$identifier] ?? throw new InvalidArgumentException("Constant \"{$identifier}\" is not registered");
}

/**
* @return array<string, int|float>
* @return array<string, ConstantInfo>
*/
public function getRegistered() : array{
return $this->registered;
Expand Down
21 changes: 21 additions & 0 deletions src/muqsit/arithmexp/constant/SimpleConstantInfo.php
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

namespace muqsit\arithmexp\constant;

use muqsit\arithmexp\expression\token\NumericLiteralExpressionToken;
use muqsit\arithmexp\Parser;
use muqsit\arithmexp\token\builder\ExpressionTokenBuilderState;
use muqsit\arithmexp\token\IdentifierToken;

final class SimpleConstantInfo implements ConstantInfo{

public function __construct(
private int|float $value
){}

public function writeExpressionTokens(Parser $parser, string $expression, IdentifierToken $token, ExpressionTokenBuilderState $state) : void{
$state->current_group[$state->current_index] = new NumericLiteralExpressionToken($token->getPos(), $this->value);
}
}
11 changes: 8 additions & 3 deletions src/muqsit/arithmexp/token/IdentifierToken.php
Expand Up @@ -4,7 +4,7 @@

namespace muqsit\arithmexp\token;

use muqsit\arithmexp\expression\token\NumericLiteralExpressionToken;
use InvalidArgumentException;
use muqsit\arithmexp\expression\token\VariableExpressionToken;
use muqsit\arithmexp\Position;
use muqsit\arithmexp\token\builder\ExpressionTokenBuilderState;
Expand All @@ -27,8 +27,13 @@ public function repositioned(Position $position) : self{
}

public function writeExpressionTokens(ExpressionTokenBuilderState $state) : void{
$constant_value = $state->parser->getConstantRegistry()->registered[$this->label] ?? null;
$state->current_group[$state->current_index] = $constant_value !== null ? new NumericLiteralExpressionToken($this->position, $constant_value) : new VariableExpressionToken($this->position, $this->label);
try{
$info = $state->parser->getConstantRegistry()->get($this->label);
}catch(InvalidArgumentException){
$state->current_group[$state->current_index] = new VariableExpressionToken($this->position, $this->label);
return;
}
$info->writeExpressionTokens($state->parser, $state->expression, $this, $state);
}

public function __debugInfo() : array{
Expand Down
2 changes: 1 addition & 1 deletion tests/muqsit/arithmexp/ExpressionTest.php
Expand Up @@ -215,7 +215,7 @@ public function testNonstandardUnaryOperatorWithExistingSymbol() : void{

public function testNonstandardConstant() : void{
$c = 299_792_458;
$this->parser->getConstantRegistry()->register("c", $c);
$this->parser->getConstantRegistry()->registerLabel("c", $c);
$expression = $this->parser->parse("5.57 * c / -12.3 + 3 / c");
self::assertEquals(5.57 * $c / -12.3 + 3 / $c, $expression->evaluate());
}
Expand Down

0 comments on commit 1b0d2d5

Please sign in to comment.