grammar.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003
  1. #include "__grammar.h"
  2. ParserMessage *makeParserMessage(char *file_dir) {
  3. ParserMessage *tmp = memCalloc(1, sizeof(ParserMessage));
  4. tmp->file = file_dir;
  5. tmp->tm = makeTokenMessage(file_dir);
  6. tmp->status = success;
  7. tmp->status_message = NULL;
  8. return tmp;
  9. }
  10. void freeParserMessage(ParserMessage *pm, bool self) {
  11. freeBase(pm, return_);
  12. freeTokenMessage(pm->tm, true, true);
  13. memFree(pm->status_message);
  14. if (self)
  15. memFree(pm);
  16. return_:
  17. return;
  18. }
  19. /**
  20. * 命令表匹配
  21. * parserCommandList :
  22. * | MATHER_EOF
  23. * | MATHER_ENTER
  24. * | MATHER_SEMICOLON
  25. * | parserCommand MATHER_ENTER
  26. * | parserCommand MATHER_SEMICOLON
  27. * | parserCommand MATHER_EOF
  28. */
  29. void parserCommandList(PASERSSIGNATURE, bool global, Statement *st) {
  30. int token_type;
  31. char *command_message = global ? "ERROR from command list(get parserCommand)" : NULL;
  32. while (true){
  33. token_type = readBackToken(pm);
  34. if (token_type == MATHER_EOF){
  35. delToken(pm);
  36. goto return_;
  37. }
  38. else if (token_type == MATHER_ENTER || token_type == MATHER_SEMICOLON){
  39. delToken(pm);
  40. continue;
  41. }
  42. else{
  43. Token *command_token = NULL;
  44. int stop;
  45. if (!callChildToken(CALLPASERSSIGNATURE, parserCommand, COMMAND, &command_token, command_message, command_list_error))
  46. goto return_;
  47. stop = readBackToken(pm);
  48. if (stop == MATHER_ENTER || stop == MATHER_SEMICOLON)
  49. delToken(pm);
  50. else if(stop != MATHER_EOF){
  51. if (global) {
  52. syntaxError(pm, command_list_error, command_token->line, 1, "ERROR from parserCommand list(get stop)");
  53. freeToken(command_token, true, true);
  54. }
  55. else{
  56. connectStatement(st, command_token->data.st);
  57. freeToken(command_token, true, false);
  58. }
  59. goto return_;
  60. }
  61. connectStatement(st, command_token->data.st);
  62. freeToken(command_token, true, false);
  63. }
  64. }
  65. return_: return;
  66. }
  67. /**
  68. * 命令匹配
  69. * parserCommand:
  70. * | MATHER_DEF parserDef
  71. * | MATHER_IF parserIf
  72. * | MATHER_WHILE parserWhile
  73. * | MATHER_TRY parserTry
  74. * | MATHER_BREAK parserControl
  75. * | MATHER_CONTINUE parserControl
  76. * | MATHER_RESTART parserControl
  77. * | MATHER_REGO parserControl
  78. * | MATHER_RETURN parserControl
  79. * | MATHER_RAISE parserControl
  80. * | parserOperation
  81. */
  82. void parserCommand(PASERSSIGNATURE){
  83. int token_type, status;
  84. Statement *st = NULL;
  85. token_type = readBackToken(pm);
  86. switch (token_type) {
  87. case MATHER_NONLOCAL :
  88. case MATHER_GLOBAL :
  89. case MATHER_DEFAULT :
  90. status = commandCallBack_(CALLPASERSSIGNATURE, parserVarControl, VARCONTROL, &st, "Command: call var control\n"); // TODO-szh 取消message
  91. break;
  92. case MATHER_CLASS :
  93. case MATHER_DEF :
  94. status = commandCallBack_(CALLPASERSSIGNATURE, parserDef, FUNCTION, &st, "Command: call def/class\n");
  95. break;
  96. case MATHER_IF :
  97. status = commandCallBack_(CALLPASERSSIGNATURE, parserIf, IF_BRANCH, &st, "Command: call if\n");
  98. break;
  99. case MATHER_WHILE :
  100. status = commandCallBack_(CALLPASERSSIGNATURE, parserWhile, WHILE_BRANCH, &st, "Command: call while\n");
  101. break;
  102. case MATHER_TRY :
  103. status = commandCallBack_(CALLPASERSSIGNATURE, parserTry, TRY_BRANCH, &st, "Command: call try\n");
  104. break;
  105. case MATHER_BREAK :
  106. status = commandCallControl_(CALLPASERSSIGNATURE, makeBreakStatement, BREAK, &st,
  107. "Command: call break\n", false, NULL);
  108. break;
  109. case MATHER_CONTINUE :
  110. status = commandCallControl_(CALLPASERSSIGNATURE, makeContinueStatement, CONTINUE, &st,
  111. "Command: call continue\n", false, NULL);
  112. break;
  113. case MATHER_RESTART :
  114. status = commandCallControl_(CALLPASERSSIGNATURE, makeRestartStatement, RESTART, &st,
  115. "Command: call restart\n", false, NULL);
  116. break;
  117. case MATHER_REGO :
  118. status = commandCallControl_(CALLPASERSSIGNATURE, makeRegoStatement, REGO, &st,
  119. "Command: call rego\n", false, NULL);
  120. break;
  121. case MATHER_RETURN :
  122. status = commandCallControl_(CALLPASERSSIGNATURE, makeReturnStatement, RETURN, &st,
  123. "Command: call return\n", false, NULL);
  124. break;
  125. case MATHER_RAISE :
  126. status = commandCallControl_(CALLPASERSSIGNATURE, makeRaiseStatement, RAISE, &st,
  127. "Command: call raise\n", false, NULL);
  128. case MATHER_ASSERT :
  129. status = commandCallControl_(CALLPASERSSIGNATURE, makeAssertStatement, ASSERT, &st,
  130. "Command: call assert\n", true,
  131. "parserAssert: Don't get conditions after assert");
  132. break;
  133. case MATHER_INCLUDE :
  134. status = commandCallControl_(CALLPASERSSIGNATURE, makeIncludeStatement, INCLUDE, &st,
  135. "Command: call include\n", true,
  136. "parserInclude: Don't get file after include");
  137. break;
  138. case MATHER_FROM :
  139. case MATHER_IMPORT :
  140. status = commandCallBack_(CALLPASERSSIGNATURE, parserImport, IMPORT, &st, "Command: call import\n");
  141. break;
  142. case MATHER_STRING:
  143. case MATHER_NUMBER:
  144. case MATHER_VAR:
  145. case MATHER_SVAR:
  146. case MATHER_LC:
  147. case MATHER_LB:
  148. case MATHER_LP:
  149. case MATHER_SUB:
  150. case MATHER_PROTECT:
  151. case MATHER_PRIVATE:
  152. case MATHER_PUBLIC:
  153. status = commandCallBack_(CALLPASERSSIGNATURE, parserOperation, OPERATION, &st,
  154. "Command: call operation\n");
  155. break;
  156. default:
  157. status = false;
  158. break;
  159. }
  160. if (!status)
  161. goto return_;
  162. addStatementToken(COMMAND, st, pm);
  163. return_: return;
  164. }
  165. /**
  166. * import 匹配
  167. * parserImport
  168. * | parserControl AS parserOperation
  169. * @param callBack statement生成函数
  170. * @param type 输出token的类型
  171. * @param must_operation 必须匹配 operation
  172. */
  173. void parserImport(PASERSSIGNATURE) {
  174. Statement *opt = NULL;
  175. Statement *st = NULL;
  176. int token_type = readBackToken(pm);
  177. long int line = delToken(pm);
  178. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &opt, "Don't get a import file"))
  179. goto return_;
  180. if (token_type == MATHER_IMPORT) {
  181. Statement *as = NULL;
  182. if (checkToken(pm, MATHER_AS) && !callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &as, "Don't get a as after import")) {
  183. freeStatement(opt);
  184. goto return_;
  185. }
  186. st = makeImportStatement(opt, as);
  187. }
  188. else{
  189. Parameter *pt = NULL;
  190. Parameter *as = NULL;
  191. if (!checkToken(pm, MATHER_IMPORT)) {
  192. syntaxError(pm, syntax_error, opt->line, 1, "Don't get a as after import");
  193. freeStatement(opt);
  194. goto return_;
  195. }
  196. if (checkToken(pm, MATHER_MUL)) // 导入所有
  197. goto mul_;
  198. if (!parserParameter(CALLPASERSSIGNATURE, &pt, true, true, true, MATHER_COMMA, MATHER_ASSIGNMENT) || pt == NULL) {
  199. syntaxError(pm, syntax_error, line, 1, "Don't get any value for import");
  200. freeStatement(opt);
  201. goto return_;
  202. }
  203. if (checkToken(pm, MATHER_AS) && (!parserParameter(CALLPASERSSIGNATURE, &as, true, true, false, MATHER_COMMA, MATHER_ASSIGNMENT) || as == NULL)) {
  204. freeParameter(pt, true);
  205. syntaxError(pm, syntax_error, opt->line, 1, "Don't get any value after import");
  206. freeStatement(opt);
  207. goto return_;
  208. }
  209. mul_:
  210. st = makeFromImportStatement(opt, as, pt);
  211. }
  212. addStatementToken(IMPORT, st, pm);
  213. return_:
  214. return;
  215. }
  216. /**
  217. * 控制语句匹配
  218. * parserControl
  219. * | (control token) NULL
  220. * | (control token) parserOperation
  221. * @param callBack statement生成函数
  222. * @param type 输出token的类型
  223. * @param must_operation 必须匹配 operation
  224. */
  225. void parserVarControl(PASERSSIGNATURE) {
  226. Parameter *var = NULL;
  227. Statement *st = NULL;
  228. Token *tmp = NULL;
  229. int token_type = readBackToken(pm);
  230. long int line = delToken(pm);
  231. if (!parserParameter(CALLPASERSSIGNATURE, &var, true, true, true, MATHER_COMMA, MATHER_ASSIGNMENT) || var == NULL) {
  232. syntaxError(pm, syntax_error, line, 1, "Don't get any var");
  233. goto return_;
  234. }
  235. st = makeDefaultVarStatement(var, line, pm->file, token_type == MATHER_DEFAULT ? default_ : token_type == MATHER_GLOBAL ? global_ : nonlocal_);
  236. addStatementToken(VARCONTROL, st, pm);
  237. return_:
  238. return;
  239. }
  240. /**
  241. * 控制语句匹配
  242. * parserControl
  243. * | (control token) NULL
  244. * | (control token) parserOperation
  245. * @param callBack statement生成函数
  246. * @param type 输出token的类型
  247. * @param must_operation 必须匹配 operation
  248. */
  249. void parserControl(PASERSSIGNATURE, MakeControlFunction callBack, int type, bool must_operation, char *message) {
  250. Statement *opt = NULL;
  251. Statement *st = NULL;
  252. Token *tmp = NULL;
  253. long int line = delToken(pm);
  254. parserOperation(CALLPASERSSIGNATURE);
  255. if (!call_success(pm) || readBackToken(pm) != OPERATION && must_operation){
  256. syntaxError(pm, syntax_error, line, 1, message);
  257. goto return_;
  258. }
  259. tmp = popNewToken(pm->tm);
  260. opt = tmp->data.st;
  261. freeToken(tmp, true, false);
  262. st = callBack(opt, line, pm->file);
  263. addStatementToken(type, st, pm);
  264. return_:
  265. return;
  266. }
  267. /**
  268. * 条件分支匹配
  269. * parserIf:
  270. * | MATHER_IF parserOperation (MATHER_AS parserOperation) callParserCode
  271. * | parserIf MATHER_ELIF parserOperation (MATHER_AS parserOperation) callParserCode
  272. * | parserIf MATHER_DO callParserCode [不允许两次连用]
  273. * | parserIf MATHER_ELSE callParserCode [不允许再出现if和elif以及do] [只出现一次] [4]
  274. * | parserIf MATHER_FINALLY callParserCode [结尾]
  275. * 注释:会自动过滤 <ENTER> , 可以使用 <SEMICOLON> 作为结束表示
  276. * 注释:自动添加 <ENTER> 结尾符号
  277. * 注释:(MATHER_AS parserOperation) 表示允许出现或者不出现, 若出现则 MATHER_AS parserOperation 必须一起出现
  278. * 特别注意:自进入模式[4]后,匹配顺序自上而下不可逆
  279. * @param pm
  280. * @param inter
  281. */
  282. void parserIf(PASERSSIGNATURE){
  283. Statement *st = NULL;
  284. Statement *else_st = NULL;
  285. Statement *finally_st = NULL;
  286. StatementList *sl = NULL;
  287. bool have_if = false;
  288. long int line = 0;
  289. again:
  290. switch (readBackToken(pm)) {
  291. case MATHER_IF:
  292. if (have_if)
  293. goto default_;
  294. else
  295. have_if = true;
  296. line = delToken(pm);
  297. goto not_del;
  298. case MATHER_ELIF: {
  299. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  300. long int tmp_line = delToken(pm);
  301. if (else_st != NULL) {
  302. syntaxError(pm, syntax_error, tmp_line, 1, "get elif after else");
  303. goto error_;
  304. }
  305. not_del:
  306. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &condition_tmp,
  307. "Don't get a if condition"))
  308. goto error_;
  309. if (!callParserAs(CALLPASERSSIGNATURE, &var_tmp, "Don't get a while var")) {
  310. freeStatement(condition_tmp);
  311. goto error_;
  312. }
  313. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a if code", tmp_line)) {
  314. freeStatement(condition_tmp);
  315. freeStatement(var_tmp);
  316. goto error_;
  317. }
  318. sl = makeConnectStatementList(sl, condition_tmp, var_tmp, code_tmp, if_b);
  319. goto again;
  320. }
  321. case MATHER_DO: {
  322. if (else_st != NULL)
  323. goto default_;
  324. Statement *code_tmp = NULL;
  325. long int tmp_line = delToken(pm);
  326. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a if...do code", tmp_line))
  327. goto error_;
  328. sl = makeConnectStatementList(sl, NULL, NULL, code_tmp, do_b);
  329. goto again;
  330. }
  331. case MATHER_ELSE: {
  332. long int tmp_line = delToken(pm);
  333. if (else_st != NULL) {
  334. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else");
  335. goto error_;
  336. }
  337. if (!callParserCode(CALLPASERSSIGNATURE, &else_st, "Don't get a if...else code", tmp_line))
  338. goto error_;
  339. goto again;
  340. }
  341. case MATHER_FINALLY: {
  342. long int tmp_line = delToken(pm);
  343. if (!callParserCode(CALLPASERSSIGNATURE, &finally_st, "Don't get a if...else code", tmp_line))
  344. goto error_;
  345. break;
  346. }
  347. case MATHER_ENTER:
  348. delToken(pm);
  349. goto again;
  350. case MATHER_SEMICOLON:
  351. break;
  352. default:{
  353. default_:
  354. addLexToken(pm, MATHER_ENTER);
  355. break;
  356. }
  357. }
  358. st = makeIfStatement(line, pm->file);
  359. st->u.if_branch.if_list = sl;
  360. st->u.if_branch.else_list = else_st;
  361. st->u.if_branch.finally = finally_st;
  362. addStatementToken(IF_BRANCH, st, pm);
  363. return;
  364. error_:
  365. freeStatement(else_st);
  366. freeStatement(finally_st);
  367. freeStatementList(sl);
  368. return;
  369. }
  370. /**
  371. * 条件循环匹配
  372. * parserWhile:
  373. * | MATHER_WHILE parserOperation (MATHER_AS parserOperation) callParserCode
  374. * | parserWhile MATHER_DO callParserCode [只出现一次]
  375. * | parserWhile MATHER_ELSE callParserCode [只出现一次]
  376. * | parserWhile MATHER_FINALLY callParserCode [结尾]
  377. * 注释:同 ``parserIf``
  378. * 特别注意:匹配顺序自上而下不可逆
  379. * @param pm
  380. * @param inter
  381. */
  382. void parserWhile(PASERSSIGNATURE){
  383. Statement *st = NULL;
  384. Statement *else_st = NULL;
  385. Statement *finally_st = NULL;
  386. Statement *do_st = NULL;
  387. StatementList *sl = NULL;
  388. bool have_while = false;
  389. long int line = 0;
  390. again:
  391. switch (readBackToken(pm)) {
  392. case MATHER_WHILE: {
  393. if (have_while)
  394. goto default_;
  395. else
  396. have_while = true;
  397. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  398. line = delToken(pm);
  399. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &condition_tmp, "Don't get a while condition"))
  400. goto error_;
  401. if (!callParserAs(CALLPASERSSIGNATURE, &var_tmp, "Don't get a while var")){
  402. freeStatement(condition_tmp);
  403. goto error_;
  404. }
  405. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a while code", line)) {
  406. freeStatement(condition_tmp);
  407. freeStatement(var_tmp);
  408. goto error_;
  409. }
  410. if (sl != NULL)
  411. freeStatementList(sl);
  412. sl = makeStatementList(condition_tmp, var_tmp, code_tmp, while_b);
  413. goto again;
  414. }
  415. case MATHER_DO: {
  416. if (do_st != NULL || else_st != NULL)
  417. goto default_;
  418. long int tmp_line = delToken(pm);
  419. if (!callParserCode(CALLPASERSSIGNATURE, &do_st, "Don't get a while...do code", tmp_line))
  420. goto error_;
  421. goto again;
  422. }
  423. case MATHER_ELSE: {
  424. long int tmp_line = delToken(pm);
  425. if (else_st != NULL) {
  426. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else\n");
  427. goto error_;
  428. }
  429. if (!callParserCode(CALLPASERSSIGNATURE, &else_st, "Don't get a while...else code", tmp_line))
  430. goto error_;
  431. goto again;
  432. }
  433. case MATHER_FINALLY: {
  434. long int tmp_line = delToken(pm);
  435. if (!callParserCode(CALLPASERSSIGNATURE, &finally_st, "Don't get a while...finally code", tmp_line))
  436. goto error_;
  437. break;
  438. }
  439. case MATHER_ENTER:
  440. delToken(pm);
  441. goto again;
  442. case MATHER_SEMICOLON:
  443. break;
  444. default: {
  445. default_:
  446. addLexToken(pm, MATHER_ENTER);
  447. break;
  448. }
  449. }
  450. st = makeWhileStatement(line, pm->file);
  451. st->u.while_branch.while_list = sl;
  452. st->u.while_branch.else_list = else_st;
  453. st->u.while_branch.finally = finally_st;
  454. st->u.while_branch.after = do_st;
  455. addStatementToken(WHILE_BRANCH, st, pm);
  456. return;
  457. error_:
  458. freeStatement(else_st);
  459. freeStatement(finally_st);
  460. freeStatement(do_st);
  461. freeStatementList(sl);
  462. return;
  463. }
  464. /**
  465. * 异常捕获分支匹配
  466. * parserTry:
  467. * | MATHER_TRY callParserCode
  468. * | parserTry MATHER_EXCEPT (MATHER_AS parserOperation) callParserCode
  469. * | parserTry MATHER_ELSE callParserCode [只出现一次]
  470. * | parserTry MATHER_FINALLY callParserCode [结尾]
  471. * 注释:同 ``parserIf``
  472. * 特别注意:匹配顺序自上而下不可逆
  473. * @param pm
  474. * @param inter
  475. */
  476. void parserTry(PASERSSIGNATURE){
  477. Statement *st = NULL;
  478. Statement *try_st = NULL;
  479. Statement *else_st = NULL;
  480. Statement *finally_st = NULL;
  481. StatementList *sl = NULL;
  482. long int line = 0;
  483. again:
  484. switch (readBackToken(pm)) {
  485. case MATHER_TRY:{
  486. if (try_st != NULL)
  487. goto default_;
  488. line = delToken(pm);
  489. if (!callParserCode(CALLPASERSSIGNATURE, &try_st, "Don't get a try code", line))
  490. goto error_;
  491. goto again;
  492. }
  493. case MATHER_EXCEPT: {
  494. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  495. long int tmp_line = delToken(pm);
  496. if (else_st != NULL) {
  497. syntaxError(pm, syntax_error, tmp_line, 1, "get except after else");
  498. goto error_;
  499. }
  500. if (readBackToken(pm) != MATHER_LC)
  501. callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &condition_tmp, NULL);
  502. if (!callParserAs(CALLPASERSSIGNATURE, &var_tmp, "Don't get a except var")){
  503. freeStatement(condition_tmp);
  504. goto error_;
  505. }
  506. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a except code", tmp_line)) {
  507. freeStatement(condition_tmp);
  508. freeStatement(var_tmp);
  509. goto error_;
  510. }
  511. sl = makeConnectStatementList(sl, condition_tmp, var_tmp, code_tmp, except_b);
  512. goto again;
  513. }
  514. case MATHER_ELSE: {
  515. long int tmp_line = delToken(pm);
  516. if (else_st != NULL) {
  517. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else");
  518. goto error_;
  519. }
  520. if (!callParserCode(CALLPASERSSIGNATURE, &else_st, "Don't get a try...else code", tmp_line))
  521. goto error_;
  522. goto again;
  523. }
  524. case MATHER_FINALLY: {
  525. long int tmp_line = delToken(pm);
  526. if (!callParserCode(CALLPASERSSIGNATURE, &finally_st, "Don't get a try...finally code", tmp_line))
  527. goto error_;
  528. break;
  529. }
  530. case MATHER_ENTER:
  531. delToken(pm);
  532. goto again;
  533. case MATHER_SEMICOLON:
  534. break;
  535. default: {
  536. default_:
  537. addLexToken(pm, MATHER_ENTER);
  538. break;
  539. }
  540. }
  541. st = makeTryStatement(line, pm->file);
  542. st->u.try_branch.try = try_st;
  543. st->u.try_branch.except_list = sl;
  544. st->u.try_branch.else_list = else_st;
  545. st->u.try_branch.finally = finally_st;
  546. addStatementToken(TRY_BRANCH, st, pm);
  547. return;
  548. error_:
  549. freeStatement(try_st);
  550. freeStatement(else_st);
  551. freeStatement(finally_st);
  552. freeStatementList(sl);
  553. return;
  554. }
  555. /**
  556. * 函数定义匹配
  557. * parserDef:
  558. * | parserBaseValue MATHER_LP parserParameter(is_formal) MATHER_RP callParserCode
  559. * 注释:自动添加 <ENTER> 结尾符号
  560. * @param pm
  561. * @param inter
  562. */
  563. void parserDef(PASERSSIGNATURE){
  564. Statement *st = NULL;
  565. Statement *name_tmp = NULL;
  566. Statement *code_tmp = NULL;
  567. Parameter *pt = NULL;
  568. int type = readBackToken(pm);
  569. long int line = delToken(pm);
  570. if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &name_tmp,
  571. "Don't get a function/class name"))
  572. goto error_;
  573. if (!checkToken(pm, MATHER_LP)) {
  574. syntaxError(pm, syntax_error, line, 1, "Don't get a function/class ( before parameter");
  575. goto error_;
  576. }
  577. if (!parserParameter(CALLPASERSSIGNATURE, &pt, true, false, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  578. syntaxError(pm, syntax_error, line, 1, "Don't get a function/class parameter");
  579. goto error_;
  580. }
  581. if (!checkToken(pm, MATHER_RP)) {
  582. syntaxError(pm, syntax_error, line, 1, "Don't get a function/class ) after parameter");
  583. goto error_;
  584. }
  585. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a function code", line)) {
  586. syntaxError(pm, syntax_error, line, 1, "Don't get a function code");
  587. goto error_;
  588. }
  589. if (type == MATHER_DEF)
  590. st = makeFunctionStatement(name_tmp, code_tmp, pt);
  591. else
  592. st = makeClassStatement(name_tmp, code_tmp, pt);
  593. addLexToken(pm, MATHER_ENTER);
  594. addStatementToken(FUNCTION, st, pm);
  595. return;
  596. error_:
  597. freeStatement(name_tmp);
  598. freeStatement(code_tmp);
  599. freeParameter(pt, true);
  600. return;
  601. }
  602. /**
  603. * 函数定义匹配
  604. * parserCode:
  605. * | MATHER_LC parserCommandList MATHER_RC
  606. * 注释:自动忽略MATHER_LC前的空格
  607. * @param pm
  608. * @param inter
  609. */
  610. void parserCode(PASERSSIGNATURE) {
  611. long int line = 0;
  612. Statement *st = makeStatement(line, pm->file);
  613. while (true){
  614. if (readBackToken(pm) != MATHER_LC)
  615. goto again_;
  616. line = delToken(pm);
  617. break;
  618. again_:
  619. if (!checkToken(pm, MATHER_ENTER))
  620. goto return_;
  621. }
  622. parserCommandList(CALLPASERSSIGNATURE, false, st);
  623. if (!call_success(pm))
  624. goto error_;
  625. if (!checkToken(pm, MATHER_RC)) {
  626. syntaxError(pm, syntax_error, line, 1, "Don't get the }"); // 使用{的行号
  627. goto error_;
  628. }
  629. return_:
  630. addStatementToken(CODE, st, pm);
  631. return;
  632. error_:
  633. freeStatement(st);
  634. return;
  635. }
  636. /**
  637. * 表达式匹配
  638. * parserOperation:
  639. * | parserAssignment
  640. */
  641. void parserOperation(PASERSSIGNATURE){
  642. Statement *operation_st = NULL;
  643. if (!callChildStatement(CALLPASERSSIGNATURE, parserAssignment, ASSIGNMENT, &operation_st, NULL))
  644. goto return_;
  645. addStatementToken(OPERATION, operation_st, pm);
  646. return_:
  647. return;
  648. }
  649. /**
  650. * 赋值表达式匹配
  651. * parserAssignment:
  652. * | parserTuple
  653. * | parserAssignment ASSIGNMENT parserTuple [2]
  654. * 注意:在链接statement的时候, 模式[2]相当于 parserTuple ASSIGNMENT parserAssignment
  655. */
  656. bool switchAssignment(PASERSSIGNATURE, int symbol, Statement **st){
  657. switch (symbol) {
  658. case MATHER_ASSIGNMENT:
  659. *st = makeOperationBaseStatement(OPT_ASS, 0, pm->file);
  660. break;
  661. default:
  662. return false;
  663. }
  664. return true;
  665. }
  666. void parserAssignment(PASERSSIGNATURE){
  667. return twoOperation(CALLPASERSSIGNATURE, parserTuple, switchAssignment, TUPLE, ASSIGNMENT,
  668. "polynomial", "assignment", true);
  669. }
  670. /**
  671. * 元组匹配
  672. * parserTuple:
  673. * | parserPolynomial
  674. * | parserTuple COMMA parserPolynomial
  675. * @param pm
  676. * @param inter
  677. */
  678. void parserTuple(PASERSSIGNATURE){
  679. Parameter *pt = NULL;
  680. Statement *st = NULL;
  681. Token *tmp = NULL;
  682. long int line = 0;
  683. if (readBackToken(pm) == MATHER_MUL) {
  684. line = pm->tm->ts->token_list->line;
  685. goto parserPt;
  686. }
  687. if (!callChildToken(CALLPASERSSIGNATURE, parserPolynomial, POLYNOMIAL, &tmp, NULL, syntax_error))
  688. goto return_;
  689. if (readBackToken(pm) != MATHER_COMMA){
  690. tmp->token_type = TUPLE;
  691. addToken_(pm ,tmp);
  692. goto return_;
  693. }
  694. line = tmp->line;
  695. addToken_(pm ,tmp);
  696. parserPt:
  697. if (!parserParameter(CALLPASERSSIGNATURE, &pt, false, true, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  698. syntaxError(pm, syntax_error, line, 1, "Don't get tuple element");
  699. goto return_;
  700. }
  701. st = makeTupleStatement(pt, value_tuple, pt->data.value->line, pm->file);
  702. addStatementToken(TUPLE, st, pm);
  703. return_:
  704. return;
  705. }
  706. /**
  707. * 多项式匹配
  708. * parserPolynomial:
  709. * | parserBaseValue
  710. * | parserPolynomial OPT_ADD parserFactor
  711. * | parserPolynomial OPT_SUB parserFactor
  712. */
  713. bool switchPolynomial(PASERSSIGNATURE, int symbol, Statement **st){
  714. switch (symbol) {
  715. case MATHER_ADD:
  716. *st = makeOperationBaseStatement(OPT_ADD, 0, pm->file);
  717. break;
  718. case MATHER_SUB:
  719. *st = makeOperationBaseStatement(OPT_SUB, 0, pm->file);
  720. break;
  721. default:
  722. return false;
  723. }
  724. return true;
  725. }
  726. void parserPolynomial(PASERSSIGNATURE){
  727. return twoOperation(CALLPASERSSIGNATURE, parserFactor, switchPolynomial, FACTOR, POLYNOMIAL,
  728. "factor", "polynomial", false);
  729. }
  730. /**
  731. * 因式匹配
  732. * parserFactor:
  733. * | parserCallBack
  734. * | switchFactor OPT_ADD parserCallBack
  735. * | switchFactor OPT_SUB parserCallBack
  736. */
  737. bool switchFactor(PASERSSIGNATURE, int symbol, Statement **st){
  738. switch (symbol) {
  739. case MATHER_MUL:
  740. *st = makeOperationBaseStatement(OPT_MUL, 0, pm->file);
  741. break;
  742. case MATHER_DIV:
  743. *st = makeOperationBaseStatement(OPT_DIV, 0, pm->file);
  744. break;
  745. default:
  746. return false;
  747. }
  748. return true;
  749. }
  750. void parserFactor(PASERSSIGNATURE){
  751. return twoOperation(CALLPASERSSIGNATURE, parserCallBack, switchFactor, CALLBACK, FACTOR,
  752. "call back", "factor", false);
  753. }
  754. /**
  755. * 函数回调匹配
  756. * parserCallBack:
  757. * | parserBaseValue
  758. * | parserCallBack MATHER_LP parserParameter MATHER_RP
  759. */
  760. int tailCall(PASERSSIGNATURE, Token *left_token, Statement **st){
  761. Parameter *pt = NULL;
  762. if (readBackToken(pm) != MATHER_LP)
  763. return -1;
  764. long int line = delToken(pm);
  765. if (checkToken(pm, MATHER_RP))
  766. goto not_pt;
  767. if (!parserParameter(CALLPASERSSIGNATURE, &pt, false, false, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  768. syntaxError(pm, syntax_error, line, 1, "Don't get call parameter");
  769. return 0;
  770. }
  771. if (!checkToken(pm, MATHER_RP)){
  772. freeParameter(pt, true);
  773. syntaxError(pm, syntax_error, line, 1, "Don't get ) from call back");
  774. return 0;
  775. }
  776. not_pt:
  777. *st = makeCallStatement(left_token->data.st, pt);
  778. return 1;
  779. }
  780. void parserCallBack(PASERSSIGNATURE){
  781. return tailOperation(CALLPASERSSIGNATURE, parserPoint, tailCall, POINT, CALLBACK,
  782. "point", "call back");
  783. }
  784. /**
  785. * 成员运算符匹配
  786. * parserPoint:
  787. * | parserBaseValue
  788. * | parserBaseValue POINT parserPoint
  789. */
  790. bool switchPoint(PASERSSIGNATURE, int symbol, Statement **st){
  791. switch (symbol) {
  792. case MATHER_POINT:
  793. *st = makeOperationBaseStatement(OPT_POINT, 0, pm->file);
  794. break;
  795. default:
  796. return false;
  797. }
  798. return true;
  799. }
  800. void parserPoint(PASERSSIGNATURE){
  801. return twoOperation(CALLPASERSSIGNATURE, parserBaseValue, switchPoint, BASEVALUE, POINT,
  802. "base value", "point", false);
  803. }
  804. /**
  805. * 字面量匹配
  806. * parserBaseValue:
  807. * | MATHER_NUMBER
  808. * | MATHER_STRING
  809. */
  810. int getOperation(PASERSSIGNATURE, int right_type, Statement **st, char *name){
  811. *st = NULL;
  812. if (checkToken(pm, right_type))
  813. goto return_;
  814. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, st, NULL))
  815. return 0;
  816. if (!checkToken(pm, right_type)){
  817. freeStatement(*st);
  818. return -1;
  819. }
  820. return_:
  821. return 1;
  822. }
  823. void parserBaseValue(PASERSSIGNATURE){
  824. Token *value_token = popNewToken(pm->tm);
  825. Statement *st = NULL;
  826. if (MATHER_NUMBER == value_token->token_type){
  827. st = makeBaseStrValueStatement(value_token->data.str, number_str, value_token->line, pm->file);
  828. }
  829. else if (MATHER_STRING == value_token->token_type){
  830. Value *tmp_value = makeStringValue(value_token->data.str, inter);
  831. st = makeBaseStrValueStatement(value_token->data.str, string_str, value_token->line, pm->file);
  832. }
  833. else if (MATHER_VAR == value_token->token_type){
  834. st = makeBaseVarStatement(value_token->data.str, NULL, value_token->line, pm->file);
  835. }
  836. else if (MATHER_SVAR == value_token->token_type){
  837. Statement *svar_st = NULL;
  838. if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &svar_st, NULL)){
  839. freeToken(value_token, true, true);
  840. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get super var after $");
  841. goto return_;
  842. }
  843. st = makeBaseSVarStatement(svar_st, NULL);
  844. }
  845. else if (MATHER_LB == value_token->token_type){
  846. int tmp;
  847. Statement *tmp_st = NULL;
  848. tmp = getOperation(CALLPASERSSIGNATURE, MATHER_RB, &tmp_st, "base value");
  849. if (tmp == 0){
  850. freeToken(value_token, true, true);
  851. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get operation from Base Value");
  852. goto return_;
  853. }
  854. else if(tmp == -1){
  855. freeToken(value_token, true, true);
  856. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get ] from list/var");
  857. goto return_;
  858. }
  859. if (MATHER_VAR == readBackToken(pm)){
  860. Token *var_token;
  861. var_token = popNewToken(pm->tm);
  862. st = makeBaseVarStatement(var_token->data.str, tmp_st, var_token->line, pm->file);
  863. freeToken(var_token, true, false);
  864. }
  865. else{
  866. if (tmp_st == NULL)
  867. st = makeTupleStatement(NULL, value_list, value_token->line, pm->file);
  868. else if (tmp_st->type == base_list && tmp_st->u.base_list.type == value_tuple){
  869. tmp_st->u.base_list.type = value_list;
  870. st = tmp_st;
  871. }
  872. else
  873. st = makeTupleStatement(makeValueParameter(tmp_st), value_list, value_token->token_type, pm->file);
  874. }
  875. }
  876. else if (MATHER_LP == value_token->token_type){
  877. int tmp = getOperation(CALLPASERSSIGNATURE, MATHER_RP, &st, "base value");
  878. if (tmp == 0){
  879. freeToken(value_token, true, true);
  880. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get operation from Base Value");
  881. goto return_;
  882. }
  883. else if(tmp == -1){
  884. freeToken(value_token, true, true);
  885. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get ) from Base Value");
  886. goto return_;
  887. }
  888. }
  889. else if (MATHER_LC == value_token->token_type){
  890. Parameter *pt = NULL;
  891. if (!parserParameter(CALLPASERSSIGNATURE, &pt, false, false, true, MATHER_COMMA, MATHER_COLON)) {
  892. freeToken(value_token, true, true);
  893. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a dict parameter");
  894. goto return_;
  895. }
  896. if (!checkToken(pm, MATHER_RC)) {
  897. freeToken(value_token, true, true);
  898. freeParameter(pt, true);
  899. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a } after dict");
  900. goto return_;
  901. }
  902. st = makeBaseDictStatement(pt, value_token->line, pm->file);
  903. }
  904. else if (MATHER_BLOCK == value_token->token_type){
  905. Statement *block = NULL;
  906. if (!callParserCode(CALLPASERSSIGNATURE, &block, "Don't get a while code", value_token->line)) {
  907. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get block command");
  908. freeToken(value_token, true, true);
  909. goto return_;
  910. }
  911. st = makeOperationStatement(OPT_BLOCK, block, NULL);
  912. }
  913. else if (MATHER_PROTECT == value_token->token_type || MATHER_PRIVATE == value_token->token_type || MATHER_PUBLIC == value_token->token_type){
  914. if (MATHER_COLON != readBackToken(pm)){
  915. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a : after aut token");
  916. freeToken(value_token, true, true);
  917. goto return_;
  918. }
  919. delToken(pm);
  920. if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &st, "Don't get Base Value after aut token")){
  921. freeToken(value_token, true, true);
  922. goto return_;
  923. }
  924. switch (value_token->token_type) {
  925. case MATHER_PROTECT:
  926. st->aut = protect_aut;
  927. break;
  928. case MATHER_PRIVATE:
  929. st->aut = private_aut;
  930. break;
  931. case MATHER_PUBLIC:
  932. st->aut = public_aut;
  933. break;
  934. }
  935. }
  936. else{
  937. backToken_(pm, value_token);
  938. goto return_;
  939. }
  940. freeToken(value_token, true, false);
  941. addStatementToken(BASEVALUE, st, pm);
  942. return_:
  943. return;
  944. }