规范Token名称

This commit is contained in:
Jerry Yan 2021-01-22 15:31:36 +08:00
parent 2489b52da2
commit 9610d0609d
12 changed files with 119 additions and 65 deletions

View File

@ -10,23 +10,21 @@ namespace JerryYan\DSL\Token\Factory;
use JerryYan\DSL\Token\Token; use JerryYan\DSL\Token\Token;
use JerryYan\DSL\Token\TokenAnd; use JerryYan\DSL\Token\TokenLogicAnd;
use JerryYan\DSL\Token\TokenOr; use JerryYan\DSL\Token\TokenDefine;
use JerryYan\DSL\Token\TokenVar; use JerryYan\DSL\Token\TokenLogicEqual;
use JerryYan\DSL\Token\TokenLogicOr;
use JerryYan\DSL\Token\TokenVariable;
class DefaultFactory extends FactoryInterface class DefaultFactory extends FactoryInterface
{ {
protected $tokenMap = [ protected $tokenMap = [
Token::AND => TokenAnd::class, Token::LOGIC_AND => TokenLogicAnd::class,
Token::OR => TokenOr::class, Token::LOGIC_OR => TokenLogicOr::class,
Token::VAR => TokenVar::class, Token::LOGIC_EQUAL => TokenLogicEqual::class,
Token::VARIABLE => TokenVariable::class,
Token::DEFINE => TokenDefine::class,
]; ];
protected $tokenNameMap = [ protected $undefinedTokenClass = TokenVariable::class;
"" => Token::AND,
"或者" => Token::OR,
"" => Token::OR,
];
protected $undefinedTokenClass = TokenVar::class;
} }

View File

@ -17,11 +17,22 @@ abstract class FactoryInterface
{ {
/** @var array<string, class-string<TokenInterface>> Token类型及映射类 */ /** @var array<string, class-string<TokenInterface>> Token类型及映射类 */
protected $tokenMap = []; protected $tokenMap = [];
/** @var array<string, string> Token别名映射 */ /** @var array<string, class-string<TokenInterface>> Token别名映射 */
protected $tokenNameMap = []; protected $tokenNameMap = [];
/** @var class-string<TokenInterface> 默认Token类 */ /** @var class-string<TokenInterface> 默认Token类 */
protected $undefinedTokenClass = TokenUndefined::class; protected $undefinedTokenClass = TokenUndefined::class;
public function __construct()
{
foreach ($this->tokenMap as $key=>$token) {
if (property_exists($token, "alias")){
foreach ($token::$alias as $name) {
$this->tokenNameMap[$name] = $key;
}
}
}
}
public function getTokenByName(string $name): TokenInterface public function getTokenByName(string $name): TokenInterface
{ {
$originalName = $name; $originalName = $name;

View File

@ -17,7 +17,31 @@ namespace JerryYan\DSL\Token;
*/ */
final class Token final class Token
{ {
const AND = "And"; // 逻辑相关
const OR = "Or"; const LOGIC_OR = "LOGIC_OR";
const VAR = "Var"; const LOGIC_AND = "LOGIC_AND";
const LOGIC_NOT = "LOGIC_NOT";
const LOGIC_EQUAL = "LOGIC_EQUAL";
const LOGIC_NOT_EQUAL = "LOGIC_NOT_EQUAL";
const LOGIC_GREATER = "LOGIC_GREATER";
const LOGIC_GREATER_EQUAL = "LOGIC_GREATER_EQUAL";
const LOGIC_LESS = "LOGIC_LESS";
const LOGIC_LESS_EQUAL = "LOGIC_LESS_EQUAL";
// 变量相关
const DEFINE = "DEFINE";
const VARIABLE = "VARIABLE";
const VAR_ASSIGN = "VAR_ASSIGN";
// 运算符相关
const OP_CONCAT = "Concat";
const OP_PLUS = "OP_PLUS";
const OP_PLUS_EQUAL = "OP_PLUS_EQUAL";
const OP_MINUS = "OP_MINUS";
const OP_MINUS_EQUAL = "OP_MINUS_EQUAL";
const OP_MULTIPLY = "OP_MULTIPLY";
const OP_MULTIPLY_EQUAL = "OP_MULTIPLY_EQUAL";
// 逻辑运算相关
const OP_OR = "OP_OR";
const OP_AND = "OP_AND";
const OP_XOR = "OP_XOR";
const OP_NOR = "OP_NOR";
} }

View File

@ -1,15 +0,0 @@
<?php
/**
* @filename TokenAnd.php
* @author Jerry Yan <792602257@qq.com>
* @date 2020/12/17 15:20
*/
namespace JerryYan\DSL\Token;
class TokenAnd extends TokenInterface
{
}

View File

@ -17,6 +17,8 @@ abstract class TokenInterface
protected $nextToken=NULL; protected $nextToken=NULL;
/** @var string 原始数据 */ /** @var string 原始数据 */
protected $_raw = ""; protected $_raw = "";
/** @var array 定义别名 */
static $alias = [];
public function __construct(string $original) public function __construct(string $original)
{ {

View File

@ -0,0 +1,17 @@
<?php
/**
* @filename TokenLogicAnd.php
* @author Jerry Yan <792602257@qq.com>
* @date 2020/12/17 15:20
*/
namespace JerryYan\DSL\Token;
class TokenLogicAnd extends TokenInterface
{
public static $alias = [
'和', '且'
];
}

View File

@ -0,0 +1,15 @@
<?php
/**
* @filename TokenLogicEqual.php
* @author Jerry Yan <792602257@qq.com>
* @date 2021/1/22 14:56
*/
namespace JerryYan\DSL\Token;
class TokenLogicEqual extends TokenInterface
{
}

View File

@ -0,0 +1,17 @@
<?php
/**
* @filename TokenLogicAnd.php
* @author Jerry Yan <792602257@qq.com>
* @date 2020/12/17 15:20
*/
namespace JerryYan\DSL\Token;
class TokenLogicOr extends TokenInterface
{
public static $alias = [
'或者'
];
}

View File

@ -1,15 +0,0 @@
<?php
/**
* @filename TokenAnd.php
* @author Jerry Yan <792602257@qq.com>
* @date 2020/12/17 15:20
*/
namespace JerryYan\DSL\Token;
class TokenOr extends TokenInterface
{
}

View File

@ -1,6 +1,6 @@
<?php <?php
/** /**
* @filename TokenVar.php * @filename TokenVariable.php
* @author Jerry Yan <792602257@qq.com> * @author Jerry Yan <792602257@qq.com>
* @date 2021/1/22 9:41 * @date 2021/1/22 9:41
*/ */
@ -9,7 +9,7 @@
namespace JerryYan\DSL\Token; namespace JerryYan\DSL\Token;
class TokenVar extends TokenInterface class TokenVariable extends TokenInterface
{ {
} }

View File

@ -7,23 +7,23 @@
namespace JerryYan\DSL\Test\Token; namespace JerryYan\DSL\Test\Token;
use JerryYan\DSL\Token\TokenAnd; use JerryYan\DSL\Token\TokenLogicAnd;
use JerryYan\DSL\Token\TokenDefine; use JerryYan\DSL\Token\TokenDefine;
use JerryYan\DSL\Token\TokenInterface; use JerryYan\DSL\Token\TokenInterface;
use JerryYan\DSL\Token\TokenOr; use JerryYan\DSL\Token\TokenLogicOr;
use JerryYan\DSL\Token\TokenUndefined; use JerryYan\DSL\Token\TokenUndefined;
use JerryYan\DSL\Token\TokenVar; use JerryYan\DSL\Token\TokenVariable;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class TokenInterfaceTest extends TestCase class TokenInterfaceTest extends TestCase
{ {
/** @var class-string<TokenInterface>[] TokenClass */ /** @var class-string<TokenInterface>[] TokenClass */
private $tokenTypes = [ private $tokenTypes = [
TokenAnd::class, TokenLogicAnd::class,
TokenDefine::class, TokenDefine::class,
TokenOr::class, TokenLogicOr::class,
TokenUndefined::class, TokenUndefined::class,
TokenVar::class, TokenVariable::class,
]; ];
protected $chainFirst; protected $chainFirst;
protected $chainLast; protected $chainLast;

View File

@ -9,10 +9,10 @@ namespace JerryYan\DSL\Test\Tokenizer;
use JerryYan\DSL\Reader\StringReader; use JerryYan\DSL\Reader\StringReader;
use JerryYan\DSL\Token\Factory\DefaultFactory; use JerryYan\DSL\Token\Factory\DefaultFactory;
use JerryYan\DSL\Token\TokenAnd; use JerryYan\DSL\Token\TokenLogicAnd;
use JerryYan\DSL\Token\TokenInterface; use JerryYan\DSL\Token\TokenInterface;
use JerryYan\DSL\Token\TokenOr; use JerryYan\DSL\Token\TokenLogicOr;
use JerryYan\DSL\Token\TokenVar; use JerryYan\DSL\Token\TokenVariable;
use JerryYan\DSL\Tokenizer\Tokenizer; use JerryYan\DSL\Tokenizer\Tokenizer;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@ -23,13 +23,13 @@ class TokenizerTest extends TestCase
private $text = "这个 和 那个 或者 那个 和 这个"; private $text = "这个 和 那个 或者 那个 和 这个";
/** @var class-string<TokenInterface>[] 预期的类型 */ /** @var class-string<TokenInterface>[] 预期的类型 */
private $textTokenType = [ private $textTokenType = [
TokenVar::class, TokenVariable::class,
TokenAnd::class, TokenLogicAnd::class,
TokenVar::class, TokenVariable::class,
TokenOr::class, TokenLogicOr::class,
TokenVar::class, TokenVariable::class,
TokenAnd::class, TokenLogicAnd::class,
TokenVar::class, TokenVariable::class,
]; ];
protected function setUp(): void protected function setUp(): void
{ {