Index: /BasicCompiler32/NumOpe.cpp
===================================================================
--- /BasicCompiler32/NumOpe.cpp	(revision 40)
+++ /BasicCompiler32/NumOpe.cpp	(revision 41)
@@ -667,7 +667,19 @@
 				break;
 
+			case CALC_BYVAL:
+				//ポインタ型→参照型
+				if( PTR_LEVEL( type[sp-1] ) <= 0 ){
+					//ポインタ型ではないとき
+					SetError( 3, NULL, cp );
+					goto error;
+				}
+
+				type[sp-1] = PTR_LEVEL_DOWN( type[sp-1] );
+
+				break;
+
 			default:
 				SetError(300,NULL,cp);
-				break;
+				goto error;
 		}
 	}
Index: /BasicCompiler64/Compile_Var.cpp
===================================================================
--- /BasicCompiler64/Compile_Var.cpp	(revision 40)
+++ /BasicCompiler64/Compile_Var.cpp	(revision 41)
@@ -934,4 +934,9 @@
 	}
 
+
+	///////////////////////////////////////
+	// 単発式（[]で囲まれていない）
+	///////////////////////////////////////
+
 	if(SubScripts[0]!=-1){
 		SetError(41,0,cp);
Index: /BasicCompiler64/NumOpe.cpp
===================================================================
--- /BasicCompiler64/NumOpe.cpp	(revision 40)
+++ /BasicCompiler64/NumOpe.cpp	(revision 41)
@@ -737,8 +737,19 @@
 				if(!Calc_Cast(type,index_stack,&sp)) goto error;
 				break;
+			case CALC_BYVAL:
+				//ポインタ型→参照型
+				if( PTR_LEVEL( type[sp-1] ) <= 0 ){
+					//ポインタ型ではないとき
+					SetError( 3, NULL, cp );
+					goto error;
+				}
+
+				type[sp-1] = PTR_LEVEL_DOWN( type[sp-1] );
+
+				break;
 
 			default:
 				SetError(300,NULL,cp);
-				break;
+				goto error;
 		}
 	}
Index: /BasicCompiler_Common/BasicFixed.h
===================================================================
--- /BasicCompiler_Common/BasicFixed.h	(revision 40)
+++ /BasicCompiler_Common/BasicFixed.h	(revision 41)
@@ -54,5 +54,6 @@
 #define NATURAL_TYPE(t)	((t)&MASK_NATURAL)
 #define MAKE_PTR_TYPE(t,p)	((t)|((p)<<8))
-#define PTR_LEVEL_UP(t)	MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)+1)
+#define PTR_LEVEL_UP(t)		MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)+1)
+#define PTR_LEVEL_DOWN(t)	MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)-1)
 
 #define DEF_PTR_BYTE	MAKE_PTR_TYPE(DEF_BYTE,1)
@@ -105,4 +106,5 @@
 #define CALC_INTQUOTIENT	63	//整数除算
 #define CALC_AS				71	// As
+#define CALC_BYVAL			72	// ByVal
 #define CALC_MINUSMARK		81	// -x
 #define CALC_POWER			91	// ^
Index: /BasicCompiler_Common/NumOpe_GetType.cpp
===================================================================
--- /BasicCompiler_Common/NumOpe_GetType.cpp	(revision 40)
+++ /BasicCompiler_Common/NumOpe_GetType.cpp	(revision 41)
@@ -163,4 +163,12 @@
 		case CALC_AS:
 			if((type[sp-1]&FLAG_CAST)==0){
+				//型名が指定されていないときはエラー
+				SetError(47,NULL,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_BYVAL:
+			if(type[sp-1]&FLAG_CAST){
 				//型名が指定されていないときはエラー
 				SetError(47,NULL,cp);
@@ -601,4 +609,15 @@
 				sp--;
 				break;
+
+			case CALC_BYVAL:
+				//ポインタ型→参照型
+				if( PTR_LEVEL( type[sp-1] ) <= 0 ){
+					//ポインタ型ではないとき
+					SetError( 3, NULL, cp );
+					goto error;
+				}
+
+				type[sp-1] = PTR_LEVEL_DOWN( type[sp-1] );
+				break;
 		}
 	}
Index: /BasicCompiler_Common/StrOperation.cpp
===================================================================
--- /BasicCompiler_Common/StrOperation.cpp	(revision 40)
+++ /BasicCompiler_Common/StrOperation.cpp	(revision 41)
@@ -652,4 +652,7 @@
 			lstrcpy(name,"As");
 			break;
+		case CALC_BYVAL:
+			lstrcpy(name,"ByVal");
+			break;
 		case CALC_MINUSMARK:
 			lstrcpy(name,"-");
Index: /BasicCompiler_Common/calculation.cpp
===================================================================
--- /BasicCompiler_Common/calculation.cpp	(revision 40)
+++ /BasicCompiler_Common/calculation.cpp	(revision 41)
@@ -39,5 +39,6 @@
 		Command[p]=='='||Command[p]=='<'||Command[p]=='>'||
 		IsJudgMark(Command,p)||
-		(Command[p]==1&&Command[p+1]==ESC_AS)) return 1;
+		(Command[p]==1&&Command[p+1]==ESC_AS)||
+		(Command[p]==1&&Command[p+1]==ESC_BYVAL)) return 1;
 	return 0;
 }
@@ -775,4 +776,5 @@
 			else if(Command[i]=='^') i3=CALC_POWER;
 			else if(Command[i]==1&&Command[i+1]==ESC_AS) i3=CALC_AS;
+			else if(Command[i]==1&&Command[i+1]==ESC_BYVAL) i3=CALC_BYVAL;
 
 			i3+=PareNum*100;
@@ -889,4 +891,7 @@
 				sp--;
 				break;
+			case CALC_BYVAL:
+				//エラー
+				break;
 		}
 	}
@@ -1404,4 +1409,5 @@
 	else if(Command[0]=='^') return CALC_POWER;
 	else if(Command[0]==1&&Command[1]==ESC_AS) return CALC_AS;
+	else if(Command[0]==1&&Command[1]==ESC_BYVAL) return CALC_BYVAL;
 
 	return 0;
@@ -1480,7 +1486,12 @@
 			}
 			else{
-				if(!(Command[i]=='+'||Command[i]=='-'||(Command[i]==1&&Command[i+1]==ESC_NOT))){
-					SetError(1,NULL,cp);
-					return 0;
+				if(!(
+						Command[i]=='+'||
+						Command[i]=='-'||
+						(Command[i]==1&&Command[i+1]==ESC_NOT)||
+						(Command[i]==1&&Command[i+1]==ESC_BYVAL)
+					)){
+						SetError(1,NULL,cp);
+						return 0;
 				}
 				if(Command[i]=='+'){
Index: /ProjectEditor/SubOperation.cpp
===================================================================
--- /ProjectEditor/SubOperation.cpp	(revision 40)
+++ /ProjectEditor/SubOperation.cpp	(revision 41)
@@ -504,4 +504,5 @@
 	else if(str[0]=='o'||str[0]=='O'){
 		if(lstrcmpi(str,"Open")==0) return COM_OPEN;
+		if(lstrcmpi(str,"Operator")==0) return -1;
 		if(lstrcmpi(str,"Override")==0) return COM_OVERRIDE;
 	}
