grammar.c 26 KB

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