public function __construct(Token $aToken) { if (!array_key_exists($aToken->tokenType(), self::$arrClosureObjectBeginTypes) and !array_key_exists($aToken->tokenType(), self::$arrClosureObjectEndTypes)) { throw new ClassCompileException(null, $aToken, "参数 \$aToken 传入的不是一个有效的闭合token(%s:%s)。该参数只接受以下类型的token:" . implode(', ', self::closureSymbols()), array($aToken->tokenTypeName(), $aToken->sourceCode())); } $this->cloneOf($aToken); }
public function __construct(Token $aToken, Token $aTokenName, Token $aArgv = null) { //自身必须是"new" token if ($aToken->tokenType() !== T_NEW) { throw new ClassCompileException(null, $aToken, "参数 \$aToken 必须是一个 T_NEW 类型的Token对象"); } //name token 必须是 命名空间,变量,字符串中的一种 if ($aTokenName->tokenType() !== T_NAMESPACE && $aTokenName->tokenType() !== T_VARIABLE && $aTokenName->tokenType() !== T_STRING) { throw new ClassCompileException(null, $aTokenName, "参数 \$aTokenName 必须是一个合法的类名Token对象"); } $this->cloneOf($aToken); if ($aArgv !== null) { $this->setArgvToken($aArgv); } }
public function setAbstractToken(Token $aAbstractToken) { if ($aAbstractToken->tokenType() !== T_ABSTRACT) { throw new ClassCompileException(null, $aAbstractToken, "参数 \$aAbstractToken 必须为 T_ABSTRACT 类型的Token对象"); } $this->aAbstractToken = $aAbstractToken; }
public function setAsNameToken(Token $aAsNameToken) { if ($aAsNameToken->tokenType() != T_STRING) { throw new ClassCompileException(null, $aAsNameToken, "参数 \$aToken 必须是一个 T_STRING 类型的Token对象"); } $this->aAsNameToken = $aAsNameToken; }
public function __construct(Token $aToken) { if ($aToken->tokenType() !== T_DOC_COMMENT) { throw new ClassCompileException(null, $aToken, "参数 \$aToken 必须为 T_DOC_COMMENT 类型的Token对象"); } $this->cloneOf($aToken); }
/** * 设置定义class名称的token */ public function setNameToken(Token $aTokenName) { if ($aTokenName->tokenType() !== T_STRING) { throw new ClassCompileException(null, $aTokenName, "参数 \$aTokenName 必须是一个 T_STRING 类型 token 对象"); } $this->aTokenName = $aTokenName; }
public function __construct(Token $aToken) { if ($aToken->tokenType() != T_NAMESPACE) { throw new ClassCompileException(null, $aToken, "参数 \$aToken 必须是一个 T_NAMESPACE 类型的Token对象"); } $this->cloneOf($aToken); $this->setBelongsNamespace($this); }
public function generateTargetCode(TokenPool $aTokenPool, Token $aObject) { switch( $aObject->tokenType() ) { case T_OBJECT_OPERATOR : // -> to . $aObject->setTargetCode('.') ; break ; case Token::T_CONCAT : // . to + $aObject->setTargetCode('+') ; break ; case T_CONCAT_EQUAL : // .= to += $aObject->setTargetCode('+=') ; break ; case T_VARIABLE : // 变量名前的 $ $aObject->setTargetCode( str_replace('$','',$aObject->sourceCode()) ) ; break ; case T_OPEN_TAG : // < ?php $aObject->setTargetCode( '' ) ; break ; case T_OPEN_TAG_WITH_ECHO : // < ?= $aObject->setTargetCode( 'echo ' ) ; break ; case T_CLOSE_TAG : // ? > $aObject->setTargetCode( '' ) ; break ; // 字符串压缩到一行 case T_CONSTANT_ENCAPSED_STRING : case T_ENCAPSED_AND_WHITESPACE: $sTarget = str_replace("\r","\\r", $aObject->targetCode()) ; $sTarget = str_replace("\n","\\n", $sTarget) ; $aObject->setTargetCode($sTarget) ; break ; // 转换 foreach (js 中没有foreach) case T_FOREACH: $this->transForeach($aTokenPool,$aObject) ; break ; case T_ENDFOREACH: // @todo break; } }
public function matchExecutionPoint(Token $aToken) { $bIsPattern = $this->weaveMethodIsPattern(); // 模糊匹配每个方法 if ($bIsPattern and $aToken instanceof FunctionDefine) { // 必须是一个类方法 if (!($aClass = $aToken->belongsClass())) { return false; } if (!$this->matchClass($aClass->fullName())) { return false; } return preg_match($this->weaveMethodNameRegexp(), $aToken->name()) ? true : false; } else { if (!$bIsPattern and $aToken instanceof ClosureToken) { // 必须是一个 "}" if ($aToken->tokenType() != Token::T_BRACE_CLOSE) { return false; } // 必须成对 if (!$aToken->theOther()) { return false; } $aClass = $aToken->theOther()->belongsClass(); if (null === $aClass) { return false; } // 必须做为 class 的结束边界 if ($aToken->theOther() !== $aClass->bodyToken()) { return false; } if (!$this->matchClass($aClass->fullName())) { return false; } return true; } } }