cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 2077|回复: 3

[聊天] Malical 2.0的头文件

[复制链接]
发表于 2011-5-28 19:22:52 | 显示全部楼层 |阅读模式
Malical.h当前进度

  1. #define TOKEN_BUFFER_SIZE 256
  2. #define SYMBOL_BUFFER_SZIE 32
  3. #define STACK_SIZE 64
  4. int MalicalError (char *);
  5. int MalicalTokenError ();
  6. typedef enum
  7. {
  8.     B_NO,
  9.     B_IF,
  10.     B_OT
  11. } BLOCK;
  12. typedef enum
  13. {
  14.     TT_NUM=1,
  15.     TT_NIL,
  16.     TT_BOOL,
  17.     TT_STR,
  18.     TT_SYM,
  19.     TT_SIGN
  20.    
  21. } TOKEN_TYPE;
  22. extern char token[];
  23. extern char line[];
  24. typedef enum
  25. {
  26.     SIGN_ADD = 256,
  27.     SIGN_SUB,
  28.     SIGN_MUL,
  29.     SIGN_DIV,
  30.     SIGN_POW,
  31.     SIGN_BLK,
  32.     SIGN_BRK,
  33.     SIGN_AND,
  34.     SIGN_OR ,
  35.     SIGN_NOT,
  36.     SIGN_EQ ,
  37.     SIGN_NEQ,
  38.     SIGN_BT ,
  39.     SIGN_BE ,
  40.     SIGN_LT ,
  41.     SIGN_LE
  42. } SIGN;
  43. int GetToken (char *context,int pos,TOKEN_TYPE *type);
  44. int SignToValue (char *sign);
  45. typedef union
  46. {
  47.     int        b;
  48.     char    *str;
  49.     double    n;
  50. }Value;
  51. typedef enum
  52. {
  53.     VT_NIL,
  54.     VT_BOOL,
  55.     VT_STR,
  56.     VT_NUM
  57. }Type;
  58. typedef struct
  59. {
  60.     Type    tag;
  61.     Value    value;
  62. }Object;
  63. void           obj_ini (Object *d);
  64. void           obj_clear (Object *d);
  65. Object*        obj_copy (Object *d,const Object *s);
  66. Object*        obj_create (Object *d,Type tag,void *value);
  67. char*          obj_to_str(Object *s, char *str);
  68. int EvalExpr (char *expr,Object *objr);
复制代码


object的实现借鉴了lua源码的思路
这次为了实现bool、string、double变量,采用了大量函数拷贝……
C语言没有class,又不让用C++,每次initi.alize、delete都要手动调用……
在9860上运行可能会变慢
 楼主| 发表于 2011-5-28 19:34:50 | 显示全部楼层
我不得不这么写
  1. Object l,r,result;
  2. SIGN p_s;
  3. obj_ini(&l);
  4. obj_ini(&r);
  5. obj_ini(&result);
  6. p_s = sstk[--stop];
  7. objs_pop(&obj_stk,&r);
  8. objs_pop(&obj_stk,&l);
  9. EvalLR(&l,&r,p_s,&result);
  10. //puts(obj_to_str(&result,buf));
  11. objs_push(&obj_stk,&result);
  12. obj_clear(&l);
  13. obj_clear(&r);
  14. obj_clear(&result);
复制代码


要不然到时候l、r是字符串的话没有free掉heap memory一切就杯具了
发表于 2011-5-29 16:40:29 | 显示全部楼层
支持一个。。。看上去定义很全
 楼主| 发表于 2011-6-6 15:54:03 | 显示全部楼层
没法看了……
  1. #define TOKEN_BUFFER_SIZE 256
  2. #define SYMBOL_BUFFER_SZIE 32
  3. #define STRING_BUFFER_SIZE 128
  4. #define STACK_SIZE 64
  5. #define NAME_LENGTH 12

  6. extern const char *TYPE_TEXT[];

  7. int MalicalError (const char *);
  8. int MalicalTokenError ();

  9. typedef enum
  10. {
  11. B_NO,
  12. B_IF,
  13. B_OT
  14. } BLOCK;

  15. typedef enum
  16. {
  17. TT_NUM=1,
  18. TT_NIL,
  19. TT_BOOL,
  20. TT_STR,
  21. TT_SYM,
  22. TT_SIGN,
  23. TT_BK,
  24. TT_REF
  25. } TOKEN_TYPE;

  26. extern char token[];
  27. extern char line[];

  28. typedef enum
  29. {
  30. SIGN_ADD = 256,
  31. SIGN_SUB,
  32. SIGN_MUL,
  33. SIGN_DIV,
  34. SIGN_POW,
  35. SIGN_BLK,
  36. SIGN_BRK,
  37. SIGN_AND,
  38. SIGN_OR ,
  39. SIGN_NOT,
  40. SIGN_EQ ,
  41. SIGN_NEQ,
  42. SIGN_BT ,
  43. SIGN_BE ,
  44. SIGN_LT ,
  45. SIGN_LE ,
  46. SIGN_STO
  47. } SIGN;

  48. typedef struct
  49. {
  50. char *name;
  51. SIGN value;
  52. }SIGNVALUE;

  53. int GetToken (char *context,int pos,TOKEN_TYPE *type);
  54. int Match (char *text,char *find,TOKEN_TYPE type,int pl);
  55. int GetTokenE (char *text,char l,char r,int pl);
  56. int GetLine(char *text,int p);
  57. int LineEmpty (int p);
  58. int SignToValue (char *sign);

  59. typedef union
  60. {
  61. int b;
  62. char *str;
  63. double n;
  64. void *ref;
  65. }Value;

  66. typedef enum
  67. {
  68. VT_NIL,
  69. VT_BOOL,
  70. VT_STR,
  71. VT_NUM,
  72. VT_REF
  73. }Type;

  74. typedef struct
  75. {
  76. Type tag;
  77. Value value;
  78. }Object;

  79. typedef struct
  80. {
  81. Object *stk[STACK_SIZE];
  82. int size;
  83. }ObjectStack;

  84. void obj_ini (Object *d);
  85. void obj_clear (Object *d);
  86. Object* obj_copy (Object *d,const Object *s);
  87. Object* obj_create (Object *d,Type tag,void *value);
  88. char* obj_to_str(Object *s, char *str);

  89. void objs_push (ObjectStack *s,Object *n_o);
  90. void objs_pop (ObjectStack *s,Object *n_o);
  91. void objs_clear (ObjectStack *s);

  92. #define o_is_num(o) ((o)->tag==VT_NUM)
  93. #define o_is_bool(o) ((o)->tag==VT_BOOL)
  94. #define o_is_str(o) ((o)->tag==VT_STR)


  95. int EvalExpr (char *expr,Object *objr);

  96. typedef struct
  97. {
  98. char name[NAME_LENGTH];
  99. Object obj;
  100. }Variable;

  101. typedef struct
  102. {
  103. Variable *vars[STACK_SIZE];
  104. int size;
  105. }VarStack;

  106. void var_copy (Variable *d,Variable *s);
  107. void var_create (Variable *v,const char *name,Object *obj);
  108. void var_stk_push (VarStack * vs,Variable *v);
  109. void var_stk_clear (VarStack * vs);


  110. extern VarStack GlobalVar;

  111. extern VarStack *LocalVar[];
  112. extern int LocalTop;

  113. void new_local_var_stack ();
  114. void delete_local_var_stack ();

  115. Variable* find_var (char *name);

  116. typedef struct
  117. {
  118. char name[NAME_LENGTH];
  119. int pos;
  120. }FUNCTION;

  121. void func_push (const char *name,int pos);
  122. int find_func (const char *name);

  123. // parser
  124. void CallFun (const char *name,ObjectStack*);
  125. int RunIfBlock (int p,int todo,int _todo);
  126. int RunWhileBlock (int b,char *expr,int _todo);
  127. int RunFunction (int p,int todo,int is_block);
  128. int MalicalPrescan ();
  129. int RunFile (char* file_name);

  130. extern Object ReturnObject;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cnCalc计算器论坛

GMT+8, 2024-4-20 19:37 , Processed in 0.146046 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表