grammar.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  1. #include "__grammar.h"
  2. ParserMessage *makeParserMessage(char *file_dir, char *debug){
  3. ParserMessage *tmp = memCalloc(1, sizeof(ParserMessage));
  4. tmp->tm = makeTokenMessage(file_dir, debug);
  5. tmp->status = success;
  6. tmp->status_message = NULL;
  7. tmp->count = 0;
  8. #if OUT_LOG
  9. if (debug != NULL){
  10. char *debug_dir = memStrcat(debug, PASERS_LOG), *grammar_dir = memStrcat(debug, GRAMMAR_LOG);
  11. tmp->paser_debug = fopen(debug_dir, "w");
  12. tmp->grammar_debug = fopen(grammar_dir, "w");
  13. memFree(debug_dir);
  14. memFree(grammar_dir);
  15. }
  16. else{
  17. tmp->paser_debug = NULL;
  18. tmp->grammar_debug = NULL;
  19. }
  20. #else
  21. tmp->paser_debug = NULL;
  22. tmp->grammar_debug = NULL;
  23. #endif
  24. return tmp;
  25. }
  26. void freeParserMessage(ParserMessage *pm, bool self) {
  27. freeTokenMessage(pm->tm, true);
  28. #if OUT_LOG
  29. if (pm->paser_debug != NULL)
  30. fclose(pm->paser_debug);
  31. if (pm->grammar_debug != NULL)
  32. fclose(pm->grammar_debug);
  33. #endif
  34. memFree(pm->status_message);
  35. if (self){
  36. memFree(pm);
  37. }
  38. }
  39. /**
  40. * 命令表匹配
  41. * parserCommandList :
  42. * | MATHER_EOF
  43. * | parserCommand MATHER_ENTER
  44. * | parserCommand MATHER_EOF
  45. */
  46. void parserCommandList(ParserMessage *pm, Inter *inter, bool global, Statement *st) {
  47. int token_type, stop;
  48. struct Statement *base_st = st;
  49. while (true){
  50. token_type = readBackToken(pm);
  51. if (token_type == MATHER_EOF){
  52. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: <EOF>\n", NULL);
  53. delToken(pm);
  54. goto return_;
  55. }
  56. else if (token_type == MATHER_ENTER){
  57. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: <ENTER>\n", NULL);
  58. delToken(pm);
  59. continue;
  60. }
  61. else{
  62. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: call command\n", NULL);
  63. Token *command_token;
  64. parserCommand(CALLPASERSSIGNATURE);
  65. if (!call_success(pm)){
  66. goto return_;
  67. }
  68. if (COMMAND != readBackToken(pm)){
  69. if (global){
  70. syntaxError(pm, "ERROR from command list(get parserCommand)", command_list_error);
  71. }
  72. goto return_;
  73. }
  74. popAheadToken(command_token, pm);
  75. stop = readBackToken(pm);
  76. if (stop == MATHER_ENTER || stop == MATHER_SEMICOLON){
  77. delToken(pm);
  78. }
  79. else if(stop == MATHER_EOF){
  80. PASS;
  81. }
  82. else{
  83. if (global) {
  84. syntaxError(pm, "ERROR from parserCommand list(get stop)", command_list_error);
  85. freeToken(command_token, true, true);
  86. }
  87. else{
  88. // 若非global模式, 即可以匹配大括号, token保留在ahead中
  89. connectStatement(base_st, command_token->data.st);
  90. freeToken(command_token, true, false);
  91. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG,
  92. "Command List: get command success[at !global end]\n", NULL);
  93. }
  94. goto return_;
  95. }
  96. /*...do something for commandList...*/
  97. connectStatement(base_st, command_token->data.st);
  98. freeToken(command_token, true, false);
  99. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: get command success\n", NULL);
  100. }
  101. }
  102. return_:
  103. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: return\n", NULL);
  104. addStatementToken(COMMANDLIST, base_st, pm);
  105. }
  106. /**
  107. * 命令匹配
  108. * parserCommand:
  109. * | parserOperation
  110. */
  111. void parserCommand(PASERSSIGNATURE){
  112. int token_type;
  113. Statement *st = NULL;
  114. token_type = readBackToken(pm);
  115. switch (token_type) {
  116. case MATHER_DEF :
  117. commandCallBack(pm, st, parserDef, FUNCTION, return_);
  118. break;
  119. case MATHER_IF :
  120. commandCallBack(pm, st, parserIf, IF_BRANCH, return_);
  121. break;
  122. case MATHER_WHILE :
  123. commandCallBack(pm, st, parserWhile, WHILE_BRANCH, return_);
  124. break;
  125. case MATHER_BREAK :
  126. commandCallControl(pm, st, makeBreakStatement, BREAK, return_);
  127. break;
  128. case MATHER_CONTINUE :
  129. commandCallControl(pm, st, makeContinueStatement, CONTINUE, return_);
  130. break;
  131. case MATHER_REGO :
  132. commandCallControl(pm, st, makeRegoStatement, REGO, return_);
  133. break;
  134. case MATHER_RETURN :
  135. commandCallControl(pm, st, makeReturnStatement, RETURN, return_);
  136. break;
  137. default :
  138. commandCallBack(pm, st, parserOperation, OPERATION, return_);
  139. break;
  140. }
  141. addStatementToken(COMMAND, st, pm);
  142. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command: get command success\n", NULL);
  143. return_:
  144. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command: get return\n", NULL);
  145. }
  146. void parserControl(PASERSSIGNATURE, Statement *(*callBack)(Statement *), int type){
  147. Statement *times = NULL, *st = NULL;
  148. delToken(pm);
  149. parserOperation(CALLPASERSSIGNATURE);
  150. if (!call_success(pm))
  151. goto return_;
  152. if (readBackToken(pm) == OPERATION){
  153. Token *tmp;
  154. popAheadToken(tmp, pm);
  155. times = tmp->data.st;
  156. freeToken(tmp, true, false);
  157. }
  158. st = callBack(times);
  159. addStatementToken(type, st, pm);
  160. return_:
  161. return;
  162. }
  163. void parserIf(PASERSSIGNATURE){
  164. Token *if_token = NULL, *code_token = NULL;
  165. struct Statement *st = NULL, *else_st = NULL, *finally_st = NULL;
  166. StatementList *sl = NULL;
  167. bool have_if = false;
  168. again:
  169. switch (readBackToken(pm)) {
  170. case MATHER_IF:
  171. if (have_if)
  172. goto default_;
  173. else
  174. have_if = true;
  175. case MATHER_ELIF:
  176. delToken(pm);
  177. parserOperation(CALLPASERSSIGNATURE);
  178. if (!call_success(pm))
  179. goto return_;
  180. if (readBackToken(pm) != OPERATION){
  181. syntaxError(pm, "Don't get a if condition", syntax_error);
  182. goto return_;
  183. }
  184. popAheadToken(if_token, pm);
  185. parserCode(CALLPASERSSIGNATURE);
  186. if (!call_success(pm) && readBackToken(pm) != CODE){
  187. error_:
  188. freeToken(if_token, true, true);
  189. syntaxError(pm, "Don't get a if code", syntax_error);
  190. goto return_;
  191. }
  192. popAheadToken(code_token, pm);
  193. sl = makeConnectStatementList(sl, if_token->data.st, NULL, code_token->data.st, if_b);
  194. freeToken(if_token, true, false);
  195. freeToken(code_token, true, false);
  196. goto again;
  197. case MATHER_DO:
  198. delToken(pm);
  199. parserCode(CALLPASERSSIGNATURE);
  200. if (!call_success(pm) && readBackToken(pm) != CODE){
  201. goto error_;
  202. }
  203. popAheadToken(code_token, pm);
  204. sl = makeConnectStatementList(sl, NULL, NULL, code_token->data.st, do_b);
  205. freeToken(code_token, true, false);
  206. goto again;
  207. case MATHER_ELSE:
  208. delToken(pm);
  209. parserCode(CALLPASERSSIGNATURE);
  210. if (!call_success(pm) && readBackToken(pm) != CODE){
  211. goto error_;
  212. }
  213. popAheadToken(code_token, pm);
  214. if (else_st != NULL)
  215. freeStatement(else_st);
  216. else_st = code_token->data.st;
  217. freeToken(code_token, true, false);
  218. goto again;
  219. case MATHER_FINALLY:
  220. delToken(pm);
  221. parserCode(CALLPASERSSIGNATURE);
  222. if (!call_success(pm) && readBackToken(pm) != CODE){
  223. goto error_;
  224. }
  225. popAheadToken(code_token, pm);
  226. if (finally_st != NULL)
  227. freeStatement(finally_st);
  228. finally_st = code_token->data.st;
  229. freeToken(code_token, true, false);
  230. goto again;
  231. case MATHER_ENTER:
  232. delToken(pm);
  233. goto again;
  234. default:
  235. default_: break;
  236. }
  237. st = makeIfStatement();
  238. st->u.if_branch.if_list = sl;
  239. st->u.if_branch.else_list = else_st;
  240. st->u.if_branch.finally = finally_st;
  241. addStatementToken(IF_BRANCH, st, pm);
  242. return_:
  243. return;
  244. }
  245. void parserWhile(PASERSSIGNATURE){
  246. Token *while_token = NULL, *code_token = NULL;
  247. struct Statement *st = NULL, *else_st = NULL, *finally_st = NULL,*do_st = NULL;
  248. StatementList *sl = NULL;
  249. bool have_while = false;
  250. again:
  251. switch (readBackToken(pm)) {
  252. case MATHER_WHILE:
  253. if (have_while)
  254. goto default_;
  255. else
  256. have_while = true;
  257. delToken(pm);
  258. parserOperation(CALLPASERSSIGNATURE);
  259. if (!call_success(pm))
  260. goto return_;
  261. if (readBackToken(pm) != OPERATION){
  262. syntaxError(pm, "Don't get a else while condition", syntax_error);
  263. goto return_;
  264. }
  265. popAheadToken(while_token, pm);
  266. parserCode(CALLPASERSSIGNATURE);
  267. if (!call_success(pm) && readBackToken(pm) != CODE){
  268. error_:
  269. freeToken(while_token, true, true);
  270. syntaxError(pm, "Don't get a while code", syntax_error);
  271. goto return_;
  272. }
  273. popAheadToken(code_token, pm);
  274. if (sl != NULL)
  275. freeStatementList(sl);
  276. sl = makeStatementList(while_token->data.st, NULL, code_token->data.st, if_b);
  277. freeToken(while_token, true, false);
  278. freeToken(code_token, true, false);
  279. goto again;
  280. case MATHER_DO:
  281. delToken(pm);
  282. parserCode(CALLPASERSSIGNATURE);
  283. if (!call_success(pm) && readBackToken(pm) != CODE){
  284. goto error_;
  285. }
  286. popAheadToken(code_token, pm);
  287. if (do_st != NULL)
  288. freeStatement(do_st);
  289. do_st = code_token->data.st;
  290. freeToken(code_token, true, false);
  291. goto again;
  292. case MATHER_ELSE:
  293. delToken(pm);
  294. parserCode(CALLPASERSSIGNATURE);
  295. if (!call_success(pm) && readBackToken(pm) != CODE){
  296. goto error_;
  297. }
  298. popAheadToken(code_token, pm);
  299. if (else_st != NULL)
  300. freeStatement(else_st);
  301. else_st = code_token->data.st;
  302. freeToken(code_token, true, false);
  303. goto again;
  304. case MATHER_FINALLY:
  305. delToken(pm);
  306. parserCode(CALLPASERSSIGNATURE);
  307. if (!call_success(pm) && readBackToken(pm) != CODE){
  308. goto error_;
  309. }
  310. popAheadToken(code_token, pm);
  311. if (finally_st != NULL)
  312. freeStatement(finally_st);
  313. finally_st = code_token->data.st;
  314. freeToken(code_token, true, false);
  315. goto again;
  316. case MATHER_ENTER:
  317. delToken(pm);
  318. goto again;
  319. default:
  320. default_: break;
  321. }
  322. st = makeWhileStatement();
  323. st->u.while_branch.while_list = sl;
  324. st->u.while_branch.else_list = else_st;
  325. st->u.while_branch.finally = finally_st;
  326. st->u.while_branch.after = do_st;
  327. addStatementToken(WHILE_BRANCH, st, pm);
  328. return_:
  329. return;
  330. }
  331. void parserDef(PASERSSIGNATURE){
  332. Token *name_token = NULL, *code_token = NULL;
  333. struct Statement *st = NULL;
  334. delToken(pm);
  335. parserBaseValue(CALLPASERSSIGNATURE);
  336. if (!call_success(pm))
  337. goto return_;
  338. if (readBackToken(pm) != BASEVALUE){
  339. syntaxError(pm, "Don't get a function name", syntax_error);
  340. goto return_;
  341. }
  342. popAheadToken(name_token, pm);
  343. checkToken(pm, MATHER_LP, error_);
  344. checkToken(pm, MATHER_RP, error_);
  345. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "parserDef: get function title success\n", NULL);
  346. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "parserDef: call parserCode\n", NULL);
  347. parserCode(CALLPASERSSIGNATURE);
  348. if (!call_success(pm)){
  349. goto error_;
  350. }
  351. if (readBackToken(pm) != CODE){
  352. error_:
  353. freeToken(name_token, true, true);
  354. syntaxError(pm, "Don't get a function code", syntax_error);
  355. goto return_;
  356. }
  357. popAheadToken(code_token, pm);
  358. st = makeFunctionStatement(name_token->data.st, code_token->data.st);
  359. addStatementToken(FUNCTION, st, pm);
  360. freeToken(code_token, true, false);
  361. freeToken(name_token, true, false);
  362. return_:
  363. return;
  364. }
  365. void parserCode(PASERSSIGNATURE){
  366. Token *code_token = NULL, *tk = NULL;
  367. struct Statement *st = makeStatement();
  368. while (true){
  369. checkToken(pm, MATHER_LC, again_); // 若匹配的不是{则检查是否匹配到\n
  370. break; // 若匹配到{则跳出循环
  371. again_: checkToken(pm, MATHER_ENTER, return_); // 若不是\n则跳到return_
  372. }
  373. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "parserCode: call parserCommandList\n", NULL);
  374. parserCommandList(CALLPASERSSIGNATURE, false, st);
  375. if (!call_success(pm)){
  376. goto return_;
  377. }
  378. if (readBackToken(pm) != COMMANDLIST){
  379. syntaxError(pm, "Not CommandList\n", syntax_error);
  380. goto return_;
  381. }
  382. popAheadToken(code_token, pm);
  383. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "parserCode: call parserCommandList success\n", NULL);
  384. checkToken(pm, MATHER_RC, error_);
  385. return_:
  386. addStatementToken(CODE, st, pm);
  387. freeToken(code_token, true, false);
  388. return;
  389. error_:
  390. syntaxError(pm, "Don't get the }", syntax_error);
  391. freeToken(code_token, true, true);
  392. }
  393. /**
  394. * 表达式匹配
  395. * parserOperation:
  396. * | parserAssignment
  397. */
  398. void parserOperation(PASERSSIGNATURE){
  399. Token *operation_token = NULL;
  400. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Operation: call assignment\n", NULL);
  401. parserAssignment(CALLPASERSSIGNATURE);
  402. if (!call_success(pm))
  403. goto return_;
  404. if (readBackToken(pm) != ASSIGNMENT){
  405. goto return_;
  406. }
  407. popAheadToken(operation_token, pm);
  408. /*...do something for operation...*/
  409. addStatementToken(OPERATION, operation_token->data.st, pm);
  410. freeToken(operation_token, true, false);
  411. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Operation: get polynomial success\n", NULL);
  412. return_:
  413. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Operation: return\n", NULL);
  414. }
  415. /**
  416. * 赋值表达式匹配
  417. * parserAssignment:
  418. * | parserPolynomial
  419. * | parserAssignment ASSIGNMENT parserPolynomial
  420. */
  421. bool switchAssignment(PASERSSIGNATURE, int symbol, Statement **st){
  422. switch (symbol) {
  423. case MATHER_ASSIGNMENT:
  424. *st = makeOperationStatement(ASS);
  425. break;
  426. default:
  427. return false;
  428. }
  429. return true;
  430. }
  431. void parserAssignment(PASERSSIGNATURE){
  432. return twoOperation(CALLPASERSSIGNATURE, parserPolynomial, switchAssignment, POLYNOMIAL, ASSIGNMENT,
  433. "polynomial", "assignment");
  434. }
  435. /**
  436. * 多项式匹配
  437. * parserPolynomial:
  438. * | parserBaseValue
  439. * | parserPolynomial ADD parserFactor
  440. * | parserPolynomial SUB parserFactor
  441. */
  442. bool switchPolynomial(PASERSSIGNATURE, int symbol, Statement **st){
  443. switch (symbol) {
  444. case MATHER_ADD:
  445. *st = makeOperationStatement(ADD);
  446. break;
  447. case MATHER_SUB:
  448. *st = makeOperationStatement(SUB);
  449. break;
  450. default:
  451. return false;
  452. }
  453. return true;
  454. }
  455. void parserPolynomial(PASERSSIGNATURE){
  456. return twoOperation(CALLPASERSSIGNATURE, parserFactor, switchPolynomial, FACTOR, POLYNOMIAL,
  457. "factor", "polynomial");
  458. }
  459. /**
  460. * 因式匹配
  461. * parserFactor:
  462. * | parserBaseValue [1]
  463. * | switchFactor ADD parserBaseValue
  464. * | switchFactor SUB parserBaseValue
  465. */
  466. bool switchFactor(PASERSSIGNATURE, int symbol, Statement **st){
  467. switch (symbol) {
  468. case MATHER_MUL:
  469. *st = makeOperationStatement(MUL);
  470. break;
  471. case MATHER_DIV:
  472. *st = makeOperationStatement(DIV);
  473. break;
  474. default:
  475. return false;
  476. }
  477. return true;
  478. }
  479. void parserFactor(PASERSSIGNATURE){
  480. return twoOperation(CALLPASERSSIGNATURE, parserCallBack, switchFactor, CALLBACK, FACTOR,
  481. "call back", "factor");
  482. }
  483. int tailCall(PASERSSIGNATURE, Token *left_token, Statement **st){
  484. if (readBackToken(pm) != MATHER_LP){
  485. return -1;
  486. }
  487. delToken(pm);
  488. checkToken(pm, MATHER_RP, error_);
  489. *st = makeCallStatement(left_token->data.st);
  490. return 1;
  491. error_:
  492. syntaxError(pm, "Don't get ) from call back", syntax_error);
  493. return 0;
  494. }
  495. void parserCallBack(PASERSSIGNATURE){
  496. return tailOperation(CALLPASERSSIGNATURE, parserBaseValue, tailCall, BASEVALUE, CALLBACK,
  497. "Base Value", "Call Back");
  498. }
  499. int getOperation(PASERSSIGNATURE, int right_type, Statement **st, char *name){
  500. Token *operation_token;
  501. parserOperation(CALLPASERSSIGNATURE);
  502. if (!call_success(pm)){
  503. return 0;
  504. }
  505. if (readBackToken(pm) != OPERATION){
  506. return 0;
  507. }
  508. popAheadToken(operation_token, pm);
  509. if (readBackToken(pm) != right_type){
  510. return -1;
  511. }
  512. delToken(pm);
  513. *st = operation_token->data.st;
  514. freeToken(operation_token, true, false);
  515. return 1;
  516. }
  517. /**
  518. * 字面量匹配
  519. * parserBaseValue:
  520. * | MATHER_NUMBER
  521. * | MATHER_STRING
  522. */
  523. void parserBaseValue(PASERSSIGNATURE){
  524. int token_type;
  525. Token *value_token = NULL;
  526. struct Statement *st = NULL;
  527. token_type = readBackToken(pm);
  528. if(MATHER_NUMBER == token_type){
  529. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get number\n", NULL);
  530. popAheadToken(value_token, pm);
  531. char *stop;
  532. st = makeStatement();
  533. st->type = base_value;
  534. st->u.base_value.value = makeNumberValue(strtol(value_token->data.str, &stop, 10), inter);
  535. }
  536. else if(MATHER_STRING == token_type){
  537. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get string\n", NULL);
  538. popAheadToken(value_token, pm);
  539. st = makeStatement();
  540. st->type = base_value;
  541. st->u.base_value.value = makeStringValue(value_token->data.str, inter);
  542. }
  543. else if(MATHER_VAR == token_type){
  544. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get var\n", NULL);
  545. popAheadToken(value_token, pm);
  546. st = makeStatement();
  547. st->type = base_var;
  548. st->u.base_var.name = memStrcpy(value_token->data.str, 0, false, false);
  549. st->u.base_var.times = NULL;
  550. }
  551. else if(MATHER_LB == token_type){
  552. int tmp;
  553. Statement *tmp_st = NULL;
  554. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "base value: get operation\n", NULL);
  555. popAheadToken(value_token, pm);
  556. tmp = getOperation(CALLPASERSSIGNATURE, MATHER_RB, &tmp_st, "base value");
  557. if (tmp == 0){
  558. freeToken(value_token, true, true);
  559. syntaxError(pm, "Don't get operation from list/var", syntax_error);
  560. goto return_;
  561. }
  562. else if(tmp == -1){
  563. freeToken(value_token, true, true);
  564. syntaxError(pm, "Don't get ] from list/var", syntax_error);
  565. goto return_;
  566. }
  567. if (MATHER_VAR == readBackToken(pm)){
  568. Token *var_token;
  569. popAheadToken(var_token, pm);
  570. st = makeStatement();
  571. st->type = base_var;
  572. st->u.base_var.name = memStrcpy(var_token->data.str, 0, false, false);
  573. st->u.base_var.times = tmp_st;
  574. freeToken(var_token, true, false);
  575. }
  576. // TODO-szh list处理
  577. }
  578. else if(MATHER_LP == token_type){
  579. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "base value: get operation\n", NULL);
  580. popAheadToken(value_token, pm);
  581. int tmp = getOperation(CALLPASERSSIGNATURE, MATHER_RP, &st, "base value");
  582. if (tmp == 0){
  583. freeToken(value_token, true, true);
  584. syntaxError(pm, "Don't get operation from Base Value", syntax_error);
  585. goto return_;
  586. }
  587. else if(tmp == -1){
  588. freeToken(value_token, true, true);
  589. syntaxError(pm, "Don't get ) from Base Value", syntax_error);
  590. goto return_;
  591. }
  592. }
  593. else{
  594. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: else\n", NULL);
  595. goto return_;
  596. }
  597. freeToken(value_token, true, false);
  598. addStatementToken(BASEVALUE, st, pm);
  599. return_:
  600. return;
  601. }
  602. inline void twoOperation(PASERSSIGNATURE, void (*callBack)(PASERSSIGNATURE), int (*getSymbol)(PASERSSIGNATURE, int symbol, Statement **st), int type, int self_type, char *call_name, char *self_name){
  603. while(true){
  604. Token *left_token = NULL, *right_token = NULL;
  605. struct Statement *st = NULL;
  606. readBackToken(pm);
  607. if (readBackToken(pm) != self_type){
  608. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "%s: call %s(left)\n", self_name, call_name);
  609. callBack(CALLPASERSSIGNATURE);
  610. if (!call_success(pm) || (readBackToken(pm) != type))
  611. goto return_;
  612. popAheadToken(left_token, pm);
  613. addStatementToken(self_type, left_token->data.st, pm);
  614. freeToken(left_token, true, false);
  615. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG,
  616. "%s: get %s(left) success[push %s]\n", self_name, call_name, self_name);
  617. continue;
  618. }
  619. popAheadToken(left_token, pm);
  620. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "%s: call symbol\n", self_name);
  621. if (getSymbol(CALLPASERSSIGNATURE, readBackToken(pm), &st)){
  622. delToken(pm);
  623. }
  624. else{
  625. backToken_(pm, left_token);
  626. goto return_;
  627. }
  628. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG,
  629. "%s: get symbol success\n%s: call %s[right]\n", self_name, self_name, call_name);
  630. callBack(CALLPASERSSIGNATURE); // 获得左值
  631. if (!call_success(pm)){
  632. freeToken(left_token, true, false);
  633. freeStatement(st);
  634. goto return_;
  635. }
  636. if (readBackToken(pm) != type){ // 若非正确数值
  637. char *tmp1, *tmp2;
  638. tmp1 = memStrcat("ERROR from ", self_name);
  639. tmp2 = memStrcat(tmp1, "(get right)");
  640. syntaxError(pm, tmp2, syntax_error);
  641. memFree(tmp1);
  642. memFree(tmp2);
  643. freeToken(left_token, true, true);
  644. freeStatement(st);
  645. goto return_;
  646. }
  647. popAheadToken(right_token, pm);
  648. addToken_(pm, setOperationFromToken(st, left_token, right_token, self_type));
  649. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Polynomial: get base value(right) success[push polynomial]\n", NULL);
  650. }
  651. return_:
  652. return;
  653. }
  654. inline void tailOperation(PASERSSIGNATURE, void (*callBack)(PASERSSIGNATURE), int (*tailFunction)(PASERSSIGNATURE, Token *left_token, Statement **st), int type, int self_type, char *call_name, char *self_name){
  655. while(true){
  656. Token *left_token = NULL;
  657. struct Statement *st = NULL;
  658. if (readBackToken(pm) != self_type){
  659. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "%s: call %s(left)\n", self_name, call_name);
  660. callBack(CALLPASERSSIGNATURE);
  661. if ((!call_success(pm)) || readBackToken(pm) != type)
  662. goto return_;
  663. popAheadToken(left_token, pm);
  664. addStatementToken(self_type, left_token->data.st, pm);
  665. freeToken(left_token, true, false);
  666. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG,
  667. "%s: get %s(left) success[push %s]\n", self_name, call_name, self_name);
  668. continue;
  669. }
  670. popAheadToken(left_token, pm);
  671. int tail_status = tailFunction(CALLPASERSSIGNATURE, left_token, &st);
  672. if (tail_status == -1){
  673. backToken_(pm, left_token);
  674. goto return_;
  675. }
  676. else if(!tail_status){
  677. goto error_;
  678. }
  679. addStatementToken(self_type, st, pm);
  680. freeToken(left_token, true, false);
  681. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "%s: call tail success\n", self_name);
  682. continue;
  683. error_:
  684. freeToken(left_token, true, true);
  685. goto return_;
  686. }
  687. return_:
  688. return;
  689. }
  690. /**
  691. * syntax错误处理器
  692. * @param pm
  693. * @param message 错误信息
  694. * @param status 错误类型
  695. */
  696. void syntaxError(ParserMessage *pm, char *message, int status){
  697. if (pm->status != success)
  698. return;
  699. pm->status = status;
  700. pm->status_message = memStrcpy(message, 0, false, false);
  701. }
  702. int readBackToken(ParserMessage *pm){
  703. // TODO-szh 优化执行效果
  704. writeLog(pm->grammar_debug, GRAMMAR_DEBUG, "token operation number : %d\n", pm->count);
  705. writeLog(pm->paser_debug, DEBUG, "\ntoken operation number : %d\n", pm->count);
  706. pm->count ++;
  707. int status = safeGetToken(pm->tm, pm->paser_debug);
  708. if (status == -2){
  709. syntaxError(pm, "lexical make some error", lexical_error);
  710. }
  711. backToken(pm->tm->ts, pm->paser_debug);
  712. return status;
  713. }