grammar.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  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;
  48. int stop;
  49. Statement *base_st = st;
  50. while (true){
  51. token_type = readBackToken(pm);
  52. if (token_type == MATHER_EOF){
  53. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: <EOF>\n", NULL);
  54. delToken(pm);
  55. goto return_;
  56. }
  57. else if (token_type == MATHER_ENTER){
  58. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: <ENTER>\n", NULL);
  59. delToken(pm);
  60. continue;
  61. }
  62. else{
  63. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: call command\n", NULL);
  64. Token *command_token;
  65. if (!callChildToken(CALLPASERSSIGNATURE, parserCommand, COMMAND, &command_token,
  66. (global ? "ERROR from command list(get parserCommand)" : NULL),
  67. command_list_error)){
  68. goto return_;
  69. }
  70. stop = readBackToken(pm);
  71. if (stop == MATHER_ENTER || stop == MATHER_SEMICOLON){
  72. delToken(pm);
  73. }
  74. else if(stop != MATHER_EOF){
  75. if (global) {
  76. syntaxError(pm, command_list_error, 1, "ERROR from parserCommand list(get stop)");
  77. printf("stop = %d\n", stop);
  78. freeToken(command_token, true, true);
  79. }
  80. else{
  81. // 若非global模式, 即可以匹配大括号, token保留在ahead中
  82. connectStatement(base_st, command_token->data.st);
  83. freeToken(command_token, true, false);
  84. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG,
  85. "Command List: get command success[at !global end]\n", NULL);
  86. }
  87. goto return_;
  88. }
  89. connectStatement(base_st, command_token->data.st);
  90. freeToken(command_token, true, false);
  91. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: get command success\n", NULL);
  92. }
  93. }
  94. return_:
  95. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command List: return\n", NULL);
  96. addStatementToken(COMMANDLIST, base_st, pm);
  97. }
  98. /**
  99. * 命令匹配
  100. * parserCommand:
  101. * | parserOperation
  102. */
  103. void parserCommand(PASERSSIGNATURE){
  104. int token_type, status;
  105. Statement *st = NULL;
  106. token_type = readBackToken(pm);
  107. switch (token_type) {
  108. case MATHER_DEF :
  109. status = commandCallBack_(CALLPASERSSIGNATURE, parserDef, FUNCTION, &st,
  110. "Command: call def\n");
  111. break;
  112. case MATHER_IF :
  113. status = commandCallBack_(CALLPASERSSIGNATURE, parserIf, IF_BRANCH, &st,
  114. "Command: call if\n");
  115. break;
  116. case MATHER_WHILE :
  117. status = commandCallBack_(CALLPASERSSIGNATURE, parserWhile, WHILE_BRANCH, &st,
  118. "Command: call while\n");
  119. break;
  120. case MATHER_TRY :
  121. status = commandCallBack_(CALLPASERSSIGNATURE, parserTry, TRY_BRANCH, &st,
  122. "Command: call try\n");
  123. break;
  124. case MATHER_BREAK :
  125. status = commandCallControl_(CALLPASERSSIGNATURE, makeBreakStatement, BREAK, &st,
  126. "Command: call break\n");
  127. break;
  128. case MATHER_CONTINUE :
  129. status = commandCallControl_(CALLPASERSSIGNATURE, makeContinueStatement, CONTINUE, &st,
  130. "Command: call continue\n");
  131. break;
  132. case MATHER_RESTART :
  133. status = commandCallControl_(CALLPASERSSIGNATURE, makeRestartStatement, RESTART, &st,
  134. "Command: call restart\n");
  135. break;
  136. case MATHER_REGO :
  137. status = commandCallControl_(CALLPASERSSIGNATURE, makeRegoStatement, REGO, &st,
  138. "Command: call rego\n");
  139. break;
  140. case MATHER_RETURN :
  141. status = commandCallControl_(CALLPASERSSIGNATURE, makeReturnStatement, RETURN, &st,
  142. "Command: call return\n");
  143. break;
  144. case MATHER_RAISE :
  145. status = commandCallControl_(CALLPASERSSIGNATURE, makeRaiseStatement, RAISE, &st,
  146. "Command: call raise\n");
  147. break;
  148. default :
  149. status = commandCallBack_(CALLPASERSSIGNATURE, parserOperation, OPERATION, &st,
  150. "Command: call operation\n");
  151. break;
  152. }
  153. if (!status)
  154. goto return_;
  155. addStatementToken(COMMAND, st, pm);
  156. return_:
  157. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Command: get return\n", NULL);
  158. }
  159. void parserControl(PASERSSIGNATURE, Statement *(*callBack)(Statement *), int type){
  160. Statement *times = NULL;
  161. Statement *st = NULL;
  162. delToken(pm);
  163. parserOperation(CALLPASERSSIGNATURE);
  164. if (!call_success(pm))
  165. goto return_;
  166. if (readBackToken(pm) == OPERATION){
  167. Token *tmp;
  168. tmp= popAheadToken(pm);
  169. times = tmp->data.st;
  170. freeToken(tmp, true, false);
  171. }
  172. st = callBack(times);
  173. addStatementToken(type, st, pm);
  174. return_:
  175. return;
  176. }
  177. void parserIf(PASERSSIGNATURE){
  178. Statement *st = NULL;
  179. Statement *else_st = NULL;
  180. Statement *finally_st = NULL;
  181. StatementList *sl = NULL;
  182. bool have_if = false;
  183. again:
  184. switch (readBackToken(pm)) {
  185. case MATHER_IF:
  186. if (have_if)
  187. goto default_;
  188. else
  189. have_if = true;
  190. case MATHER_ELIF: {
  191. if (else_st != NULL) {
  192. syntaxError(pm, syntax_error, 1, "get elif after else\n");
  193. goto error_;
  194. }
  195. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  196. delToken(pm);
  197. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &condition_tmp, "Don't get a if condition"))
  198. goto error_;
  199. if (!callParserAs(CALLPASERSSIGNATURE, &var_tmp, "Don't get a while var")) {
  200. freeStatement(condition_tmp);
  201. goto error_;
  202. }
  203. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a if code")) {
  204. freeStatement(condition_tmp);
  205. freeStatement(var_tmp);
  206. goto error_;
  207. }
  208. sl = makeConnectStatementList(sl, condition_tmp, var_tmp, code_tmp, if_b);
  209. goto again;
  210. }
  211. case MATHER_DO: {
  212. if (else_st != NULL)
  213. goto default_;
  214. Statement *code_tmp = NULL;
  215. delToken(pm);
  216. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a if...do code"))
  217. goto error_;
  218. sl = makeConnectStatementList(sl, NULL, NULL, code_tmp, do_b);
  219. goto again;
  220. }
  221. case MATHER_ELSE:
  222. if (else_st != NULL){
  223. syntaxError(pm, syntax_error, 1, "get else after else\n");
  224. goto error_;
  225. }
  226. delToken(pm);
  227. if (!callParserCode(CALLPASERSSIGNATURE, &else_st, "Don't get a if...else code"))
  228. goto error_;
  229. goto again;
  230. case MATHER_FINALLY:
  231. delToken(pm);
  232. if (!callParserCode(CALLPASERSSIGNATURE, &finally_st, "Don't get a if...else code"))
  233. goto error_;
  234. break;
  235. case MATHER_ENTER:
  236. delToken(pm);
  237. goto again;
  238. case MATHER_SEMICOLON:
  239. break;
  240. default:{
  241. default_:
  242. addLexToken(pm, MATHER_ENTER);
  243. break;
  244. }
  245. }
  246. st = makeIfStatement();
  247. st->u.if_branch.if_list = sl;
  248. st->u.if_branch.else_list = else_st;
  249. st->u.if_branch.finally = finally_st;
  250. addStatementToken(IF_BRANCH, st, pm);
  251. return;
  252. error_:
  253. freeStatement(else_st);
  254. freeStatement(finally_st);
  255. freeStatementList(sl);
  256. return;
  257. }
  258. void parserWhile(PASERSSIGNATURE){
  259. Statement *st = NULL;
  260. Statement *else_st = NULL;
  261. Statement *finally_st = NULL;
  262. Statement *do_st = NULL;
  263. StatementList *sl = NULL;
  264. bool have_while = false;
  265. again:
  266. switch (readBackToken(pm)) {
  267. case MATHER_WHILE: {
  268. if (have_while)
  269. goto default_;
  270. else
  271. have_while = true;
  272. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  273. delToken(pm);
  274. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &condition_tmp, "Don't get a while condition"))
  275. goto error_;
  276. if (!callParserAs(CALLPASERSSIGNATURE, &var_tmp, "Don't get a while var")){
  277. freeStatement(condition_tmp);
  278. goto error_;
  279. }
  280. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a while code")) {
  281. freeStatement(condition_tmp);
  282. freeStatement(var_tmp);
  283. goto error_;
  284. }
  285. if (sl != NULL)
  286. freeStatementList(sl);
  287. sl = makeStatementList(condition_tmp, var_tmp, code_tmp, while_b);
  288. goto again;
  289. }
  290. case MATHER_DO:
  291. if (do_st != NULL || else_st != NULL)
  292. goto default_;
  293. delToken(pm);
  294. if (!callParserCode(CALLPASERSSIGNATURE, &do_st, "Don't get a while...do code"))
  295. goto error_;
  296. goto again;
  297. case MATHER_ELSE:
  298. if (else_st != NULL) {
  299. syntaxError(pm, syntax_error, 1, "get else after else\n");
  300. goto error_;
  301. }
  302. delToken(pm);
  303. if (!callParserCode(CALLPASERSSIGNATURE, &else_st, "Don't get a while...else code"))
  304. goto error_;
  305. goto again;
  306. case MATHER_FINALLY:
  307. delToken(pm);
  308. if (!callParserCode(CALLPASERSSIGNATURE, &finally_st, "Don't get a while...finally code"))
  309. goto error_;
  310. break;
  311. case MATHER_ENTER:
  312. delToken(pm);
  313. goto again;
  314. case MATHER_SEMICOLON:
  315. break;
  316. default: {
  317. default_:
  318. addLexToken(pm, MATHER_ENTER);
  319. break;
  320. }
  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. error_:
  330. freeStatement(else_st);
  331. freeStatement(finally_st);
  332. freeStatement(do_st);
  333. freeStatementList(sl);
  334. return;
  335. }
  336. void parserTry(PASERSSIGNATURE){
  337. Statement *st = NULL;
  338. Statement *try_st = NULL;
  339. Statement *else_st = NULL;
  340. Statement *finally_st = NULL;
  341. StatementList *sl = NULL;
  342. again:
  343. switch (readBackToken(pm)) {
  344. case MATHER_TRY:{
  345. if (try_st != NULL)
  346. goto default_;
  347. delToken(pm);
  348. if (!callParserCode(CALLPASERSSIGNATURE, &try_st, "Don't get a try code"))
  349. goto error_;
  350. goto again;
  351. }
  352. case MATHER_EXCEPT: {
  353. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  354. delToken(pm);
  355. callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &condition_tmp, NULL);
  356. if (!callParserAs(CALLPASERSSIGNATURE, &var_tmp, "Don't get a except var")){
  357. freeStatement(condition_tmp);
  358. goto error_;
  359. }
  360. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a except code")) {
  361. freeStatement(condition_tmp);
  362. freeStatement(var_tmp);
  363. goto error_;
  364. }
  365. sl = makeConnectStatementList(sl, condition_tmp, var_tmp, code_tmp, except_b);
  366. goto again;
  367. }
  368. case MATHER_ELSE:
  369. if (else_st != NULL) {
  370. syntaxError(pm, syntax_error, 1, "get else after else\n");
  371. goto error_;
  372. }
  373. delToken(pm);
  374. if (!callParserCode(CALLPASERSSIGNATURE, &else_st, "Don't get a try...else code"))
  375. goto error_;
  376. goto again;
  377. case MATHER_FINALLY:
  378. delToken(pm);
  379. if (!callParserCode(CALLPASERSSIGNATURE, &finally_st, "Don't get a try...finally code"))
  380. goto error_;
  381. break;
  382. case MATHER_ENTER:
  383. delToken(pm);
  384. goto again;
  385. case MATHER_SEMICOLON:
  386. break;
  387. default: {
  388. default_:
  389. addLexToken(pm, MATHER_ENTER);
  390. break;
  391. }
  392. }
  393. st = makeTryStatement();
  394. st->u.try_branch.try = try_st;
  395. st->u.try_branch.except_list = sl;
  396. st->u.try_branch.else_list = else_st;
  397. st->u.try_branch.finally = finally_st;
  398. addStatementToken(TRY_BRANCH, st, pm);
  399. return;
  400. error_:
  401. freeStatement(try_st);
  402. freeStatement(else_st);
  403. freeStatement(finally_st);
  404. freeStatementList(sl);
  405. return;
  406. }
  407. /**
  408. * @param pm
  409. * @param inter
  410. * @param pt
  411. * @param is_formal 是否为形式参数, 若为true,则限定*args为only_value的结尾, **kwargs为name_value结尾
  412. * @param is_list 若为true则关闭对name_value和**kwargs的支持
  413. * @param is_dict 若为true则关闭对only_value和*args的支持
  414. * @param sep 设定分割符号
  415. * @param ass 设定赋值符号
  416. * @return
  417. */
  418. bool parserParameter(ParserMessage *pm, Inter *inter, Parameter **pt, bool is_formal, bool is_list, bool is_dict, int sep,
  419. int ass) {
  420. Parameter *new_pt = NULL;
  421. Token *tmp;
  422. bool last_pt = false;
  423. enum {
  424. s_1, // only_value模式
  425. s_2, // name_value模式
  426. s_3, // only_args模式
  427. s_4, // name_args模式
  428. } status;
  429. if (is_dict)
  430. status = s_2; // is_formal关闭对only_value的支持
  431. else
  432. status = s_1;
  433. while (!last_pt){
  434. tmp = NULL;
  435. if (!is_dict && status != s_2 && checkToken_(pm, MATHER_MUL)) // is_formal关闭对*args的支持
  436. status = s_3;
  437. else if (!is_list && checkToken_(pm, MATHER_POW)) // is_formal关闭对*args的支持
  438. status = s_4;
  439. parserPolynomial(CALLPASERSSIGNATURE);
  440. if (!call_success(pm))
  441. goto error_;
  442. if (readBackToken(pm) != POLYNOMIAL) {
  443. if (status == s_3) {
  444. syntaxError(pm, syntax_error, 1, "Don't get a parameter after *");
  445. goto error_;
  446. }
  447. break;
  448. }
  449. tmp = popAheadToken(pm);
  450. int pt_type = value_par;
  451. if (status == s_1){
  452. if (!checkToken_(pm, sep)){
  453. if (is_list || !checkToken_(pm, ass)) // // is_list关闭对name_value的支持
  454. last_pt = true;
  455. else {
  456. pt_type = name_par;
  457. status = s_2;
  458. }
  459. }
  460. }
  461. else if (status == s_2){
  462. pt_type = name_par;
  463. if (!checkToken_(pm, ass))
  464. goto error_;
  465. }
  466. else if (status == s_3){
  467. pt_type = args_par;
  468. if (!checkToken_(pm, sep))
  469. last_pt = true;
  470. }
  471. else if (status == s_4){
  472. pt_type = kwargs_par;
  473. if (!checkToken_(pm, sep))
  474. last_pt = true;
  475. }
  476. if (pt_type == value_par)
  477. new_pt = connectOnlyValueParameter(tmp->data.st, new_pt);
  478. else if (pt_type == name_par){
  479. Statement *tmp_value;
  480. if (!callChildStatement(CALLPASERSSIGNATURE, parserPolynomial, POLYNOMIAL, &tmp_value, "Don't get a parameter value"))
  481. goto error_;
  482. new_pt = connectNameValueParameter(tmp_value, tmp->data.st, new_pt);
  483. if (!checkToken_(pm, sep))
  484. last_pt = true;
  485. }
  486. else if (pt_type == args_par){
  487. new_pt = connectOnlyArgsParameter(tmp->data.st, new_pt);
  488. if (is_formal)
  489. status = s_2; // 是否规定*args只出现一次
  490. else
  491. status = s_1;
  492. }
  493. else if (pt_type == kwargs_par){
  494. new_pt = connectNameArgsParameter(tmp->data.st, new_pt);
  495. if (is_formal)
  496. last_pt = true; // 是否规定**kwargs只出现一次
  497. else
  498. status = s_2;
  499. }
  500. freeToken(tmp, true, false);
  501. }
  502. *pt = new_pt;
  503. return true;
  504. error_:
  505. freeToken(tmp, true, true);
  506. freeParameter(new_pt, true);
  507. *pt = NULL;
  508. return false;
  509. }
  510. void parserDef(PASERSSIGNATURE){
  511. Statement *st = NULL;
  512. Statement *name_tmp = NULL;
  513. Statement *code_tmp = NULL;
  514. Parameter *pt = NULL;
  515. delToken(pm);
  516. if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &name_tmp,
  517. "Don't get a function name"))
  518. goto error_;
  519. if (!checkToken_(pm, MATHER_LP)) {
  520. syntaxError(pm, syntax_error, 1, "Don't get a function ( before parameter");
  521. goto error_;
  522. }
  523. if (!parserParameter(CALLPASERSSIGNATURE, &pt, true, false, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  524. syntaxError(pm, syntax_error, 1, "Don't get a function parameter");
  525. goto error_;
  526. }
  527. if (!checkToken_(pm, MATHER_RP)) {
  528. syntaxError(pm, syntax_error, 1, "Don't get a function ) after parameter");
  529. goto error_;
  530. }
  531. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "parserDef: get function title success\n", NULL);
  532. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "parserDef: call parserCode\n", NULL);
  533. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a function code")) {
  534. syntaxError(pm, syntax_error, 1, "Don't get a function code");
  535. goto error_;
  536. }
  537. st = makeFunctionStatement(name_tmp, code_tmp, pt);
  538. addLexToken(pm, MATHER_ENTER);
  539. addStatementToken(FUNCTION, st, pm);
  540. return;
  541. error_:
  542. freeStatement(name_tmp);
  543. freeStatement(code_tmp);
  544. return;
  545. }
  546. void parserCode(PASERSSIGNATURE){
  547. Token *code_token = NULL;
  548. Token *tk = NULL;
  549. Statement *st = makeStatement();
  550. while (true){
  551. if (!checkToken_(pm, MATHER_LC))
  552. goto again_;
  553. break;
  554. again_:
  555. if (!checkToken_(pm, MATHER_ENTER))
  556. goto return_;
  557. }
  558. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "parserCode: call parserCommandList\n", NULL);
  559. parserCommandList(CALLPASERSSIGNATURE, false, st);
  560. if (!call_success(pm)){
  561. goto error_;
  562. }
  563. if (readBackToken(pm) != COMMANDLIST){
  564. syntaxError(pm, syntax_error, 1, "Not CommandList\n");
  565. goto error_;
  566. }
  567. code_token = popAheadToken(pm);
  568. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "parserCode: call parserCommandList success\n", NULL);
  569. if (!checkToken_(pm, MATHER_RC)) {
  570. syntaxError(pm, syntax_error, 1, "Don't get the }");
  571. goto error_;
  572. }
  573. return_:
  574. addStatementToken(CODE, st, pm);
  575. freeToken(code_token, true, false);
  576. return;
  577. error_:
  578. freeToken(code_token, true, true);
  579. return;
  580. }
  581. /**
  582. * 表达式匹配
  583. * parserOperation:
  584. * | parserAssignment
  585. */
  586. void parserOperation(PASERSSIGNATURE){
  587. Statement *operation_st = NULL;
  588. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Operation: call assignment\n", NULL);
  589. if (!callChildStatement(CALLPASERSSIGNATURE, parserAssignment, ASSIGNMENT, &operation_st, NULL))
  590. goto return_;
  591. addStatementToken(OPERATION, operation_st, pm);
  592. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Operation: get polynomial success\n", NULL);
  593. return_:
  594. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Operation: return\n", NULL);
  595. return;
  596. }
  597. /**
  598. * 赋值表达式匹配
  599. * parserAssignment:
  600. * | parserPolynomial
  601. * | parserAssignment ASSIGNMENT parserPolynomial
  602. */
  603. bool switchAssignment(PASERSSIGNATURE, int symbol, Statement **st){
  604. switch (symbol) {
  605. case MATHER_ASSIGNMENT:
  606. *st = makeOperationStatement(ASS);
  607. break;
  608. default:
  609. return false;
  610. }
  611. return true;
  612. }
  613. void parserAssignment(PASERSSIGNATURE){
  614. return twoOperation(CALLPASERSSIGNATURE, parserTuple, switchAssignment, TUPLE, ASSIGNMENT,
  615. "polynomial", "assignment", true);
  616. }
  617. /**
  618. * 元组匹配
  619. * parserTuple
  620. * | switchPolynomial
  621. * | parserTuple COMMA switchPolynomial
  622. * @param pm
  623. * @param inter
  624. */
  625. void parserTuple(PASERSSIGNATURE){
  626. Parameter *pt = NULL;
  627. Statement *st = NULL;
  628. Token *tmp = NULL;
  629. if (readBackToken(pm) == MATHER_MUL)
  630. goto parserPt;
  631. if (!callChildToken(CALLPASERSSIGNATURE, parserPolynomial, POLYNOMIAL, &tmp, NULL, syntax_error))
  632. goto return_;
  633. if (readBackToken(pm) != MATHER_COMMA){
  634. tmp->token_type = TUPLE;
  635. addToken_(pm ,tmp);
  636. goto return_;
  637. }
  638. addToken_(pm ,tmp);
  639. parserPt:
  640. if (!parserParameter(CALLPASERSSIGNATURE, &pt, false, true, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  641. syntaxError(pm, syntax_error, 1, "Don't get tuple element");
  642. goto return_;
  643. }
  644. st = makeTupleStatement(pt, value_tuple);
  645. addStatementToken(TUPLE, st, pm);
  646. return_:
  647. return;
  648. }
  649. /**
  650. * 多项式匹配
  651. * parserPolynomial:
  652. * | parserBaseValue
  653. * | parserPolynomial ADD parserFactor
  654. * | parserPolynomial SUB parserFactor
  655. */
  656. bool switchPolynomial(PASERSSIGNATURE, int symbol, Statement **st){
  657. switch (symbol) {
  658. case MATHER_ADD:
  659. *st = makeOperationStatement(ADD);
  660. break;
  661. case MATHER_SUB:
  662. *st = makeOperationStatement(SUB);
  663. break;
  664. default:
  665. return false;
  666. }
  667. return true;
  668. }
  669. void parserPolynomial(PASERSSIGNATURE){
  670. return twoOperation(CALLPASERSSIGNATURE, parserFactor, switchPolynomial, FACTOR, POLYNOMIAL,
  671. "factor", "polynomial", false);
  672. }
  673. /**
  674. * 因式匹配
  675. * parserFactor:
  676. * | parserBaseValue [1]
  677. * | switchFactor ADD parserBaseValue
  678. * | switchFactor SUB parserBaseValue
  679. */
  680. bool switchFactor(PASERSSIGNATURE, int symbol, Statement **st){
  681. switch (symbol) {
  682. case MATHER_MUL:
  683. *st = makeOperationStatement(MUL);
  684. break;
  685. case MATHER_DIV:
  686. *st = makeOperationStatement(DIV);
  687. break;
  688. default:
  689. return false;
  690. }
  691. return true;
  692. }
  693. void parserFactor(PASERSSIGNATURE){
  694. return twoOperation(CALLPASERSSIGNATURE, parserCallBack, switchFactor, CALLBACK, FACTOR,
  695. "call back", "factor", false);
  696. }
  697. int tailCall(PASERSSIGNATURE, Token *left_token, Statement **st){
  698. Parameter *pt = NULL;
  699. if (readBackToken(pm) != MATHER_LP)
  700. return -1;
  701. delToken(pm);
  702. if (!parserParameter(CALLPASERSSIGNATURE, &pt, false, false, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  703. syntaxError(pm, syntax_error, 1, "Don't get call parameter");
  704. return 0;
  705. }
  706. if (!checkToken_(pm, MATHER_RP)){
  707. syntaxError(pm, syntax_error, 1, "Don't get ) from call back");
  708. return 0;
  709. }
  710. *st = makeCallStatement(left_token->data.st, pt);
  711. return 1;
  712. }
  713. void parserCallBack(PASERSSIGNATURE){
  714. return tailOperation(CALLPASERSSIGNATURE, parserBaseValue, tailCall, BASEVALUE, CALLBACK,
  715. "Base Value", "Call Back");
  716. }
  717. int getOperation(PASERSSIGNATURE, int right_type, Statement **st, char *name){
  718. *st = NULL;
  719. if (checkToken_(pm, right_type))
  720. goto return_;
  721. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, st, NULL))
  722. return 0;
  723. if (!checkToken_(pm, right_type)){
  724. freeStatement(*st);
  725. return -1;
  726. }
  727. return_:
  728. return 1;
  729. }
  730. /**
  731. * 字面量匹配
  732. * parserBaseValue:
  733. * | MATHER_NUMBER
  734. * | MATHER_STRING
  735. */
  736. void parserBaseValue(PASERSSIGNATURE){
  737. int token_type;
  738. Token *value_token = NULL;
  739. Statement *st = NULL;
  740. token_type = readBackToken(pm);
  741. value_token = popAheadToken(pm);
  742. if (MATHER_NUMBER == token_type){
  743. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get number\n", NULL);
  744. char *stop;
  745. st = makeBaseValueStatement(makeLinkValue(makeNumberValue(strtol(value_token->data.str, &stop, 10), inter), NULL, inter));
  746. }
  747. else if (MATHER_STRING == token_type){
  748. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get string\n", NULL);
  749. st = makeBaseValueStatement(makeLinkValue(makeStringValue(value_token->data.str, inter), NULL, inter));
  750. }
  751. else if (MATHER_VAR == token_type){
  752. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get var\n", NULL);
  753. st = makeBaseVarStatement(value_token->data.str, NULL);
  754. }
  755. else if (MATHER_SVAR == token_type){
  756. Statement *svar_st;
  757. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get super var\n", NULL);
  758. if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &svar_st, NULL)){
  759. freeToken(value_token, true, true);
  760. syntaxError(pm, syntax_error, 1, "Don't get super var after $");
  761. goto return_;
  762. }
  763. st = makeBaseSVarStatement(svar_st, NULL);
  764. }
  765. else if (MATHER_LB == token_type){
  766. int tmp;
  767. Statement *tmp_st = NULL;
  768. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "base value: get operation\n", NULL);
  769. tmp = getOperation(CALLPASERSSIGNATURE, MATHER_RB, &tmp_st, "base value");
  770. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "base value: get operation success\n", NULL);
  771. if (tmp == 0){
  772. freeToken(value_token, true, true);
  773. syntaxError(pm, syntax_error, 1, "Don't get operation from Base Value");
  774. goto return_;
  775. }
  776. else if(tmp == -1){
  777. freeToken(value_token, true, true);
  778. syntaxError(pm, syntax_error, 1, "Don't get ] from list/var");
  779. goto return_;
  780. }
  781. if (MATHER_VAR == readBackToken(pm)){
  782. Token *var_token;
  783. var_token = popAheadToken(pm);
  784. st = makeBaseVarStatement(var_token->data.str, tmp_st);
  785. freeToken(var_token, true, false);
  786. }
  787. else{
  788. if (tmp_st == NULL)
  789. st = makeTupleStatement(NULL, value_list);
  790. else if (tmp_st->type == base_list && tmp_st->u.base_list.type == value_tuple){
  791. tmp_st->u.base_list.type = value_list;
  792. st = tmp_st;
  793. }
  794. else
  795. st = makeTupleStatement(makeOnlyValueParameter(tmp_st), value_list);
  796. }
  797. }
  798. else if (MATHER_LP == token_type){
  799. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "base value: get operation\n", NULL);
  800. int tmp = getOperation(CALLPASERSSIGNATURE, MATHER_RP, &st, "base value");
  801. if (tmp == 0){
  802. freeToken(value_token, true, true);
  803. syntaxError(pm, syntax_error, 1, "Don't get operation from Base Value");
  804. goto return_;
  805. }
  806. else if(tmp == -1){
  807. freeToken(value_token, true, true);
  808. syntaxError(pm, syntax_error, 1, "Don't get ) from Base Value");
  809. goto return_;
  810. }
  811. }
  812. else if (MATHER_LC == token_type){
  813. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "base value: get dict\n", NULL);
  814. Parameter *pt;
  815. if (!parserParameter(CALLPASERSSIGNATURE, &pt, false, false, true, MATHER_COMMA, MATHER_COLON)) {
  816. freeToken(value_token, true, true);
  817. syntaxError(pm, syntax_error, 1, "Don't get a dict parameter");
  818. goto return_;
  819. }
  820. if (!checkToken_(pm, MATHER_RC)) {
  821. freeToken(value_token, true, true);
  822. freeParameter(pt, true);
  823. syntaxError(pm, syntax_error, 1, "Don't get a } after dict");
  824. goto return_;
  825. }
  826. st = makeBaseDictStatement(pt);
  827. }
  828. else{
  829. writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: else\n", NULL);
  830. backToken_(pm, value_token);
  831. goto return_;
  832. }
  833. freeToken(value_token, true, false);
  834. addStatementToken(BASEVALUE, st, pm);
  835. return_:
  836. return;
  837. }