Instruction.h 1.83 KB
Newer Older
Genki Sakanashi's avatar
Genki Sakanashi committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#pragma once

#include "define.h"
#include "Routine.h"
#include "Resource.h"
#include <memory>
#include <list>
#include <string>
#include <new>

class Routine;

struct Instruction : Resource{
  Routine* routine = nullptr; //この命令を含む関数
  INS_TYPE type; //命令の種別
  std::string label;  //命令に付加されたラベル
  std::string flag;  //IFの条件となるフラグ or NEXTで変化させるフラグ
  /*
  InstPtr branch = nullptr; //BRANCHの飛び先
  std::string jmp; //JMPの飛び先
  std::string skip; //SKIPの飛び先
  */
  InstPtr move_to = nullptr; //BRANCH, JMP, SKIPの飛び先
  InstPtr next_cluster_branch = nullptr; //次のOPR,ROT,OUTPUT,INPUTのInstruction

  //以下の変数名・値は通常の変数定義には使われない.
  //CALL命令内部など,メインストリームにLABEL:VALUR形式を埋め込みたいときに使用する.
  std::string varname; //変数名となるラベル名
  std::string varval; //変数の値

  std::string unit; //ユニット名
  std::string unit_arg; //ユニットを呼ぶときの引数(というかDレジスタにセットする値).なくてもよい

  Instruction();
  Instruction(INS_TYPE type);

  static InstPtr IF_BRANCH(std::string flag);
  static InstPtr IF_BRANCH_ASSIGNED(std::string flag, InstPtr branch = NULL);
  static InstPtr NEXT(std::string flag);
  static InstPtr SKIP(InstPtr label);
  static InstPtr LABEL(std::string label);
  static InstPtr JMP(InstPtr jmp);
  static InstPtr REV_JMP();
  static InstPtr INPUT();
  static InstPtr REV_INPUT();
  static InstPtr OUTPUT();
  static InstPtr REV_OUTPUT();
  static InstPtr DUP();
  static InstPtr END();
  static InstPtr VAR(std::string name, std::string val);
  static InstPtr VAR(std::string name, long long val);
  static InstPtr UNIT_CALL(std::string name, std::string arg = "");
};