value.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #ifndef VIRTUALMATH_VALUE_H
  2. #define VIRTUALMATH_VALUE_H
  3. #include "__macro.h"
  4. struct VarList;
  5. struct Argument;
  6. struct Value{
  7. GCStatus gc_status;
  8. enum ValueType{
  9. none=0,
  10. number=1,
  11. string=2,
  12. function=3,
  13. list=4,
  14. dict=5,
  15. } type;
  16. union data{
  17. struct Number{
  18. NUMBER_TYPE num;
  19. } num;
  20. struct String{
  21. char *str;
  22. } str;
  23. struct Function{
  24. struct Statement *function;
  25. struct VarList *var;
  26. struct Parameter *pt;
  27. } function;
  28. struct List{
  29. enum ListType{
  30. value_tuple,
  31. value_list,
  32. } type;
  33. struct LinkValue **list;
  34. long int size;
  35. } list;
  36. struct Dict{
  37. struct HashTable *dict;
  38. NUMBER_TYPE size;
  39. } dict;
  40. }data;
  41. struct Value *next;
  42. struct Value *last;
  43. };
  44. struct LinkValue{
  45. GCStatus gc_status;
  46. struct Value *value;
  47. struct LinkValue *father;
  48. struct LinkValue *next;
  49. struct LinkValue *last;
  50. };
  51. struct Result{
  52. enum ResultType{
  53. not_return = 1, // 无返回值
  54. function_return, // 函数返回值
  55. operation_return, // 表达式返回值
  56. error_return, // 错误
  57. break_return,
  58. continue_return,
  59. rego_return,
  60. restart_return,
  61. } type;
  62. struct LinkValue *value;
  63. struct Error *error;
  64. int times;
  65. };
  66. struct Error{
  67. char *type;
  68. char *messgae;
  69. char *file;
  70. long int line;
  71. struct Error *next;
  72. };
  73. typedef struct Value Value;
  74. typedef struct LinkValue LinkValue;
  75. typedef struct Result Result;
  76. typedef struct Error Error;
  77. Value *makeValue(Inter *inter);
  78. Value * freeValue(Value *value, Inter *inter);
  79. LinkValue *makeLinkValue(Value *value, LinkValue *linkValue,Inter *inter);
  80. LinkValue * freeLinkValue(LinkValue *value, Inter *inter);
  81. Value *makeNumberValue(long num, Inter *inter);
  82. Value *makeStringValue(char *str, Inter *inter);
  83. Value *makeFunctionValue(struct Statement *st, struct Parameter *pt, struct VarList *var_list, Inter *inter);
  84. Value *makeListValue(struct Argument **arg_ad, Inter *inter, enum ListType type);
  85. Value *makeDictValue(struct Argument **arg_ad, bool new_hash, Result *result, Inter *inter, struct VarList *var_list);
  86. void setResultCore(Result *ru);
  87. void setResult(Result *ru, Inter *inter);
  88. void setResultBase(Result *ru, Inter *inter);
  89. void setResultError(Result *ru, Inter *inter, char *error_type, char *error_message, struct Statement *st, bool new);
  90. void setResultOperationNone(Result *ru, Inter *inter);
  91. void setResultOperation(Result *ru, LinkValue *value, Inter *inter);
  92. void setResultOperationBase(Result *ru, LinkValue *value, Inter *inter);
  93. void freeResult(Result *ru);
  94. Error *makeError(char *type, char *message, long int line, char *file);
  95. void freeError(Result *base);
  96. Error *connectError(Error *new, Error *base);
  97. void printError(Result *result, Inter *inter, bool free);
  98. void printValue(Value *value, FILE *debug);
  99. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug);
  100. bool isType(Value *value, enum ValueType type);
  101. #endif //VIRTUALMATH_VALUE_H