<?php namespace eMacros;
class Symbol implements Expression { /** * Symbol expression * @var string */ public $symbol; /** * Symbol package * @var NULL|string */ public $package; /** * Package prefix regex * @var string */ const PACKAGE_PREFIX = '/^([a-z|A-Z|_][\w]+)::/'; /** * Symbol validation regex * @var string */ const PATTERN = '{^[^\s\d(){}\[\]"\';][^\s\'"(){}\[\];]*$}';
public static function validateSymbol($symbol) { if (!is_string($symbol)) { throw new \UnexpectedValueException(sprintf("Symbol: unexpected value of type '%s'.", gettype($symbol))); } if (!preg_match(self::PATTERN, $symbol)) { throw new \UnexpectedValueException(sprintf("Symbol: '%s' is not a valid symbol.", $symbol)); } return $symbol; } public function __construct($symbol) { //obtain package, if any if (preg_match(self::PACKAGE_PREFIX, $symbol, $matches)) { $this->package = $matches[1]; $symbol = substr($symbol, strlen($this->package) + 2); }
$this->symbol = self::validateSymbol($symbol); } public function evaluate(Scope $scope) { return $scope[$this]; } public function __toString() { return $this->symbol; } } ?>
|