statement.h 7.7 KB

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