grammar.c 35 KB

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