statement.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #ifndef VIRTUALMATH_STATEMENT_H
  2. #define VIRTUALMATH_STATEMENT_H
  3. #include "__macro.h"
  4. typedef struct Statement{
  5. enum StatementType{
  6. start = 1,
  7. base_value,
  8. base_var,
  9. operation,
  10. set_function,
  11. call_function,
  12. if_branch,
  13. while_branch,
  14. for_branch,
  15. try_branch,
  16. with_branch,
  17. } type;
  18. union StatementU{
  19. struct base_value{
  20. struct VirtualMathValue *value;
  21. } base_value;
  22. struct base_var{
  23. char *name;
  24. struct Statement *times;
  25. } base_var;
  26. struct operation{
  27. enum OperationType{
  28. ADD = 1,
  29. SUB,
  30. MUL,
  31. DIV,
  32. ASS,
  33. } OperationType;
  34. struct Statement *left;
  35. struct Statement *right;
  36. } operation;
  37. struct {
  38. struct Statement *name;
  39. struct Statement *function;
  40. } set_function;
  41. struct {
  42. struct Statement *function;
  43. } call_function;
  44. struct {
  45. struct StatementList *if_list; // if elif
  46. struct Statement *else_list; // else分支(无condition)
  47. struct Statement *finally;
  48. } if_branch;
  49. struct {
  50. enum {
  51. while_,
  52. do_while_,
  53. } type;
  54. struct Statement *first; // first do
  55. struct StatementList *while_list; // while循环体
  56. struct Statement *after; // after do
  57. struct Statement *else_list; // else分支(无condition)
  58. struct Statement *finally;
  59. } while_branch;
  60. struct {
  61. struct Statement *var; // first do
  62. struct Statement *iter; // after do
  63. struct StatementList *for_list; // for循环体
  64. struct Statement *else_list; // else分支(无condition)
  65. struct Statement *finally;
  66. } for_branch;
  67. struct {
  68. struct Statement *try; // first do
  69. struct StatementList *except_list; // for循环体
  70. struct Statement *else_list; // else分支(无condition)
  71. struct Statement *finally;
  72. } try_branch;
  73. }u;
  74. struct Statement *next;
  75. } Statement;
  76. typedef struct StatementList{
  77. struct Statement *condition;
  78. struct Statement *var; // TODO-szh if等分支计算结果允许赋值
  79. struct Statement *code;
  80. struct StatementList *next;
  81. } StatementList;
  82. Statement *makeStatement();
  83. Statement *makeOperationStatement(int type);
  84. struct Token *setOperationFromToken(Statement *st, struct Token *left, struct Token *right, int type);
  85. Statement *makeFunctionStatement(Statement *name, Statement *function);
  86. Statement *makeCallStatement(Statement *function);
  87. void connectStatement(Statement *base, Statement *new);
  88. void freeStatement(Statement *st);
  89. StatementList *connectStatementList(StatementList *base, StatementList *new);
  90. StatementList *makeStatementList(Statement *condition, Statement *var, Statement *code);
  91. void freeStatementList(StatementList *base);
  92. #define makeConnectStatementList(base, condition, var, code) connectStatementList(base, makeStatementList(condition, var, code))
  93. #endif //VIRTUALMATH_STATEMENT_H