statement.h 10 KB

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