grammar.c 25 KB

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