* @date 2021/1/22 13:42 */ namespace JerryYan\DSL\Token\Factory; use JerryYan\DSL\Token\TokenInterface; use JerryYan\DSL\Token\TokenUndefined; abstract class FactoryInterface { /** @var array> Token类型及映射类 */ protected $tokenMap = []; /** @var array Token别名映射 */ protected $tokenNameMap = []; /** @var class-string 默认Token类 */ protected $undefinedTokenClass = TokenUndefined::class; public function getTokenByName(string $name): TokenInterface { $originalName = $name; if (isset($this->tokenNameMap[$name])) { $name = $this->tokenNameMap[$name]; } if (!isset($this->tokenMap[$name])) { return new $this->undefinedTokenClass($originalName); } else { return new $this->tokenMap[$name]($originalName); } } }