interpreter.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // #include "interprete.h"
  4. #include "../paser/y.tab.c"
  5. // running code
  6. GWARF_result while_func(statement *, var_list *);
  7. GWARF_result operation_func(statement *, var_list *);
  8. GWARF_result add_func(GWARF_result, GWARF_result, var_list *);
  9. GWARF_result sub_func(GWARF_result, GWARF_result, var_list *);
  10. GWARF_result mul_func(GWARF_result, GWARF_result, var_list *);
  11. GWARF_result div_func(GWARF_result, GWARF_result, var_list *);
  12. GWARF_result assigment_func(char *, GWARF_result, var_list *);
  13. GWARF_result equal_func(GWARF_result, GWARF_result, var_list *, int);
  14. GWARF_result if_func(if_list *, var_list *);
  15. // ---- var func
  16. var *make_var(){ // make var with base
  17. var *tmp;
  18. tmp = malloc(sizeof(var)); // get an address for base var
  19. tmp->name = ""; // can't get the name for the real var
  20. tmp->next = NULL;
  21. return tmp;
  22. }
  23. void append_var(char *name, GWARF_value value, var *base_var){
  24. int break_ = 1; // get var[2] or not[1]
  25. var *tmp = base_var; // iter var
  26. while(1){
  27. if (!strcmp(tmp->name, name)){
  28. break_ = 2;
  29. break;
  30. }
  31. if (tmp->next == NULL){ // not var name *name
  32. break_ = 1;
  33. break;
  34. }
  35. tmp = tmp->next; // get the next to iter
  36. }
  37. if(break_ == 2){
  38. tmp->value = value;
  39. return;
  40. }
  41. var *new_tmp = make_var();
  42. tmp->next = new_tmp;
  43. new_tmp->name = malloc(sizeof(name));
  44. strcpy(new_tmp->name, name);
  45. new_tmp->value = value;
  46. }
  47. void free_var(var *base_var){ // free the address
  48. var *tmp = base_var; // iter var
  49. while(1){
  50. if (tmp->next == NULL){ // the last
  51. free(tmp);
  52. break;
  53. }
  54. var *tmp_2 = tmp;
  55. tmp = tmp->next;
  56. free(tmp_2);
  57. }
  58. }
  59. var *get_var(char *name, var *base_var){ // get the address
  60. var *tmp = base_var; // iter var
  61. while(1){
  62. if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  63. return tmp;
  64. }
  65. if (tmp->next == NULL){ // not var name *name
  66. return NULL;
  67. }
  68. tmp = tmp->next; // get the next to iter
  69. }
  70. }
  71. void del_var(char *name, var *base_var){ // free an address
  72. var *tmp = base_var, *last_tmp=NULL; // iter var
  73. while(1){
  74. if (tmp->name == name){
  75. if(last_tmp != NULL){
  76. last_tmp->next = tmp->next; // if tmp->next is NULL last_tmp->next is NULL too
  77. }
  78. free(tmp);
  79. return;
  80. }
  81. if (tmp->next == NULL){ // not var name *name
  82. return;
  83. }
  84. tmp = tmp->next; // get the next to iter
  85. last_tmp = tmp;
  86. }
  87. }
  88. // ---- statement list
  89. statement *make_statement(){ // make statement
  90. statement *tmp;
  91. tmp = malloc(sizeof(statement)); // get an address for base var
  92. tmp->next = NULL;
  93. tmp->type = start;
  94. return tmp;
  95. }
  96. statement *append_statement(statement *base_statement, statement *new_tmp){ // make statement next
  97. statement *tmp = base_statement; // iter var
  98. while(1){
  99. if (tmp->next == NULL){ // not var name *name
  100. break;
  101. }
  102. tmp = tmp->next; // get the next to iter
  103. }
  104. tmp->next = new_tmp;
  105. return new_tmp;
  106. }
  107. // ---- var_list
  108. var_list *make_var_list(){ // make a empty var_list node
  109. var_list *tmp;
  110. tmp = malloc(sizeof(var_list)); // get an address for base var
  111. tmp->next = NULL;
  112. tmp->var_base = NULL;
  113. return tmp;
  114. }
  115. var_list *make_var_base(var *gloabl_var){
  116. var_list *tmp = make_var_list();
  117. tmp->var_base = gloabl_var;
  118. return tmp;
  119. }
  120. var_list *append_var_list(var *var_base, var_list *var_list_base){ // make var_list[FILO]
  121. var_list *tmp = make_var_list();
  122. tmp->var_base = var_base;
  123. tmp->next = var_list_base;
  124. return tmp;
  125. }
  126. var *find_var(var_list *var_base,int from, char *name){ // find var by func get_var in var_list[iter to find]
  127. var_list *start = var_base;
  128. var *return_var;
  129. for(int i = 0;i < from;i+= 1){
  130. if(start->next = NULL){
  131. break;
  132. }
  133. start = start->next;
  134. }
  135. while (1)
  136. {
  137. return_var = get_var(name, start->var_base);
  138. if((return_var == NULL) && (start->next == NULL)){ // don't get the var and not next
  139. return NULL;
  140. }
  141. else if((return_var == NULL) && (start->next != NULL)){ // don't get the var but can next
  142. start = start->next;
  143. continue;
  144. }
  145. return return_var; //get var success can or can't next
  146. }
  147. }
  148. void add_var(var_list *var_base,int from, char *name, GWARF_value value){ // add var by func append_var in var_list[iter to find]
  149. var_list *start = var_base;
  150. var *return_var;
  151. for(int i = 0;i < 100;i+= 1){
  152. if(start->next == NULL){
  153. break;
  154. }
  155. start = start->next;
  156. }
  157. append_var(name, value, start->var_base);
  158. }
  159. // ---- statement_list
  160. statement_list *make_statement_list(){ // make a empty var_list node
  161. statement_list *tmp;
  162. tmp = malloc(sizeof(statement_list)); // get an address for base var
  163. tmp->next = NULL;
  164. tmp->statement_base = NULL;
  165. return tmp;
  166. }
  167. statement_list *make_statement_base(statement *gloabl_code){
  168. statement_list *tmp = make_statement_list();
  169. tmp->statement_base = gloabl_code;
  170. return tmp;
  171. }
  172. statement_list *append_statement_list(statement *statement_base, statement_list *statment_list_base){ // make var_list[FILO]
  173. statement_list *tmp = make_statement_list();
  174. tmp->statement_base = statement_base;
  175. tmp->next = statment_list_base;
  176. return tmp;
  177. }
  178. statement *find_statement_list(int from, statement_list *statment_list_base){ // find var by func get_var in var_list[iter to find]
  179. statement_list *start = statment_list_base;
  180. for(int i = 0;i < from;i+= 1){
  181. if(start->next == NULL){
  182. break;
  183. }
  184. start = start->next;
  185. }
  186. return start->statement_base;
  187. }
  188. statement_list *free_statement_list(statement_list *statment_list_base){ // make var_list[FILO]
  189. statement_list *tmp = statment_list_base->next;
  190. if(tmp != NULL){
  191. free(statment_list_base);
  192. return tmp;
  193. }
  194. return statment_list_base;
  195. }
  196. // ---- if_list
  197. if_list *make_base_if(){ // make base if
  198. if_list *tmp;
  199. tmp = malloc(sizeof(if_list)); // get an address for base var
  200. tmp->next = NULL;
  201. tmp->done = NULL;
  202. tmp->condition = NULL;
  203. return tmp;
  204. }
  205. if_list *make_if(statement *condition, statement *done_base){ // if
  206. if_list *tmp = make_base_if();
  207. tmp->done = done_base;
  208. tmp->condition = condition;
  209. return tmp;
  210. }
  211. if_list *append_elif(if_list *tmp ,if_list *base_if_list){ // elif
  212. if_list *start = base_if_list;
  213. while(1){
  214. if(start->next == NULL){
  215. break;
  216. }
  217. start = start->next;
  218. }
  219. start->next = tmp;
  220. return tmp;
  221. }
  222. // ---- run code
  223. GWARF_result read_statement_list(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  224. GWARF_result return_value;
  225. return_value.u = statement_end; // 正常设置[正常语句结束]
  226. return_value.value.type = NUMBER_value; // 默认设置
  227. return_value.value.value.double_value = 0; // 默认设置
  228. switch (the_statement->type)
  229. {
  230. case operation: // 表达式运算
  231. puts("----code----");
  232. return_value = operation_func(the_statement, the_var);
  233. printf("operation value = %f\n", return_value.value.value.double_value);
  234. puts("----stop code----");
  235. break;
  236. case while_cycle:
  237. puts("----while code----");
  238. return_value = while_func(the_statement, the_var);
  239. if((return_value.u == cycle_break) || (return_value.u == code_broken)){
  240. printf("cycle_break(broken) %f\n", return_value.value.value.double_value);
  241. return_value.value.value.double_value -= 1;
  242. if(return_value.value.value.double_value < 0){
  243. return_value.u = statement_end; // 正常设置[正常语句结束]
  244. }
  245. }
  246. printf("while operation value = %f\n", return_value.value.value.double_value);
  247. puts("----stop while code----");
  248. break;
  249. case if_branch:
  250. puts("----if code----");
  251. return_value = if_func(the_statement->code.if_branch.done, the_var);
  252. if(return_value.u == cycle_break){
  253. printf("cycle_break %f\n", return_value.value.value.double_value);
  254. }
  255. if(return_value.u == code_broken){
  256. printf("broken %f\n", return_value.value.value.double_value);
  257. return_value.value.value.double_value -= 1;
  258. if(return_value.value.value.double_value < 0){
  259. return_value.u = statement_end; // 正常设置[正常语句结束]
  260. }
  261. }
  262. printf("if type = %d\n", return_value.u);
  263. printf("if operation value = %f\n", return_value.value.value.double_value);
  264. puts("----stop if code----");
  265. break;
  266. case base_value: // get value[所有字面量均为这个表达式]
  267. return_value.value = (the_statement->code).base_value.value; // code
  268. printf("get value = %f\n", return_value.value.value.double_value);
  269. break;
  270. case base_var:{ // because the var tmp, we should ues a {} to make a block[name space] for the tmp var;
  271. var *tmp = find_var(the_var, 0, (the_statement->code).base_var.var_name);
  272. if(tmp == NULL){
  273. return_value.u = name_no_found; // nameerror
  274. }
  275. else
  276. {
  277. return_value.value = tmp->value; // get_var
  278. printf("var value = %f\n", return_value.value.value.double_value);
  279. }
  280. break;
  281. }
  282. case break_cycle:
  283. return_value.u = cycle_break;
  284. if(the_statement->code.break_cycle.times == NULL){
  285. return_value.value.value.double_value = 0;
  286. }
  287. else{
  288. return_value.value.value.double_value = traverse(the_statement->code.break_cycle.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  289. }
  290. printf("break num = %f\n", return_value.value.value.double_value);
  291. break;
  292. case broken:
  293. return_value.u = code_broken;
  294. if(the_statement->code.broken.times == NULL){
  295. return_value.value.value.double_value = 0;
  296. }
  297. else{
  298. return_value.value.value.double_value = traverse(the_statement->code.broken.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  299. }
  300. printf("broken num = %f\n", return_value.value.value.double_value);
  301. break;
  302. case continue_cycle:
  303. return_value.u = cycle_continue;
  304. if(the_statement->code.continue_cycle.times == NULL){
  305. return_value.value.value.double_value = 0;
  306. }
  307. else{
  308. return_value.value.value.double_value = traverse(the_statement->code.continue_cycle.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  309. }
  310. printf("continue num = %f\n", return_value.value.value.double_value);
  311. break;
  312. case continued:
  313. return_value.u = code_continued;
  314. if(the_statement->code.continued.times == NULL){
  315. return_value.value.value.double_value = 0;
  316. }
  317. else{
  318. return_value.value.value.double_value = traverse(the_statement->code.continued.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  319. }
  320. printf("continued num = %f\n", return_value.value.value.double_value);
  321. break;
  322. default:
  323. puts("default");
  324. break;
  325. }
  326. return return_value;
  327. }
  328. // -----------------if func
  329. GWARF_result if_func(if_list *if_base, var_list *the_var){ // read the statement list with case to run by func
  330. GWARF_result value;
  331. if_list *start;
  332. again: start = if_base;
  333. while(1){
  334. if(start->condition == NULL){ // else
  335. puts("----else----");
  336. value = traverse(start->done, the_var, false);
  337. puts("----stop else----");
  338. break;
  339. }
  340. else{ // not else
  341. GWARF_result condition;
  342. condition = traverse(start->condition, the_var, false);
  343. if(condition.value.value.double_value){ // condition run success
  344. puts("----if----");
  345. value = traverse(start->done, the_var, false);
  346. puts("----stop if----");
  347. break;
  348. }
  349. }
  350. if(start->next == NULL){ // not next
  351. break;
  352. }
  353. start = start->next;
  354. }
  355. if(value.u == cycle_continue){ // if不处理也不计入层次 同break一样
  356. ;
  357. }
  358. if(value.u == code_continued){
  359. if(value.value.value.double_value <= 0){
  360. puts("----if continue real----");
  361. value.u = statement_end;
  362. goto again;
  363. }
  364. else{
  365. value.value.value.double_value -= 1;
  366. }
  367. }
  368. return value;
  369. }
  370. // -----------------while func
  371. GWARF_result while_func(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  372. GWARF_result value, condition;
  373. while (1){
  374. condition = traverse((*the_statement).code.while_cycle.condition, the_var, false);
  375. printf("while condition = %f\n", condition.value.value.double_value);
  376. if(!condition.value.value.double_value){
  377. break;
  378. }
  379. puts("----while----");
  380. value = traverse((*the_statement).code.operation.right_exp, the_var, false);
  381. puts("----stop while----");
  382. if((value.u == cycle_break) || (value.u == code_broken)){ // break the while
  383. break;
  384. }
  385. printf("type = %d\n", value.u);
  386. if((value.u == cycle_continue) || (value.u == code_continued)){
  387. if(value.value.value.double_value <= 0){
  388. puts("----continue real----");
  389. value.u = statement_end;
  390. continue;
  391. }
  392. else{
  393. value.value.value.double_value -= 1;
  394. break;
  395. }
  396. }
  397. }
  398. return value;
  399. }
  400. // -----------------operation func
  401. GWARF_result operation_func(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  402. GWARF_result value, left_result, right_result;
  403. left_result = traverse((*the_statement).code.operation.left_exp, the_var, false);
  404. right_result = traverse((*the_statement).code.operation.right_exp, the_var, false);
  405. switch (the_statement->code.operation.type) // 获取运算类型
  406. {
  407. case ADD_func:
  408. value = add_func(left_result, right_result, the_var);
  409. break;
  410. case SUB_func:
  411. value = sub_func(left_result, right_result, the_var);
  412. break;
  413. case MUL_func:
  414. value = mul_func(left_result, right_result, the_var);
  415. break;
  416. case DIV_func:
  417. value = div_func(left_result, right_result, the_var);
  418. break;
  419. case ASSIGMENT_func:{ // because the var char, we should ues a {} to make a block[name space] for the tmp var;
  420. char *left = (the_statement->code.operation.left_exp)->code.base_var.var_name; // get var name but not value
  421. value = assigment_func(left, right_result, the_var);
  422. break;
  423. }
  424. case EQUAL_func:
  425. value = equal_func(left_result, right_result, the_var, 0);
  426. break;
  427. case MORE_func:
  428. value = equal_func(left_result, right_result, the_var, 1);
  429. break;
  430. case LESS_func:
  431. value = equal_func(left_result, right_result, the_var, 2);
  432. break;
  433. case MOREEQ_func:
  434. value = equal_func(left_result, right_result, the_var, 3);
  435. break;
  436. case LESSEQ_func:
  437. value = equal_func(left_result, right_result, the_var, 4);
  438. break;
  439. case NOTEQ_func:
  440. value = equal_func(left_result, right_result, the_var, 5);
  441. break;
  442. default:
  443. break;
  444. }
  445. value.u = statement_end; // 正常设置[正常语句结束]
  446. return value;
  447. }
  448. // --------- ADD
  449. GWARF_result add_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for add and call from read_statement_list
  450. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for add
  451. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  452. return_value.u = return_def;
  453. return_value.value.type = NUMBER_value;
  454. return_value.value.value.double_value = left_result.value.value.double_value + right_result.value.value.double_value; // 数值相加运算
  455. }
  456. return return_value;
  457. }
  458. // --------- SUB
  459. GWARF_result sub_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for sub and call from read_statement_list
  460. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for sub
  461. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  462. return_value.u = return_def;
  463. return_value.value.type = NUMBER_value;
  464. return_value.value.value.double_value = left_result.value.value.double_value - right_result.value.value.double_value; // 数值相减运算
  465. }
  466. return return_value;
  467. }
  468. // --------- MUL
  469. GWARF_result mul_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for mul and call from read_statement_list
  470. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for mul
  471. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  472. return_value.u = return_def;
  473. return_value.value.type = NUMBER_value;
  474. return_value.value.value.double_value = left_result.value.value.double_value * right_result.value.value.double_value; // 数值相乘运算
  475. }
  476. return return_value;
  477. }
  478. // --------- DIV
  479. GWARF_result div_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for div and call from read_statement_list
  480. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for div
  481. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  482. return_value.u = return_def;
  483. return_value.value.type = NUMBER_value;
  484. return_value.value.value.double_value = left_result.value.value.double_value / right_result.value.value.double_value; // 数值相除运算
  485. }
  486. return return_value;
  487. }
  488. // --------- ASSIGMENT
  489. GWARF_result assigment_func(char *left, GWARF_result right_result, var_list *the_var){ // the func for assigment and call from read_statement_list
  490. add_var(the_var, 0, left, right_result.value);
  491. return right_result;
  492. }
  493. // --------- EQUAL
  494. GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var, int type){ // the func for equal and call from read_statement_list
  495. GWARF_result return_value;
  496. double return_bool = 0;
  497. return_value.u = return_def;
  498. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  499. return_value.value.type = NUMBER_value;
  500. if ((left_result.value.value.double_value == right_result.value.value.double_value) && (type == 0)){ // 如果相等
  501. return_bool = 1; // 返回1 否则(默认)为0
  502. }
  503. if ((left_result.value.value.double_value > right_result.value.value.double_value) && (type == 1)){ // 如果大于
  504. return_bool = 1; // 返回1 否则(默认)为0
  505. }
  506. if ((left_result.value.value.double_value < right_result.value.value.double_value) && (type == 2)){ // 如果小于
  507. return_bool = 1; // 返回1 否则(默认)为0
  508. }
  509. if ((left_result.value.value.double_value >= right_result.value.value.double_value) && (type == 3)){ // 如果大于等于
  510. return_bool = 1; // 返回1 否则(默认)为0
  511. }
  512. if ((left_result.value.value.double_value <= right_result.value.value.double_value) && (type == 4)){ // 如果小于等于
  513. return_bool = 1; // 返回1 否则(默认)为0
  514. }
  515. if ((left_result.value.value.double_value != right_result.value.value.double_value) && (type == 5)){ // 如果不相等
  516. return_bool = 1; // 返回1 否则(默认)为0
  517. }
  518. return_value.value.value.double_value = return_bool; // 数值相加运算
  519. }
  520. return return_value;
  521. }
  522. // --------- traverse[iter]
  523. GWARF_result traverse(statement *the_statement, var_list *the_var, bool new){ // traverse the statement
  524. statement *tmp = the_statement;
  525. GWARF_result result;
  526. while(1){
  527. if(tmp == NULL){
  528. break; // off
  529. }
  530. result = read_statement_list(tmp, the_var);
  531. if((result.u == cycle_break) || (result.u == code_broken)){ // don't next the statement and return the result [the while_func[or for func] will get the result and stop cycle]
  532. puts("----break or broken----");
  533. break;
  534. }
  535. if((result.u == cycle_continue) || (result.u == code_continued)){
  536. puts("----continue or continued----");
  537. break;
  538. }
  539. tmp = tmp->next;
  540. }
  541. return result;
  542. }
  543. // -------inter func
  544. inter *get_inter(){
  545. inter *tmp;
  546. tmp = malloc(sizeof(inter)); // get an address for base var
  547. tmp->global_var = make_var();
  548. tmp->global_code = make_statement();
  549. return tmp;
  550. }