grammar.c 35 KB

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