statement.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. #ifndef VIRTUALMATH_STATEMENT_H
  2. #define VIRTUALMATH_STATEMENT_H
  3. #include "__macro.h"
  4. struct Statement{
  5. enum ValueAuthority aut;
  6. enum StatementType{
  7. start = 1,
  8. base_value,
  9. base_list,
  10. base_dict,
  11. base_var,
  12. del_,
  13. base_svar,
  14. base_lambda,
  15. operation,
  16. set_function,
  17. set_class,
  18. call_function,
  19. slice_,
  20. if_branch,
  21. while_branch,
  22. for_branch,
  23. try_branch,
  24. with_branch,
  25. break_cycle,
  26. continue_cycle,
  27. rego_if,
  28. restart,
  29. return_code,
  30. yield_code,
  31. raise_code,
  32. include_file,
  33. import_file,
  34. from_import_file,
  35. default_var,
  36. assert_,
  37. label_,
  38. goto_,
  39. } type;
  40. union StatementU{
  41. struct base_value{
  42. enum BaseValueType{
  43. link_value = 0,
  44. string_str = 1,
  45. number_str = 2,
  46. bool_true = 3,
  47. bool_false = 4,
  48. pass_value = 5,
  49. null_value = 6,
  50. } type;
  51. struct LinkValue *value;
  52. wchar_t *str;
  53. } base_value;
  54. struct base_var{
  55. wchar_t *name;
  56. struct Statement *times;
  57. struct Var *link; // link 模式
  58. bool run;
  59. } base_var;
  60. struct{
  61. struct Statement *var;
  62. } del_;
  63. struct base_svar{
  64. struct Statement *name;
  65. struct Statement *times;
  66. bool run;
  67. bool is_var;
  68. } base_svar;
  69. struct {
  70. enum ListType type;
  71. struct Parameter *list;
  72. } base_list;
  73. struct {
  74. struct Parameter *dict;
  75. } base_dict;
  76. struct {
  77. struct Parameter *parameter;
  78. struct Statement *function;
  79. } base_lambda;
  80. struct operation{
  81. enum OperationType{
  82. OPT_ADD = 1,
  83. OPT_SUB = 2,
  84. OPT_MUL = 3,
  85. OPT_DIV = 4,
  86. OPT_ASS = 5,
  87. OPT_POINT = 6, // 成员运算
  88. OPT_BLOCK = 7, // 代码块
  89. OPT_OUTPOINT = 8, // 获取外部成员
  90. OPT_INTDIV = 9,
  91. OPT_MOD = 10,
  92. OPT_POW = 11,
  93. OPT_BAND = 12,
  94. OPT_BOR = 13,
  95. OPT_BXOR = 14,
  96. OPT_BNOT = 15,
  97. OPT_BL = 16,
  98. OPT_BR = 17,
  99. OPT_EQ = 18,
  100. OPT_MOREEQ = 19,
  101. OPT_LESSEQ = 20,
  102. OPT_MORE = 21,
  103. OPT_LESS = 22,
  104. OPT_NOTEQ = 23,
  105. OPT_AND = 24,
  106. OPT_OR = 25,
  107. OPT_NOT = 26,
  108. OPT_NEGATE = 27,
  109. } OperationType;
  110. struct Statement *left;
  111. struct Statement *right;
  112. } operation;
  113. struct {
  114. struct Statement *name;
  115. struct Statement *function;
  116. struct Statement *first_do;
  117. struct Parameter *parameter;
  118. struct DecorationStatement *decoration;
  119. } set_function;
  120. struct {
  121. struct Statement *name;
  122. struct Statement *st;
  123. struct Parameter *father;
  124. struct DecorationStatement *decoration;
  125. } set_class;
  126. struct {
  127. struct Statement *function;
  128. struct Parameter *parameter;
  129. } call_function;
  130. struct {
  131. struct Statement *element;
  132. struct Parameter *index;
  133. enum SliceType{
  134. SliceType_down_,
  135. SliceType_slice_,
  136. } type;
  137. } slice_;
  138. struct {
  139. struct StatementList *if_list; // if elif
  140. struct Statement *else_list; // else分支(无condition)
  141. struct Statement *finally;
  142. } if_branch;
  143. struct {
  144. enum {
  145. while_,
  146. do_while_,
  147. } type;
  148. struct Statement *first; // first do
  149. struct StatementList *while_list; // while循环体
  150. struct Statement *after; // after do
  151. struct Statement *else_list; // else分支(无condition)
  152. struct Statement *finally;
  153. } while_branch;
  154. struct {
  155. struct StatementList *for_list; // for循环体
  156. struct Statement *first_do;
  157. struct Statement *after_do;
  158. struct Statement *else_list; // else分支(无condition)
  159. struct Statement *finally;
  160. } for_branch;
  161. struct {
  162. struct Statement *try; // first do
  163. struct StatementList *except_list; // for循环体
  164. struct Statement *else_list; // else分支(无condition)
  165. struct Statement *finally;
  166. } try_branch;
  167. struct {
  168. struct StatementList *with_list; // for循环体
  169. struct Statement *else_list; // else分支(无condition)
  170. struct Statement *finally;
  171. } with_branch;
  172. struct {
  173. struct Statement *times;
  174. } break_cycle;
  175. struct {
  176. struct Statement *times;
  177. } continue_cycle;
  178. struct {
  179. struct Statement *times;
  180. } rego_if;
  181. struct {
  182. struct Statement *times;
  183. } restart;
  184. struct {
  185. struct Statement *value;
  186. } return_code;
  187. struct {
  188. struct Statement *value;
  189. } yield_code;
  190. struct {
  191. struct Statement *value;
  192. } raise_code;
  193. struct {
  194. struct Statement *file;
  195. } include_file;
  196. struct {
  197. struct Statement *file;
  198. struct Statement *as;
  199. bool is_lock;
  200. } import_file;
  201. struct {
  202. struct Statement *file;
  203. struct Parameter *pt;
  204. struct Parameter *as;
  205. bool is_lock;
  206. } from_import_file;
  207. struct {
  208. struct Parameter *var;
  209. enum DefaultType{
  210. default_,
  211. global_,
  212. nonlocal_,
  213. } default_type;
  214. } default_var;
  215. struct {
  216. struct Statement *conditions;
  217. } assert;
  218. struct {
  219. struct Statement *command;
  220. struct Statement *as;
  221. wchar_t *label;
  222. } label_;
  223. struct {
  224. struct Statement *times;
  225. struct Statement *return_;
  226. struct Statement *label;
  227. } goto_;
  228. }u;
  229. struct { // 运行info信息
  230. bool have_info;
  231. struct VarList *var_list;
  232. struct Statement *node;
  233. struct {
  234. struct StatementList *sl_node;
  235. enum StatementInfoStatus{
  236. info_vl_branch,
  237. info_else_branch,
  238. info_finally_branch,
  239. info_first_do,
  240. info_after_do,
  241. } status;
  242. struct{
  243. LinkValue *value;
  244. LinkValue *_exit_;
  245. LinkValue *_enter_;
  246. LinkValue *with_belong;
  247. } with_;
  248. struct{
  249. LinkValue *iter;
  250. } for_;
  251. struct {
  252. bool push;
  253. } func;
  254. } branch;
  255. } info;
  256. fline line;
  257. char *code_file;
  258. struct Statement *next;
  259. };
  260. struct StatementList{
  261. enum {
  262. if_b,
  263. do_b,
  264. while_b,
  265. except_b,
  266. for_b,
  267. with_b,
  268. } type;
  269. struct Statement *condition;
  270. struct Statement *var;
  271. struct Statement *code;
  272. struct StatementList *next;
  273. };
  274. struct DecorationStatement {
  275. struct Statement *decoration;
  276. struct DecorationStatement *next;
  277. };
  278. typedef struct Token Token;
  279. typedef struct Statement Statement;
  280. typedef struct StatementList StatementList;
  281. typedef struct DecorationStatement DecorationStatement;
  282. Statement *makeStatement(fline line, char *file);
  283. void setRunInfo(Statement *st);
  284. void freeRunInfo(Statement *st);
  285. void freeStatement(Statement *st);
  286. Statement *copyStatement(Statement *st);
  287. Statement *copyStatementCore(Statement *st);
  288. void connectStatement(Statement *base, Statement *new);
  289. Statement *makeOperationBaseStatement(enum OperationType type, fline line, char *file);
  290. Statement *makeOperationStatement(enum OperationType type, Statement *left, Statement *right);
  291. Statement *makeBaseLinkValueStatement(LinkValue *value, fline line, char *file);
  292. Statement *makeBaseStrValueStatement(wchar_t *value, enum BaseValueType type, fline line, char *file);
  293. Statement *makeBaseValueStatement(enum BaseValueType type, fline line, char *file);
  294. Statement *makeBaseVarStatement(wchar_t *name, Statement *times, fline line, char *file);
  295. Statement *makeBaseSVarStatement(Statement *name, Statement *times, bool is_var);
  296. Statement *makeBaseDictStatement(Parameter *pt, fline line, char *file);
  297. Statement *makeTupleStatement(Parameter *pt, enum ListType type, fline line, char *file);
  298. Statement *makeClassStatement(Statement *name, Statement *function, Parameter *pt);
  299. Statement *makeFunctionStatement(Statement *name, Statement *function, struct Parameter *pt);
  300. Statement *makeLambdaStatement(Statement *function, Parameter *pt);
  301. Statement *makeCallStatement(Statement *function, struct Parameter *pt);
  302. Statement *makeSliceStatement(Statement *element, Parameter *index, enum SliceType type);
  303. Statement *makeForStatement(fline line, char *file);
  304. Statement *makeIfStatement(fline line, char *file);
  305. Statement *makeWhileStatement(fline line, char *file);
  306. Statement *makeTryStatement(fline line, char *file);
  307. Statement *makeBreakStatement(Statement *times, fline line, char *file);
  308. Statement *makeWithStatement(fline line, char *file);
  309. Statement *makeContinueStatement(Statement *times, fline line, char *file);
  310. Statement *makeRegoStatement(Statement *times, fline line, char *file);
  311. Statement *makeRestartStatement(Statement *times, fline line, char *file);
  312. Statement *makeReturnStatement(Statement *value, fline line, char *file);
  313. Statement *makeYieldStatement(Statement *value, fline line, char *file);
  314. Statement *makeRaiseStatement(Statement *value, fline line, char *file);
  315. Statement *makeAssertStatement(Statement *conditions, fline line, char *file);
  316. Statement *makeIncludeStatement(Statement *file, fline line, char *file_dir);
  317. Statement *makeImportStatement(Statement *file, Statement *as, bool is_lock);
  318. Statement *makeFromImportStatement(Statement *file, Parameter *as, Parameter *pt, bool is_lock);
  319. Statement *makeDefaultVarStatement(Parameter *var, fline line, char *file_dir, enum DefaultType type);
  320. Statement *makeLabelStatement(Statement *var, Statement *command, wchar_t *label, fline line, char *file_dir);
  321. Statement *makeGotoStatement(Statement *return_, Statement *times, Statement *label, fline line, char *file_dir);
  322. Statement *makeDelStatement(Statement *var, fline line, char *file_dir);
  323. Token *setOperationFromToken(Statement **st_ad, Token *left, Token *right, enum OperationType type, bool is_right);
  324. StatementList *makeStatementList(Statement *condition, Statement *var, Statement *code, int type);
  325. StatementList *connectStatementList(StatementList *base, StatementList *new);
  326. void freeStatementList(StatementList *base);
  327. StatementList *copyStatementList(StatementList *sl);
  328. DecorationStatement *makeDecorationStatement();
  329. DecorationStatement *connectDecorationStatement(Statement *decoration, DecorationStatement *base);
  330. void freeDecorationStatement(DecorationStatement *base);
  331. DecorationStatement *copyDecorationStatement(DecorationStatement *ds);
  332. DecorationStatement *copyDecorationStatementCore(DecorationStatement *base);
  333. #endif //VIRTUALMATH_STATEMENT_H