grammar.c 32 KB

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