grammar.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040
  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, "Don't get a if condition"))
  307. goto error_;
  308. if (!callParserAs(CALLPASERSSIGNATURE, &var_tmp, "Don't get a while var")) {
  309. freeStatement(condition_tmp);
  310. goto error_;
  311. }
  312. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a if code", tmp_line)) {
  313. freeStatement(condition_tmp);
  314. freeStatement(var_tmp);
  315. goto error_;
  316. }
  317. sl = makeConnectStatementList(sl, condition_tmp, var_tmp, code_tmp, if_b);
  318. goto again;
  319. }
  320. case MATHER_DO: {
  321. if (else_st != NULL)
  322. goto default_;
  323. Statement *code_tmp = NULL;
  324. long int tmp_line = delToken(pm);
  325. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a if...do code", tmp_line))
  326. goto error_;
  327. sl = makeConnectStatementList(sl, NULL, NULL, code_tmp, do_b);
  328. goto again;
  329. }
  330. case MATHER_ELSE: {
  331. long int tmp_line = delToken(pm);
  332. if (else_st != NULL) {
  333. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else");
  334. goto error_;
  335. }
  336. if (!callParserCode(CALLPASERSSIGNATURE, &else_st, "Don't get a if...else code", tmp_line))
  337. goto error_;
  338. goto again;
  339. }
  340. case MATHER_FINALLY: {
  341. long int tmp_line = delToken(pm);
  342. if (!callParserCode(CALLPASERSSIGNATURE, &finally_st, "Don't get a if...else code", tmp_line))
  343. goto error_;
  344. break;
  345. }
  346. case MATHER_ENTER:
  347. delToken(pm);
  348. goto again;
  349. case MATHER_SEMICOLON:
  350. break;
  351. default:{
  352. default_:
  353. addLexToken(pm, MATHER_ENTER);
  354. break;
  355. }
  356. }
  357. st = makeIfStatement(line, pm->file);
  358. st->u.if_branch.if_list = sl;
  359. st->u.if_branch.else_list = else_st;
  360. st->u.if_branch.finally = finally_st;
  361. addStatementToken(IF_BRANCH, st, pm);
  362. return;
  363. error_:
  364. freeStatement(else_st);
  365. freeStatement(finally_st);
  366. freeStatementList(sl);
  367. return;
  368. }
  369. /**
  370. * 条件循环匹配
  371. * parserWhile:
  372. * | MATHER_WHILE parserOperation (MATHER_AS parserOperation) callParserCode
  373. * | parserWhile MATHER_DO callParserCode [只出现一次]
  374. * | parserWhile MATHER_ELSE callParserCode [只出现一次]
  375. * | parserWhile MATHER_FINALLY callParserCode [结尾]
  376. * 注释:同 ``parserIf``
  377. * 特别注意:匹配顺序自上而下不可逆
  378. * @param pm
  379. * @param inter
  380. */
  381. void parserWhile(PASERSSIGNATURE){
  382. Statement *st = NULL;
  383. Statement *else_st = NULL;
  384. Statement *finally_st = NULL;
  385. Statement *do_st = NULL;
  386. StatementList *sl = NULL;
  387. bool have_while = false;
  388. long int line = 0;
  389. again:
  390. switch (readBackToken(pm)) {
  391. case MATHER_WHILE: {
  392. if (have_while)
  393. goto default_;
  394. else
  395. have_while = true;
  396. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  397. line = delToken(pm);
  398. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &condition_tmp, "Don't get a while condition"))
  399. goto error_;
  400. if (!callParserAs(CALLPASERSSIGNATURE, &var_tmp, "Don't get a while var")){
  401. freeStatement(condition_tmp);
  402. goto error_;
  403. }
  404. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a while code", line)) {
  405. freeStatement(condition_tmp);
  406. freeStatement(var_tmp);
  407. goto error_;
  408. }
  409. if (sl != NULL)
  410. freeStatementList(sl);
  411. sl = makeStatementList(condition_tmp, var_tmp, code_tmp, while_b);
  412. goto again;
  413. }
  414. case MATHER_DO: {
  415. if (do_st != NULL || else_st != NULL)
  416. goto default_;
  417. long int tmp_line = delToken(pm);
  418. if (!callParserCode(CALLPASERSSIGNATURE, &do_st, "Don't get a while...do code", tmp_line))
  419. goto error_;
  420. goto again;
  421. }
  422. case MATHER_ELSE: {
  423. long int tmp_line = delToken(pm);
  424. if (else_st != NULL) {
  425. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else\n");
  426. goto error_;
  427. }
  428. if (!callParserCode(CALLPASERSSIGNATURE, &else_st, "Don't get a while...else code", tmp_line))
  429. goto error_;
  430. goto again;
  431. }
  432. case MATHER_FINALLY: {
  433. long int tmp_line = delToken(pm);
  434. if (!callParserCode(CALLPASERSSIGNATURE, &finally_st, "Don't get a while...finally code", tmp_line))
  435. goto error_;
  436. break;
  437. }
  438. case MATHER_ENTER:
  439. delToken(pm);
  440. goto again;
  441. case MATHER_SEMICOLON:
  442. break;
  443. default: {
  444. default_:
  445. addLexToken(pm, MATHER_ENTER);
  446. break;
  447. }
  448. }
  449. st = makeWhileStatement(line, pm->file);
  450. st->u.while_branch.while_list = sl;
  451. st->u.while_branch.else_list = else_st;
  452. st->u.while_branch.finally = finally_st;
  453. st->u.while_branch.after = do_st;
  454. addStatementToken(WHILE_BRANCH, st, pm);
  455. return;
  456. error_:
  457. freeStatement(else_st);
  458. freeStatement(finally_st);
  459. freeStatement(do_st);
  460. freeStatementList(sl);
  461. return;
  462. }
  463. /**
  464. * 异常捕获分支匹配
  465. * parserTry:
  466. * | MATHER_TRY callParserCode
  467. * | parserTry MATHER_EXCEPT (MATHER_AS parserOperation) callParserCode
  468. * | parserTry MATHER_ELSE callParserCode [只出现一次]
  469. * | parserTry MATHER_FINALLY callParserCode [结尾]
  470. * 注释:同 ``parserIf``
  471. * 特别注意:匹配顺序自上而下不可逆
  472. * @param pm
  473. * @param inter
  474. */
  475. void parserTry(PASERSSIGNATURE){
  476. Statement *st = NULL;
  477. Statement *try_st = NULL;
  478. Statement *else_st = NULL;
  479. Statement *finally_st = NULL;
  480. StatementList *sl = NULL;
  481. long int line = 0;
  482. again:
  483. switch (readBackToken(pm)) {
  484. case MATHER_TRY:{
  485. if (try_st != NULL)
  486. goto default_;
  487. line = delToken(pm);
  488. if (!callParserCode(CALLPASERSSIGNATURE, &try_st, "Don't get a try code", line))
  489. goto error_;
  490. goto again;
  491. }
  492. case MATHER_EXCEPT: {
  493. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  494. long int tmp_line = delToken(pm);
  495. if (else_st != NULL) {
  496. syntaxError(pm, syntax_error, tmp_line, 1, "get except after else");
  497. goto error_;
  498. }
  499. if (readBackToken(pm) != MATHER_LC)
  500. callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &condition_tmp, NULL);
  501. if (!callParserAs(CALLPASERSSIGNATURE, &var_tmp, "Don't get a except var")){
  502. freeStatement(condition_tmp);
  503. goto error_;
  504. }
  505. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a except code", tmp_line)) {
  506. freeStatement(condition_tmp);
  507. freeStatement(var_tmp);
  508. goto error_;
  509. }
  510. sl = makeConnectStatementList(sl, condition_tmp, var_tmp, code_tmp, except_b);
  511. goto again;
  512. }
  513. case MATHER_ELSE: {
  514. long int tmp_line = delToken(pm);
  515. if (else_st != NULL) {
  516. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else");
  517. goto error_;
  518. }
  519. if (!callParserCode(CALLPASERSSIGNATURE, &else_st, "Don't get a try...else code", tmp_line))
  520. goto error_;
  521. goto again;
  522. }
  523. case MATHER_FINALLY: {
  524. long int tmp_line = delToken(pm);
  525. if (!callParserCode(CALLPASERSSIGNATURE, &finally_st, "Don't get a try...finally code", tmp_line))
  526. goto error_;
  527. break;
  528. }
  529. case MATHER_ENTER:
  530. delToken(pm);
  531. goto again;
  532. case MATHER_SEMICOLON:
  533. break;
  534. default: {
  535. default_:
  536. addLexToken(pm, MATHER_ENTER);
  537. break;
  538. }
  539. }
  540. st = makeTryStatement(line, pm->file);
  541. st->u.try_branch.try = try_st;
  542. st->u.try_branch.except_list = sl;
  543. st->u.try_branch.else_list = else_st;
  544. st->u.try_branch.finally = finally_st;
  545. addStatementToken(TRY_BRANCH, st, pm);
  546. return;
  547. error_:
  548. freeStatement(try_st);
  549. freeStatement(else_st);
  550. freeStatement(finally_st);
  551. freeStatementList(sl);
  552. return;
  553. }
  554. /**
  555. * 函数定义匹配
  556. * parserDef:
  557. * | parserBaseValue MATHER_LP parserParameter(is_formal) MATHER_RP callParserCode
  558. * 注释:自动添加 <ENTER> 结尾符号
  559. * @param pm
  560. * @param inter
  561. */
  562. void parserDef(PASERSSIGNATURE){
  563. Statement *st = NULL;
  564. Statement *name_tmp = NULL;
  565. Statement *code_tmp = NULL;
  566. Parameter *pt = NULL;
  567. int type = readBackToken(pm);
  568. long int line = delToken(pm);
  569. if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &name_tmp,
  570. "Don't get a function/class name"))
  571. goto error_;
  572. if (!checkToken(pm, MATHER_LP)) {
  573. syntaxError(pm, syntax_error, line, 1, "Don't get a function/class ( before parameter");
  574. goto error_;
  575. }
  576. if (!parserParameter(CALLPASERSSIGNATURE, &pt, true, false, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  577. syntaxError(pm, syntax_error, line, 1, "Don't get a function/class parameter");
  578. goto error_;
  579. }
  580. if (!checkToken(pm, MATHER_RP)) {
  581. syntaxError(pm, syntax_error, line, 1, "Don't get a function/class ) after parameter");
  582. goto error_;
  583. }
  584. if (!callParserCode(CALLPASERSSIGNATURE, &code_tmp, "Don't get a function code", line)) {
  585. syntaxError(pm, syntax_error, line, 1, "Don't get a function code");
  586. goto error_;
  587. }
  588. if (type == MATHER_DEF)
  589. st = makeFunctionStatement(name_tmp, code_tmp, pt);
  590. else
  591. st = makeClassStatement(name_tmp, code_tmp, pt);
  592. addLexToken(pm, MATHER_ENTER);
  593. addStatementToken(FUNCTION, st, pm);
  594. return;
  595. error_:
  596. freeStatement(name_tmp);
  597. freeStatement(code_tmp);
  598. freeParameter(pt, true);
  599. return;
  600. }
  601. /**
  602. * 函数定义匹配
  603. * parserCode:
  604. * | MATHER_LC parserCommandList MATHER_RC
  605. * 注释:自动忽略MATHER_LC前的空格
  606. * @param pm
  607. * @param inter
  608. */
  609. void parserCode(PASERSSIGNATURE) {
  610. long int line = 0;
  611. Statement *st = makeStatement(line, pm->file);
  612. while (true){
  613. if (readBackToken(pm) != MATHER_LC)
  614. goto again_;
  615. line = delToken(pm);
  616. break;
  617. again_:
  618. if (!checkToken(pm, MATHER_ENTER))
  619. goto return_;
  620. }
  621. parserCommandList(CALLPASERSSIGNATURE, false, st);
  622. if (!call_success(pm))
  623. goto error_;
  624. if (!checkToken(pm, MATHER_RC)) {
  625. syntaxError(pm, syntax_error, line, 1, "Don't get the }"); // 使用{的行号
  626. goto error_;
  627. }
  628. return_:
  629. addStatementToken(CODE, st, pm);
  630. return;
  631. error_:
  632. freeStatement(st);
  633. return;
  634. }
  635. /**
  636. * 表达式匹配
  637. * parserOperation:
  638. * | parserAssignment
  639. */
  640. void parserOperation(PASERSSIGNATURE){
  641. Statement *operation_st = NULL;
  642. if (!callChildStatement(CALLPASERSSIGNATURE, parserAssignment, ASSIGNMENT, &operation_st, NULL))
  643. goto return_;
  644. addStatementToken(OPERATION, operation_st, pm);
  645. return_:
  646. return;
  647. }
  648. /**
  649. * 赋值表达式匹配
  650. * parserAssignment:
  651. * | parserTuple
  652. * | parserAssignment ASSIGNMENT parserTuple [2]
  653. * 注意:在链接statement的时候, 模式[2]相当于 parserTuple ASSIGNMENT parserAssignment
  654. */
  655. bool switchAssignment(PASERSSIGNATURE, int symbol, Statement **st){
  656. switch (symbol) {
  657. case MATHER_ASSIGNMENT:
  658. *st = makeOperationBaseStatement(OPT_ASS, 0, pm->file);
  659. break;
  660. default:
  661. return false;
  662. }
  663. return true;
  664. }
  665. void parserAssignment(PASERSSIGNATURE){
  666. return twoOperation(CALLPASERSSIGNATURE, parserTuple, switchAssignment, TUPLE, ASSIGNMENT,
  667. "polynomial", "assignment", true);
  668. }
  669. /**
  670. * 元组匹配
  671. * parserTuple:
  672. * | parserPolynomial
  673. * | parserTuple COMMA parserPolynomial
  674. * @param pm
  675. * @param inter
  676. */
  677. void parserTuple(PASERSSIGNATURE){
  678. Parameter *pt = NULL;
  679. Statement *st = NULL;
  680. Token *tmp = NULL;
  681. long int line = 0;
  682. if (readBackToken(pm) == MATHER_MUL) {
  683. line = pm->tm->ts->token_list->line;
  684. goto parserPt;
  685. }
  686. if (!callChildToken(CALLPASERSSIGNATURE, parserPolynomial, POLYNOMIAL, &tmp, NULL, syntax_error))
  687. goto return_;
  688. if (readBackToken(pm) != MATHER_COMMA){
  689. tmp->token_type = TUPLE;
  690. addToken_(pm ,tmp);
  691. goto return_;
  692. }
  693. line = tmp->line;
  694. addToken_(pm ,tmp);
  695. parserPt:
  696. if (!parserParameter(CALLPASERSSIGNATURE, &pt, false, true, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  697. syntaxError(pm, syntax_error, line, 1, "Don't get tuple element");
  698. goto return_;
  699. }
  700. st = makeTupleStatement(pt, value_tuple, pt->data.value->line, pm->file);
  701. addStatementToken(TUPLE, st, pm);
  702. return_:
  703. return;
  704. }
  705. /**
  706. * 多项式匹配
  707. * parserPolynomial:
  708. * | parserBaseValue
  709. * | parserPolynomial OPT_ADD parserFactor
  710. * | parserPolynomial OPT_SUB parserFactor
  711. */
  712. bool switchPolynomial(PASERSSIGNATURE, int symbol, Statement **st){
  713. switch (symbol) {
  714. case MATHER_ADD:
  715. *st = makeOperationBaseStatement(OPT_ADD, 0, pm->file);
  716. break;
  717. case MATHER_SUB:
  718. *st = makeOperationBaseStatement(OPT_SUB, 0, pm->file);
  719. break;
  720. default:
  721. return false;
  722. }
  723. return true;
  724. }
  725. void parserPolynomial(PASERSSIGNATURE){
  726. return twoOperation(CALLPASERSSIGNATURE, parserFactor, switchPolynomial, FACTOR, POLYNOMIAL,
  727. "factor", "polynomial", false);
  728. }
  729. /**
  730. * 因式匹配
  731. * parserFactor:
  732. * | parserCallBack
  733. * | switchFactor OPT_ADD parserCallBack
  734. * | switchFactor OPT_SUB parserCallBack
  735. */
  736. bool switchFactor(PASERSSIGNATURE, int symbol, Statement **st){
  737. switch (symbol) {
  738. case MATHER_MUL:
  739. *st = makeOperationBaseStatement(OPT_MUL, 0, pm->file);
  740. break;
  741. case MATHER_DIV:
  742. *st = makeOperationBaseStatement(OPT_DIV, 0, pm->file);
  743. break;
  744. default:
  745. return false;
  746. }
  747. return true;
  748. }
  749. void parserFactor(PASERSSIGNATURE){
  750. return twoOperation(CALLPASERSSIGNATURE, parserCallBack, switchFactor, CALLBACK, FACTOR,
  751. "call back", "factor", false);
  752. }
  753. /**
  754. * 函数回调匹配
  755. * parserCallBack:
  756. * | parserBaseValue
  757. * | parserCallBack MATHER_LP parserParameter MATHER_RP
  758. */
  759. int tailCall(PASERSSIGNATURE, Token *left_token, Statement **st){
  760. Parameter *pt = NULL;
  761. if (readBackToken(pm) != MATHER_LP)
  762. return -1;
  763. long int line = delToken(pm);
  764. if (checkToken(pm, MATHER_RP))
  765. goto not_pt;
  766. if (!parserParameter(CALLPASERSSIGNATURE, &pt, false, false, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  767. syntaxError(pm, syntax_error, line, 1, "Don't get call parameter");
  768. return 0;
  769. }
  770. if (!checkToken(pm, MATHER_RP)){
  771. freeParameter(pt, true);
  772. syntaxError(pm, syntax_error, line, 1, "Don't get ) from call back");
  773. return 0;
  774. }
  775. not_pt:
  776. *st = makeCallStatement(left_token->data.st, pt);
  777. return 1;
  778. }
  779. void parserCallBack(PASERSSIGNATURE){
  780. return tailOperation(CALLPASERSSIGNATURE, parserPoint, tailCall, POINT, CALLBACK,
  781. "point", "call back");
  782. }
  783. /**
  784. * 成员运算符匹配
  785. * parserPoint:
  786. * | parserBaseValue
  787. * | parserBaseValue POINT parserPoint
  788. */
  789. bool switchPoint(PASERSSIGNATURE, int symbol, Statement **st){
  790. switch (symbol) {
  791. case MATHER_POINT:
  792. *st = makeOperationBaseStatement(OPT_POINT, 0, pm->file);
  793. break;
  794. default:
  795. return false;
  796. }
  797. return true;
  798. }
  799. void parserPoint(PASERSSIGNATURE){
  800. return twoOperation(CALLPASERSSIGNATURE, parserBaseValue, switchPoint, BASEVALUE, POINT,
  801. "base value", "point", false);
  802. }
  803. /**
  804. * 字面量匹配
  805. * parserBaseValue:
  806. * | MATHER_NUMBER
  807. * | MATHER_STRING
  808. * | MATHER_VAR
  809. * | MATHER_LAMBDA parserParameter MATHER_COLON parserOperation
  810. * | MATHER_LP parserOperation MATHER_LP
  811. * | MATHER_LP parserOperation MATHER_LP -> list
  812. * | MATHER_LP parserOperation MATHER_LP MATHER_VAR
  813. * | MATHER_LC parserParameter(dict) MATHER_LC
  814. */
  815. int getOperation(PASERSSIGNATURE, int right_type, Statement **st, char *name){
  816. *st = NULL;
  817. if (checkToken(pm, right_type))
  818. goto return_;
  819. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, st, NULL))
  820. return 0;
  821. if (!checkToken(pm, right_type)){
  822. freeStatement(*st);
  823. return -1;
  824. }
  825. return_:
  826. return 1;
  827. }
  828. void parserBaseValue(PASERSSIGNATURE){
  829. Token *value_token = popNewToken(pm->tm);
  830. Statement *st = NULL;
  831. if (MATHER_NUMBER == value_token->token_type){
  832. Statement *tmp = NULL;
  833. tmp = makeBaseStrValueStatement(value_token->data.str, number_str, value_token->line, pm->file);
  834. if (*value_token->data.second_str == NUL)
  835. st = tmp;
  836. else{
  837. Statement *sencod_var = makeBaseVarStatement(value_token->data.second_str, NULL, value_token->line, pm->file);
  838. st = makeCallStatement(sencod_var, makeValueParameter(tmp));
  839. }
  840. }
  841. else if (MATHER_STRING == value_token->token_type){
  842. Value *tmp_value = makeStringValue(value_token->data.str, inter);
  843. Statement *tmp = NULL;
  844. tmp = makeBaseStrValueStatement(value_token->data.str, string_str, value_token->line, pm->file);
  845. if (*value_token->data.second_str == NUL)
  846. st = tmp;
  847. else{
  848. Statement *sencod_var = makeBaseVarStatement(value_token->data.second_str, NULL, value_token->line, pm->file);
  849. st = makeCallStatement(sencod_var, makeValueParameter(tmp));
  850. }
  851. }
  852. else if (MATHER_LAMBDA == value_token->token_type){
  853. Parameter *pt = NULL;
  854. Statement *lambda_st = NULL;
  855. if (!parserParameter(CALLPASERSSIGNATURE, &pt, true, false, false, MATHER_COMMA, MATHER_ASSIGNMENT)) {
  856. freeToken(value_token, true, true);
  857. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a lambda parameter");
  858. goto return_;
  859. }
  860. if (!checkToken(pm, MATHER_COLON)){
  861. lambda_st = makeStatement(value_token->line, pm->file);
  862. goto not_lambda_st;
  863. }
  864. if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &lambda_st, "Don't get a lambda operation")){
  865. freeToken(value_token, true, true);
  866. goto return_;
  867. }
  868. not_lambda_st:
  869. st = makeLambdaStatement(lambda_st, pt);
  870. }
  871. else if (MATHER_VAR == value_token->token_type)
  872. st = makeBaseVarStatement(value_token->data.str, NULL, value_token->line, pm->file);
  873. else if (MATHER_SVAR == value_token->token_type){
  874. Statement *svar_st = NULL;
  875. if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &svar_st, NULL)){
  876. freeToken(value_token, true, true);
  877. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get super var after $");
  878. goto return_;
  879. }
  880. st = makeBaseSVarStatement(svar_st, NULL);
  881. }
  882. else if (MATHER_LB == value_token->token_type){
  883. int tmp;
  884. Statement *tmp_st = NULL;
  885. tmp = getOperation(CALLPASERSSIGNATURE, MATHER_RB, &tmp_st, "base value");
  886. if (tmp == 0){
  887. freeToken(value_token, true, true);
  888. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get operation from Base Value");
  889. goto return_;
  890. }
  891. else if(tmp == -1){
  892. freeToken(value_token, true, true);
  893. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get ] from list/var");
  894. goto return_;
  895. }
  896. if (MATHER_VAR == readBackToken(pm)){
  897. Token *var_token;
  898. var_token = popNewToken(pm->tm);
  899. st = makeBaseVarStatement(var_token->data.str, tmp_st, var_token->line, pm->file);
  900. freeToken(var_token, true, false);
  901. }
  902. else{
  903. if (tmp_st == NULL)
  904. st = makeTupleStatement(NULL, value_list, value_token->line, pm->file);
  905. else if (tmp_st->type == base_list && tmp_st->u.base_list.type == value_tuple){
  906. tmp_st->u.base_list.type = value_list;
  907. st = tmp_st;
  908. }
  909. else
  910. st = makeTupleStatement(makeValueParameter(tmp_st), value_list, value_token->token_type, pm->file);
  911. }
  912. }
  913. else if (MATHER_LP == value_token->token_type){
  914. int tmp = getOperation(CALLPASERSSIGNATURE, MATHER_RP, &st, "base value");
  915. if (tmp == 0){
  916. freeToken(value_token, true, true);
  917. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get operation from Base Value");
  918. goto return_;
  919. }
  920. else if(tmp == -1){
  921. freeToken(value_token, true, true);
  922. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get ) from Base Value");
  923. goto return_;
  924. }
  925. }
  926. else if (MATHER_LC == value_token->token_type){
  927. Parameter *pt = NULL;
  928. if (!parserParameter(CALLPASERSSIGNATURE, &pt, false, false, true, MATHER_COMMA, MATHER_COLON)) {
  929. freeToken(value_token, true, true);
  930. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a dict parameter");
  931. goto return_;
  932. }
  933. if (!checkToken(pm, MATHER_RC)) {
  934. freeToken(value_token, true, true);
  935. freeParameter(pt, true);
  936. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a } after dict");
  937. goto return_;
  938. }
  939. st = makeBaseDictStatement(pt, value_token->line, pm->file);
  940. }
  941. else if (MATHER_BLOCK == value_token->token_type){
  942. Statement *block = NULL;
  943. if (!callParserCode(CALLPASERSSIGNATURE, &block, "Don't get a while code", value_token->line)) {
  944. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get block command");
  945. freeToken(value_token, true, true);
  946. goto return_;
  947. }
  948. st = makeOperationStatement(OPT_BLOCK, block, NULL);
  949. }
  950. else if (MATHER_PROTECT == value_token->token_type || MATHER_PRIVATE == value_token->token_type || MATHER_PUBLIC == value_token->token_type){
  951. if (MATHER_COLON != readBackToken(pm)){
  952. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a : after aut token");
  953. freeToken(value_token, true, true);
  954. goto return_;
  955. }
  956. delToken(pm);
  957. if (!callChildStatement(CALLPASERSSIGNATURE, parserBaseValue, BASEVALUE, &st, "Don't get Base Value after aut token")){
  958. freeToken(value_token, true, true);
  959. goto return_;
  960. }
  961. switch (value_token->token_type) {
  962. case MATHER_PROTECT:
  963. st->aut = protect_aut;
  964. break;
  965. case MATHER_PRIVATE:
  966. st->aut = private_aut;
  967. break;
  968. case MATHER_PUBLIC:
  969. st->aut = public_aut;
  970. break;
  971. }
  972. }
  973. else{
  974. backToken_(pm, value_token);
  975. goto return_;
  976. }
  977. freeToken(value_token, true, false);
  978. addStatementToken(BASEVALUE, st, pm);
  979. return_:
  980. return;
  981. }