Exemple #1
0
 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);
 }
Exemple #2
0
 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);
     }
 }
Exemple #3
0
 public function setAbstractToken(Token $aAbstractToken)
 {
     if ($aAbstractToken->tokenType() !== T_ABSTRACT) {
         throw new ClassCompileException(null, $aAbstractToken, "参数 \$aAbstractToken 必须为 T_ABSTRACT 类型的Token对象");
     }
     $this->aAbstractToken = $aAbstractToken;
 }
Exemple #4
0
 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);
 }
Exemple #6
0
 /**
  * 设置定义class名称的token
  */
 public function setNameToken(Token $aTokenName)
 {
     if ($aTokenName->tokenType() !== T_STRING) {
         throw new ClassCompileException(null, $aTokenName, "参数 \$aTokenName 必须是一个 T_STRING 类型 token 对象");
     }
     $this->aTokenName = $aTokenName;
 }
Exemple #7
0
 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;
         }
     }
 }