statement.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. #ifndef VIRTUALMATH_STATEMENT_H
  2. #define VIRTUALMATH_STATEMENT_H
  3. #include "__macro.h"
  4. #define makeConnectStatementList(base, condition, var, code, type) connectStatementList(base, makeStatementList(condition, var, code, type))
  5. struct Statement{
  6. enum ValueAuthority aut;
  7. enum StatementType{
  8. start = 1,
  9. base_value,
  10. base_list,
  11. base_dict,
  12. base_var,
  13. base_svar,
  14. base_lambda,
  15. operation,
  16. set_function,
  17. set_class,
  18. call_function,
  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. raise_code,
  30. include_file,
  31. import_file,
  32. from_import_file,
  33. default_var,
  34. assert,
  35. label_,
  36. goto_,
  37. } type;
  38. union StatementU{
  39. struct base_value{
  40. enum BaseValueType{
  41. link_value = 0,
  42. string_str = 1,
  43. number_str = 2,
  44. bool_true = 3,
  45. bool_false = 4,
  46. pass_value = 5,
  47. null_value = 6,
  48. } type;
  49. struct LinkValue *value;
  50. char *str;
  51. } base_value;
  52. struct base_var{
  53. char *name;
  54. struct Statement *times;
  55. } base_var;
  56. struct base_svar{
  57. struct Statement *name;
  58. struct Statement *times;
  59. } base_svar;
  60. struct {
  61. enum ListType type;
  62. struct Parameter *list;
  63. } base_list;
  64. struct {
  65. struct Parameter *dict;
  66. } base_dict;
  67. struct {
  68. struct Parameter *parameter;
  69. struct Statement *function;
  70. } base_lambda;
  71. struct operation{
  72. enum OperationType{
  73. OPT_ADD = 1,
  74. OPT_SUB = 2,
  75. OPT_MUL = 3,
  76. OPT_DIV = 4,
  77. OPT_ASS = 5,
  78. OPT_POINT = 6,
  79. OPT_BLOCK = 7,
  80. } OperationType;
  81. struct Statement *left;
  82. struct Statement *right;
  83. } operation;
  84. struct {
  85. struct Statement *name;
  86. struct Statement *function;
  87. struct Parameter *parameter;
  88. struct DecorationStatement *decoration;
  89. } set_function;
  90. struct {
  91. struct Statement *name;
  92. struct Statement *st;
  93. struct Parameter *father;
  94. struct DecorationStatement *decoration;
  95. } set_class;
  96. struct {
  97. struct Statement *function;
  98. struct Parameter *parameter;
  99. } call_function;
  100. struct {
  101. struct StatementList *if_list; // if elif
  102. struct Statement *else_list; // else分支(无condition)
  103. struct Statement *finally;
  104. } if_branch;
  105. struct {
  106. enum {
  107. while_,
  108. do_while_,
  109. } type;
  110. struct Statement *first; // first do
  111. struct StatementList *while_list; // while循环体
  112. struct Statement *after; // after do
  113. struct Statement *else_list; // else分支(无condition)
  114. struct Statement *finally;
  115. } while_branch;
  116. struct {
  117. struct Statement *var; // first do
  118. struct Statement *iter; // after do
  119. struct StatementList *for_list; // for循环体
  120. struct Statement *else_list; // else分支(无condition)
  121. struct Statement *finally;
  122. } for_branch;
  123. struct {
  124. struct Statement *try; // first do
  125. struct StatementList *except_list; // for循环体
  126. struct Statement *else_list; // else分支(无condition)
  127. struct Statement *finally;
  128. } try_branch;
  129. struct {
  130. struct StatementList *with_list; // for循环体
  131. struct Statement *else_list; // else分支(无condition)
  132. struct Statement *finally;
  133. } with_branch;
  134. struct {
  135. struct Statement *times;
  136. } break_cycle;
  137. struct {
  138. struct Statement *times;
  139. } continue_cycle;
  140. struct {
  141. struct Statement *times;
  142. } rego_if;
  143. struct {
  144. struct Statement *times;
  145. } restart;
  146. struct {
  147. struct Statement *value;
  148. } return_code;
  149. struct {
  150. struct Statement *value;
  151. } raise_code;
  152. struct {
  153. struct Statement *file;
  154. } include_file;
  155. struct {
  156. struct Statement *file;
  157. struct Statement *as;
  158. } import_file;
  159. struct {
  160. struct Statement *file;
  161. struct Parameter *pt;
  162. struct Parameter *as;
  163. } from_import_file;
  164. struct {
  165. struct Parameter *var;
  166. enum DefaultType{
  167. default_,
  168. global_,
  169. nonlocal_,
  170. } default_type;
  171. } default_var;
  172. struct {
  173. struct Statement *conditions;
  174. } assert;
  175. struct {
  176. struct Statement *command;
  177. struct Statement *as;
  178. char *label;
  179. } label_;
  180. struct {
  181. struct Statement *times;
  182. struct Statement *return_;
  183. struct Statement *label;
  184. } goto_;
  185. }u;
  186. long int line;
  187. char *code_file;
  188. struct Statement *next;
  189. };
  190. struct StatementList{
  191. enum {
  192. if_b,
  193. do_b,
  194. while_b,
  195. except_b,
  196. } type;
  197. struct Statement *condition;
  198. struct Statement *var;
  199. struct Statement *code;
  200. struct StatementList *next;
  201. };
  202. struct DecorationStatement {
  203. struct Statement *decoration;
  204. struct DecorationStatement *next;
  205. };
  206. typedef struct Token Token;
  207. typedef struct Statement Statement;
  208. typedef struct StatementList StatementList;
  209. typedef struct DecorationStatement DecorationStatement;
  210. Statement *makeStatement(long int line, char *file);
  211. void freeStatement(Statement *st);
  212. Statement *copyStatement(Statement *st);
  213. Statement *copyStatementCore(Statement *st);
  214. void connectStatement(Statement *base, Statement *new);
  215. Statement *makeOperationBaseStatement(enum OperationType type, long int line, char *file);
  216. Statement *makeOperationStatement(enum OperationType type, Statement *left, Statement *right);
  217. Statement *makeBaseLinkValueStatement(LinkValue *value, long int line, char *file);
  218. Statement *makeBaseStrValueStatement(char *value, enum BaseValueType type, long int line, char *file);
  219. Statement *makeBaseValueStatement(enum BaseValueType type, long int line, char *file);
  220. Statement *makeBaseVarStatement(char *name, Statement *times, long int line, char *file);
  221. Statement *makeBaseSVarStatement(Statement *name, Statement *times);
  222. Statement *makeBaseDictStatement(Parameter *pt, long int line, char *file);
  223. Statement *makeTupleStatement(Parameter *pt, enum ListType type, long int line, char *file);
  224. Statement *makeClassStatement(Statement *name, Statement *function, Parameter *pt);
  225. Statement *makeFunctionStatement(Statement *name, Statement *function, struct Parameter *pt);
  226. Statement *makeLambdaStatement(Statement *function, Parameter *pt);
  227. Statement *makeCallStatement(Statement *function, struct Parameter *pt);
  228. Statement *makeIfStatement(long int line, char *file);
  229. Statement *makeWhileStatement(long int line, char *file);
  230. Statement *makeTryStatement(long int line, char *file);
  231. Statement *makeBreakStatement(Statement *times, long int line, char *file);
  232. Statement *makeWithStatement(long int line, char *file);
  233. Statement *makeContinueStatement(Statement *times, long int line, char *file);
  234. Statement *makeRegoStatement(Statement *times, long int line, char *file);
  235. Statement *makeRestartStatement(Statement *times, long int line, char *file);
  236. Statement *makeReturnStatement(Statement *value, long int line, char *file);
  237. Statement *makeRaiseStatement(Statement *value, long int line, char *file);
  238. Statement *makeAssertStatement(Statement *conditions, long int line, char *file);
  239. Statement *makeIncludeStatement(Statement *file, long int line, char *file_dir);
  240. Statement *makeImportStatement(Statement *file, Statement *as);
  241. Statement *makeFromImportStatement(Statement *file, Parameter *as, Parameter *pt);
  242. Statement *makeDefaultVarStatement(Parameter *var, long int line, char *file_dir, enum DefaultType type);
  243. Statement *makeLabelStatement(Statement *var, Statement *command, char *label, long int line, char *file_dir);
  244. Statement *makeGotoStatement(Statement *return_, Statement *times, Statement *label, long int line, char *file_dir);
  245. struct Token *setOperationFromToken(Statement **st_ad, struct Token *left, struct Token *right, enum OperationType type, bool is_right);
  246. StatementList *makeStatementList(Statement *condition, Statement *var, Statement *code, int type);
  247. StatementList *connectStatementList(StatementList *base, StatementList *new);
  248. void freeStatementList(StatementList *base);
  249. StatementList *copyStatementList(StatementList *sl);
  250. DecorationStatement *makeDecorationStatement();
  251. DecorationStatement *connectDecorationStatement(Statement *decoration, DecorationStatement *base);
  252. void freeDecorationStatement(DecorationStatement *base);
  253. DecorationStatement *copyDecorationStatement(DecorationStatement *ds);
  254. DecorationStatement *copyDecorationStatementCore(DecorationStatement *base);
  255. #endif //VIRTUALMATH_STATEMENT_H