2013年2月28日 星期四

自訂運算子符號

先前有提過如何自訂運算子,如果想進一步自訂UnrealScript沒有支援的運算子符號時,那該怎麼做呢?雖然UnrealScript沒有提供自訂運算子符號的功能,不過其實只要稍微修改一下解析運算子符號的程式碼就可以了。例如如果想要增加一個目前UnrealScript沒有支援的運算子&=:
   
native static final operator int &= ( out int A, int B );
只要修改一下FScriptCompiler的GetToken()函式,增加辨識&=符號即可。
UBOOL FScriptCompiler::GetToken( FToken& Token, const FPropertyBase* Hint, UBOOL NoConsts )
{
 else
 {
...
  if
  ( PAIR('<','<')
...  
  || PAIR('$','=')
  || PAIR('&','=')
  )
  {
...
  }
...
 }
}

FName GAndEqual( TEXT("&=") );
不過編譯器會把符號字串轉換成FName儲存,而且只尋找而不新增名稱,所以用上一行預先把&=符號加入名稱表。

接下來自訂運算子的部分其實就跟之前一樣了:
class MyOperator extends Object
   ntaive;
   
native(233) static final operator(26) int &= ( out int A, int B );

function Test( int A, int B )
{
   local int aa;
   aa = A;
   A &= B;
   `log(A@"<="@aa@"&="@B);
}
實作碼:
IMPLEMENT_CLASS(UMyOperator);

void UMyOperator::execAddEqual_IntInt( FFrame& Stack, RESULT_DECL )
{
   P_GET_INT_REF(A);
   P_GET_INT(B);
   P_FINISH;
   
   *(INT*)Result = (A &= B);    
}

沒有留言:

張貼留言