grammar.c 29 KB

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