规范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\TokenAnd;
use JerryYan\DSL\Token\TokenOr;
use JerryYan\DSL\Token\TokenVar;
use JerryYan\DSL\Token\TokenLogicAnd;
use JerryYan\DSL\Token\TokenDefine;
use JerryYan\DSL\Token\TokenLogicEqual;
use JerryYan\DSL\Token\TokenLogicOr;
use JerryYan\DSL\Token\TokenVariable;
class DefaultFactory extends FactoryInterface
{
protected $tokenMap = [
Token::AND => TokenAnd::class,
Token::OR => TokenOr::class,
Token::VAR => TokenVar::class,
Token::LOGIC_AND => TokenLogicAnd::class,
Token::LOGIC_OR => TokenLogicOr::class,
Token::LOGIC_EQUAL => TokenLogicEqual::class,
Token::VARIABLE => TokenVariable::class,
Token::DEFINE => TokenDefine::class,
];
protected $tokenNameMap = [
"" => Token::AND,
"或者" => Token::OR,
"" => Token::OR,
];
protected $undefinedTokenClass = TokenVar::class;
protected $undefinedTokenClass = TokenVariable::class;
}

View File

@ -17,11 +17,22 @@ abstract class FactoryInterface
{
/** @var array<string, class-string<TokenInterface>> Token类型及映射类 */
protected $tokenMap = [];
/** @var array<string, string> Token别名映射 */
/** @var array<string, class-string<TokenInterface>> Token别名映射 */
protected $tokenNameMap = [];
/** @var class-string<TokenInterface> 默认Token类 */
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
{
$originalName = $name;

View File

@ -17,7 +17,31 @@ namespace JerryYan\DSL\Token;
*/
final class Token
{
const AND = "And";
const OR = "Or";
const VAR = "Var";
// 逻辑相关
const LOGIC_OR = "LOGIC_OR";
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;
/** @var string 原始数据 */
protected $_raw = "";
/** @var array 定义别名 */
static $alias = [];
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
/**
* @filename TokenVar.php
* @filename TokenVariable.php
* @author Jerry Yan <792602257@qq.com>
* @date 2021/1/22 9:41
*/
@ -9,7 +9,7 @@
namespace JerryYan\DSL\Token;
class TokenVar extends TokenInterface
class TokenVariable extends TokenInterface
{
}

View File

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

View File

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