grammar.c 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532
  1. #include "__grammar.h"
  2. static ParserMessage *makeParserMessageCore() {
  3. ParserMessage *tmp = memCalloc(1, sizeof(ParserMessage));
  4. tmp->file = NULL;
  5. tmp->tm = NULL;
  6. tmp->status = success;
  7. tmp->status_message = NULL;
  8. return tmp;
  9. }
  10. ParserMessage *makeParserMessageFile(char *file_dir) {
  11. ParserMessage *tmp = makeParserMessageCore();
  12. tmp->file = memStrcpy(file_dir == NULL ? "stdin" : file_dir);
  13. tmp->tm = makeTokenMessageFile(file_dir);
  14. return tmp;
  15. }
  16. ParserMessage *makeParserMessageStr(wchar_t *str) {
  17. ParserMessage *tmp = makeParserMessageCore();
  18. tmp->file = memStrcpy("exec");
  19. tmp->tm = makeTokenMessageStr(str);
  20. return tmp;
  21. }
  22. void freeParserMessage(ParserMessage *pm, bool self) {
  23. FREE_BASE(pm, return_);
  24. freeTokenMessage(pm->tm, true, true);
  25. memFree(pm->status_message);
  26. memFree(pm->file);
  27. if (self)
  28. memFree(pm);
  29. return_:
  30. return;
  31. }
  32. /**
  33. * 命令表匹配
  34. * parserCommandList :
  35. * | MATHER_EOF
  36. * | MATHER_ENTER
  37. * | MATHER_SEMICOLON
  38. * | parserCommand MATHER_ENTER
  39. * | parserCommand MATHER_SEMICOLON
  40. * | parserCommand MATHER_EOF
  41. */
  42. void parserCommandList(P_FUNC, bool global, bool is_one, Statement *st) {
  43. int token_type;
  44. int save_enter = pm->tm->file->filter_data.enter;
  45. char *command_message = global ? "ERROR from command list(get parserCommand)" : NULL;
  46. void *bak = NULL;
  47. fline line = 0;
  48. bool should_break = false;
  49. bool have_command = false;
  50. pm_KeyInterrupt = signal_reset;
  51. bak = signal(SIGINT, signalStopPm);
  52. pm->tm->file->filter_data.enter = 0;
  53. while (!should_break){
  54. token_type = readBackToken(pm);
  55. if (token_type == -3 || token_type == -2)
  56. break;
  57. else if (token_type == MATHER_EOF){
  58. delToken(pm);
  59. break;
  60. }
  61. else if (token_type == MATHER_ENTER || token_type == MATHER_SEMICOLON){
  62. delToken(pm);
  63. if (is_one && have_command)
  64. break;
  65. }
  66. else{
  67. Token *command_token = NULL;
  68. int stop;
  69. have_command = true;
  70. if (!callChildToken(CP_FUNC, parserCommand, COMMAND, &command_token, command_message, command_list_error))
  71. break;
  72. line = command_token->line;
  73. stop = readBackToken(pm);
  74. if (stop == MATHER_ENTER) {
  75. delToken(pm);
  76. if (is_one)
  77. should_break = true;
  78. }
  79. else if (stop == MATHER_SEMICOLON)
  80. delToken(pm);
  81. else if(stop != MATHER_EOF){
  82. if (global) {
  83. Token *tk = popNewToken(pm->tm);
  84. freeToken(tk, true);
  85. syntaxError(pm, command_list_error, command_token->line, 1, "ERROR from parserCommand list(get stop)");
  86. freeToken(command_token, true);
  87. }
  88. else{
  89. connectStatement(st, command_token->data.st);
  90. freeToken(command_token, false);
  91. }
  92. break;
  93. }
  94. connectStatement(st, command_token->data.st);
  95. freeToken(command_token, false);
  96. }
  97. }
  98. if (is_one)
  99. clearLexFile(pm->tm->file);
  100. signal(SIGINT, bak);
  101. if (pm_KeyInterrupt != signal_reset) {
  102. pm_KeyInterrupt = signal_reset;
  103. syntaxError(pm, int_error, line, 1, "KeyInterrupt");
  104. }
  105. pm->tm->file->filter_data.enter = save_enter;
  106. }
  107. /**
  108. * 命令匹配
  109. * parserCommand:
  110. * | MATHER_DEF parserDef
  111. * | MATHER_IF parserIf
  112. * | MATHER_WHILE parserWhile
  113. * | MATHER_TRY parserTry
  114. * | MATHER_BREAK parserControl
  115. * | MATHER_CONTINUE parserControl
  116. * | MATHER_RESTART parserControl
  117. * | MATHER_REGO parserControl
  118. * | MATHER_RETURN parserControl
  119. * | MATHER_RAISE parserControl
  120. * | parserOperation
  121. */
  122. void parserCommand(P_FUNC){
  123. int token_type, status;
  124. Statement *st = NULL;
  125. token_type = readBackToken(pm);
  126. switch (token_type) {
  127. case MATHER_AT :
  128. status = callChildStatement(CP_FUNC, parserDecoration, DECORATION, &st, NULL);
  129. break;
  130. case MATHER_NONLOCAL :
  131. case MATHER_GLOBAL :
  132. case MATHER_DEFAULT :
  133. status = callChildStatement(CP_FUNC, parserVarControl, VARCONTROL, &st, NULL);
  134. break;
  135. case MATHER_CLASS :
  136. case MATHER_DEF :
  137. status = callChildStatement(CP_FUNC, parserDef, FUNCTION, &st, NULL);
  138. break;
  139. case MATHER_GOTO :
  140. status = callChildStatement(CP_FUNC, parserGoto, GOTO, &st, NULL);
  141. break;
  142. case MATHER_LABEL :
  143. status = callChildStatement(CP_FUNC, parserLabel, LABEL, &st, NULL);
  144. break;
  145. case MATHER_DO :
  146. status = callChildStatement(CP_FUNC, parserDo, DO_BRANCH, &st, NULL);
  147. break;
  148. case MATHER_WITH :
  149. status = callChildStatement(CP_FUNC, parserWith, WITH_BRANCH, &st, NULL);
  150. break;
  151. case MATHER_IF :
  152. status = callChildStatement(CP_FUNC, parserIf, IF_BRANCH, &st, NULL);
  153. break;
  154. case MATHER_FOR :
  155. status = callChildStatement(CP_FUNC, parserFor, FOR_BRANCH, &st, NULL);
  156. break;
  157. case MATHER_WHILE :
  158. status = callChildStatement(CP_FUNC, parserWhile, WHILE_BRANCH, &st, NULL);
  159. break;
  160. case MATHER_TRY :
  161. status = callChildStatement(CP_FUNC, parserTry, TRY_BRANCH, &st, NULL);
  162. break;
  163. case MATHER_BREAK :
  164. status = commandCallControl_(CP_FUNC, makeBreakStatement, BREAK, &st, false, NULL);
  165. break;
  166. case MATHER_CONTINUE :
  167. status = commandCallControl_(CP_FUNC, makeContinueStatement, CONTINUE, &st, false, NULL);
  168. break;
  169. case MATHER_RESTART :
  170. status = commandCallControl_(CP_FUNC, makeRestartStatement, RESTART, &st, false, NULL);
  171. break;
  172. case MATHER_REGO :
  173. status = commandCallControl_(CP_FUNC, makeRegoStatement, REGO, &st, false, NULL);
  174. break;
  175. case MATHER_RETURN :
  176. status = commandCallControl_(CP_FUNC, makeReturnStatement, RETURN, &st, false, NULL);
  177. break;
  178. case MATHER_YIELD :
  179. status = commandCallControl_(CP_FUNC, makeYieldStatement, YIELD, &st, false, NULL);
  180. break;
  181. case MATHER_RAISE :
  182. status = commandCallControl_(CP_FUNC, makeRaiseStatement, RAISE, &st, false, NULL);
  183. break;
  184. case MATHER_ASSERT :
  185. status = commandCallControl_(CP_FUNC, makeAssertStatement, ASSERT, &st, true,
  186. "parserAssert: Don't get conditions after assert");
  187. break;
  188. case MATHER_INCLUDE :
  189. status = commandCallControl_(CP_FUNC, makeIncludeStatement, INCLUDE, &st, true,
  190. "parserInclude: Don't get file after include");
  191. break;
  192. case MATHER_DEL :
  193. status = commandCallControl_(CP_FUNC, makeDelStatement, DEL, &st, true,
  194. "parserInclude: Don't get operation after del");
  195. break;
  196. case MATHER_FROM :
  197. case MATHER_IMPORT :
  198. status = callChildStatement(CP_FUNC, parserImport, IMPORT, &st, NULL);
  199. break;
  200. case MATHER_STRING:
  201. case MATHER_NUMBER:
  202. case MATHER_VAR:
  203. case MATHER_SVAR:
  204. case MATHER_LC:
  205. case MATHER_LB:
  206. case MATHER_LP:
  207. case MATHER_SUB:
  208. case MATHER_PROTECT:
  209. case MATHER_PRIVATE:
  210. case MATHER_PUBLIC:
  211. case MATHER_PASSVALUE:
  212. status = callChildStatement(CP_FUNC, parserOperation, OPERATION, &st, NULL);
  213. break;
  214. default:
  215. status = false;
  216. break;
  217. }
  218. if (!status)
  219. goto return_;
  220. addStatementToken(COMMAND, st, pm);
  221. return_: return;
  222. }
  223. void parserDecoration(P_FUNC){
  224. Statement *st = NULL;
  225. DecorationStatement *ds = NULL;
  226. int tmp;
  227. long int line = 0;
  228. while ((tmp = readBackToken(pm)) == MATHER_AT || tmp == MATHER_ENTER){
  229. Statement *dst = NULL;
  230. line = delToken(pm);
  231. if (tmp == MATHER_ENTER)
  232. continue;
  233. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, &dst, "Don't get a decoration operation"))
  234. goto error_;
  235. ds = connectDecorationStatement(dst, ds);
  236. }
  237. if (tmp!= MATHER_CLASS && tmp != MATHER_DEF) {
  238. syntaxError(pm, syntax_error, line, 1, "Don't get a decoration object");
  239. goto error_;
  240. }
  241. if (!callChildStatement(CP_FUNC, parserDef, FUNCTION, &st, "Don't get a decoration object"))
  242. goto error_;
  243. if (tmp == MATHER_CLASS)
  244. st->u.set_class.decoration = ds;
  245. else
  246. st->u.set_function.decoration = ds;
  247. addStatementToken(DECORATION, st, pm);
  248. return;
  249. error_:
  250. freeDecorationStatement(ds);
  251. }
  252. /**
  253. * label语句匹配
  254. * parserLabel:
  255. * | MATHER_LABEL MATHER_STRING(MATHER_VAR) [缺省所有参数]
  256. * | MATHER_LABEL MATHER_STRING(MATHER_VAR) MATHER_AS parserOperation [缺省command参数]
  257. * | MATHER_LABEL MATHER_STRING(MATHER_VAR) MATHER_COLON parserOperation [缺省var参数]
  258. * | MATHER_LABEL MATHER_STRING(MATHER_VAR) MATHER_AS parserOperation MATHER_COLON parserOperation
  259. * @param pm
  260. * @param inter
  261. */
  262. void parserLabel(P_FUNC){
  263. Statement *st = NULL;
  264. Statement *var = NULL;
  265. Statement *command = NULL;
  266. int tmp;
  267. wchar_t *label = NULL;
  268. long int line = delToken(pm);
  269. if ((tmp = readBackToken(pm)) == MATHER_STRING || tmp == MATHER_VAR) {
  270. Token *label_ = popNewToken(pm->tm);
  271. label = memWidecpy(label_->data.str);
  272. freeToken(label_, false);
  273. } else {
  274. syntaxError(pm, syntax_error, line, 1, "Don't get a label name");
  275. goto error_;
  276. }
  277. if (checkToken(pm, MATHER_AS) && !callChildStatement(CP_FUNC, parserOperation, OPERATION, &var, "Don't get a label var"))
  278. goto error_;
  279. if (checkToken(pm, MATHER_COLON) && !callChildStatement(CP_FUNC, parserOperation, OPERATION, &command, "Don't get a label command"))
  280. goto error_;
  281. st = makeLabelStatement(var, command, label, line, pm->file);
  282. addStatementToken(LABEL, st, pm);
  283. memFree(label);
  284. return;
  285. error_:
  286. freeStatement(var);
  287. freeStatement(command);
  288. memFree(label);
  289. }
  290. /**
  291. * goto语句匹配
  292. * parserGoto:
  293. * | MATHER_GOTO parserOperation [缺省所有参数]
  294. * | MATHER_GOTO parserOperation MATHER_COLON parserOperation [缺省times参数]
  295. * | MATHER_GOTO parserOperation MATHER_AT parserOperation [缺省return_参数]
  296. * | MATHER_GOTO parserOperation MATHER_AT parserOperation MATHER_COLON parserOperation
  297. */
  298. void parserGoto(P_FUNC){
  299. Statement *st = NULL;
  300. Statement *label = NULL;
  301. Statement *times = NULL;
  302. Statement *return_ = NULL;
  303. long int line = delToken(pm);
  304. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, &label, "Don't get a goto label"))
  305. goto error_;
  306. if (checkToken(pm, MATHER_AT) && !callChildStatement(CP_FUNC, parserOperation, OPERATION, &times, "Don't get a goto times"))
  307. goto error_;
  308. if (checkToken(pm, MATHER_COLON) && !callChildStatement(CP_FUNC, parserOperation, OPERATION, &return_, "Don't get a goto return"))
  309. goto error_;
  310. st = makeGotoStatement(return_, times, label, line, pm->file);
  311. addStatementToken(GOTO, st, pm);
  312. return;
  313. error_:
  314. freeStatement(label);
  315. freeStatement(times);
  316. freeStatement(return_);
  317. }
  318. /**
  319. * import 匹配
  320. * parserImport
  321. * | parserControl AS parserOperation
  322. * @param callBack statement生成函数
  323. * @param type 输出token的类型
  324. * @param must_operation 必须匹配 operation
  325. */
  326. void parserImport(P_FUNC) {
  327. Statement *opt = NULL;
  328. Statement *st = NULL;
  329. bool is_lock = false;
  330. int token_type = readBackToken(pm);
  331. long int line = delToken(pm);
  332. if (checkToken(pm, MATHER_COLON)) {
  333. switch (readBackToken(pm)) {
  334. case MATHER_PUBLIC:
  335. break;
  336. case MATHER_PRIVATE:
  337. case MATHER_PROTECT:
  338. is_lock = true;
  339. break;
  340. default:
  341. syntaxError(pm, syntax_error, opt->line, 1, "Don't get a aut token");
  342. goto return_;
  343. }
  344. delToken(pm);
  345. }
  346. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, &opt, "Don't get a import file"))
  347. goto return_;
  348. if (token_type == MATHER_IMPORT) {
  349. Statement *as = NULL;
  350. if (checkToken(pm, MATHER_AS) && !callChildStatement(CP_FUNC, parserOperation, OPERATION, &as, "Don't get a as after import")) {
  351. freeStatement(opt);
  352. goto return_;
  353. }
  354. st = makeImportStatement(opt, as, is_lock);
  355. }
  356. else{
  357. Parameter *pt = NULL;
  358. Parameter *as = NULL;
  359. if (!checkToken(pm, MATHER_IMPORT)) {
  360. syntaxError(pm, syntax_error, opt->line, 1, "Don't get a as after import");
  361. freeStatement(opt);
  362. goto return_;
  363. }
  364. if (checkToken(pm, MATHER_MUL)) // 导入所有
  365. goto mul_;
  366. if (!parserParameter(CP_FUNC, &pt, false, false, false, false, MATHER_COMMA, MATHER_ASSIGNMENT,
  367. -1) || pt == NULL) {
  368. syntaxError(pm, syntax_error, line, 1, "Don't get any value to import");
  369. freeStatement(opt);
  370. goto return_;
  371. }
  372. if (checkToken(pm, MATHER_AS) && (!parserParameter(CP_FUNC, &as, false, true, false, false,
  373. MATHER_COMMA, MATHER_ASSIGNMENT, -1) || as == NULL)) {
  374. freeParameter(pt, true);
  375. syntaxError(pm, syntax_error, opt->line, 1, "Don't get any value after import");
  376. freeStatement(opt);
  377. goto return_;
  378. }
  379. if (as == NULL && !checkFormal(pt)){
  380. freeParameter(pt, true);
  381. syntaxError(pm, syntax_error, opt->line, 1, "Don't get success value to import");
  382. freeStatement(opt);
  383. goto return_;
  384. }
  385. mul_:
  386. st = makeFromImportStatement(opt, as, pt, is_lock);
  387. }
  388. addStatementToken(IMPORT, st, pm);
  389. return_:
  390. return;
  391. }
  392. /**
  393. * 控制语句匹配
  394. * parserControl
  395. * | (control token) NULL
  396. * | (control token) parserOperation
  397. * @param callBack statement生成函数
  398. * @param type 输出token的类型
  399. * @param must_operation 必须匹配 operation
  400. */
  401. void parserVarControl(P_FUNC) {
  402. Parameter *var = NULL;
  403. Statement *st = NULL;
  404. Token *tmp = NULL;
  405. int token_type = readBackToken(pm);
  406. long int line = delToken(pm);
  407. if (!parserParameter(CP_FUNC, &var, false, true, true, true, MATHER_COMMA, MATHER_ASSIGNMENT, -1) || var == NULL) {
  408. syntaxError(pm, syntax_error, line, 1, "Don't get any var");
  409. goto return_;
  410. }
  411. st = makeDefaultVarStatement(var, line, pm->file, token_type == MATHER_DEFAULT ? default_ : token_type == MATHER_GLOBAL ? global_ : nonlocal_);
  412. addStatementToken(VARCONTROL, st, pm);
  413. return_:
  414. return;
  415. }
  416. /**
  417. * 控制语句匹配
  418. * parserControl
  419. * | (control token) NULL
  420. * | (control token) parserOperation
  421. * @param callBack statement生成函数
  422. * @param type 输出token的类型
  423. * @param must_operation 必须匹配 operation
  424. */
  425. void parserControl(P_FUNC, MakeControlFunction callBack, int type, bool must_operation, char *message) {
  426. Statement *opt = NULL;
  427. Statement *st = NULL;
  428. Token *tmp = NULL;
  429. long int line = delToken(pm);
  430. parserOperation(CP_FUNC);
  431. if (call_success(pm) && readBackToken(pm) == OPERATION){
  432. tmp = popNewToken(pm->tm);
  433. opt = tmp->data.st;
  434. freeToken(tmp, false);
  435. }
  436. else if (must_operation)
  437. goto error;
  438. st = callBack(opt, line, pm->file);
  439. addStatementToken(type, st, pm);
  440. return;
  441. error:
  442. syntaxError(pm, syntax_error, line, 1, message);
  443. }
  444. void parserDo(P_FUNC){
  445. Statement *st = NULL;
  446. Statement *do_code = NULL;
  447. long int line = delToken(pm);
  448. if (readBackToken(pm) == MATHER_WHILE){ // do...while语句
  449. if (!callChildStatement(CP_FUNC, parserWhile, WHILE_BRANCH, &st, "Don't get a while code"))
  450. goto error_;
  451. st->u.while_branch.type = do_while_;
  452. }
  453. else {
  454. if (!callParserCode(CP_FUNC, &do_code, "Don't get a if...else code", line))
  455. goto error_;
  456. again:
  457. switch (readBackToken(pm)){
  458. case MATHER_IF: {
  459. StatementList *do_sl = NULL;
  460. if (!callChildStatement(CP_FUNC, parserIf, IF_BRANCH, &st, "Don't get a if code after do"))
  461. goto error_;
  462. do_sl = makeStatementList(NULL, NULL, do_code, do_b);
  463. do_sl->next = st->u.if_branch.if_list;
  464. st->u.if_branch.if_list = do_sl;
  465. break;
  466. }
  467. case MATHER_WHILE:
  468. if (!callChildStatement(CP_FUNC, parserWhile, WHILE_BRANCH, &st, "Don't get a while code after do"))
  469. goto error_;
  470. st->u.while_branch.first = do_code;
  471. break;
  472. case MATHER_FOR:
  473. if (!callChildStatement(CP_FUNC, parserFor, FOR_BRANCH, &st, "Don't get a for code after do"))
  474. goto error_;
  475. st->u.for_branch.first_do = do_code;
  476. break;
  477. case MATHER_DEF:
  478. if (!callChildStatement(CP_FUNC, parserDef, FUNCTION, &st, "Don't get a func def after do"))
  479. goto error_;
  480. st->u.set_function.first_do = do_code;
  481. break;
  482. case MATHER_DO: {
  483. long int tmp_line = delToken(pm);
  484. if (readBackToken(pm) != MATHER_WHILE){
  485. syntaxError(pm, syntax_error, tmp_line, 1, "Don't get while after do");
  486. goto error_;
  487. }
  488. if (!callChildStatement(CP_FUNC, parserWhile, WHILE_BRANCH, &st, "Don't get a while code"))
  489. goto error_;
  490. st->u.while_branch.type = do_while_;
  491. st->u.while_branch.first = do_code;
  492. break;
  493. }
  494. case MATHER_ENTER:
  495. delToken(pm);
  496. goto again;
  497. default: {
  498. Token *tmp = popNewToken(pm->tm);
  499. syntaxError(pm, syntax_error, tmp->line, 1, "Get don't support branch after do");
  500. backToken_(pm, tmp);
  501. goto error_;
  502. }
  503. }
  504. }
  505. addStatementToken(DO_BRANCH, st, pm);
  506. return;
  507. error_:
  508. freeStatement(do_code);
  509. freeStatement(st);
  510. }
  511. void parserFor(P_FUNC){
  512. Statement *st = NULL;
  513. Statement *else_st = NULL;
  514. Statement *finally_st = NULL;
  515. Statement *do_st = NULL;
  516. StatementList *sl = NULL;
  517. long int line = delToken(pm);
  518. {
  519. Statement *code_tmp = NULL, *var_tmp = NULL, *iter_tmp = NULL;
  520. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, &var_tmp, "Don't get a for var"))
  521. goto error_;
  522. if (!checkToken(pm, MATHER_IN)){
  523. freeStatement(var_tmp);
  524. syntaxError(pm, syntax_error, line, 1, "Don't get in after for");
  525. goto error_;
  526. }
  527. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, &iter_tmp, "Don't get a for condition")) {
  528. freeStatement(var_tmp);
  529. goto error_;
  530. }
  531. if (!callParserCode(CP_FUNC, &code_tmp, "Don't get a for code", line)) {
  532. freeStatement(iter_tmp);
  533. freeStatement(var_tmp);
  534. goto error_;
  535. }
  536. sl = makeStatementList(iter_tmp, var_tmp, code_tmp, for_b);
  537. }
  538. again:
  539. switch (readBackToken(pm)) {
  540. case MATHER_DO: {
  541. if (do_st != NULL || else_st != NULL)
  542. goto default_;
  543. long int tmp_line = delToken(pm);
  544. if (!callParserCode(CP_FUNC, &do_st, "Don't get a for...do code", tmp_line))
  545. goto error_;
  546. goto again;
  547. }
  548. case MATHER_ELSE: {
  549. long int tmp_line = delToken(pm);
  550. if (else_st != NULL) {
  551. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else\n");
  552. goto error_;
  553. }
  554. if (!callParserCode(CP_FUNC, &else_st, "Don't get a for...else code", tmp_line))
  555. goto error_;
  556. goto again;
  557. }
  558. case MATHER_FINALLY: {
  559. long int tmp_line = delToken(pm);
  560. if (!callParserCode(CP_FUNC, &finally_st, "Don't get a for...finally code", tmp_line))
  561. goto error_;
  562. break;
  563. }
  564. case MATHER_ENTER:
  565. delToken(pm);
  566. goto again;
  567. case MATHER_SEMICOLON:
  568. break;
  569. default: {
  570. default_:
  571. addLexToken(pm, MATHER_ENTER);
  572. break;
  573. }
  574. }
  575. st = makeForStatement(line, pm->file);
  576. st->u.for_branch.for_list = sl;
  577. st->u.for_branch.else_list = else_st;
  578. st->u.for_branch.finally = finally_st;
  579. st->u.for_branch.after_do = do_st;
  580. addStatementToken(FOR_BRANCH, st, pm);
  581. return;
  582. error_:
  583. freeStatement(else_st);
  584. freeStatement(finally_st);
  585. freeStatement(do_st);
  586. freeStatementList(sl);
  587. }
  588. void parserWith(P_FUNC){
  589. Statement *st = NULL;
  590. Statement *code_tmp = NULL;
  591. Statement *var_tmp = NULL;
  592. Statement *condition_tmp = NULL;
  593. Statement *else_st = NULL;
  594. Statement *finally_st = NULL;
  595. StatementList *sl = NULL;
  596. long int line = 0;
  597. long int tmp_line;
  598. line = delToken(pm);
  599. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, &condition_tmp, "Don't get a with operation"))
  600. goto error_;
  601. if (!callParserAs(CP_FUNC, &var_tmp, "Don't get a with var"))
  602. goto error_;
  603. if (!callParserCode(CP_FUNC, &code_tmp, "Don't get a with code", line))
  604. goto error_;
  605. sl = connectStatementList(sl, makeStatementList(condition_tmp, var_tmp, code_tmp, with_b));
  606. condition_tmp = NULL;
  607. var_tmp = NULL;
  608. code_tmp = NULL;
  609. for (int tk=readBackToken(pm); tk == MATHER_ENTER; tk = readBackToken(pm))
  610. delToken(pm);
  611. if (readBackToken(pm) == MATHER_ELSE) {
  612. tmp_line = delToken(pm);
  613. if (!callParserCode(CP_FUNC, &else_st, "Don't get a with...else code", tmp_line))
  614. goto error_;
  615. }
  616. for (int tk=readBackToken(pm); tk == MATHER_ENTER; tk = readBackToken(pm))
  617. delToken(pm);
  618. if (readBackToken(pm) == MATHER_FINALLY) {
  619. tmp_line = delToken(pm);
  620. if (!callParserCode(CP_FUNC, &finally_st, "Don't get a wilt...finally code", tmp_line))
  621. goto error_;
  622. }
  623. addLexToken(pm, MATHER_ENTER);
  624. st = makeWithStatement(line, pm->file);
  625. st->u.with_branch.with_list = sl;
  626. st->u.with_branch.else_list = else_st;
  627. st->u.with_branch.finally = finally_st;
  628. addStatementToken(WITH_BRANCH, st, pm);
  629. return;
  630. error_:
  631. freeStatement(condition_tmp);
  632. freeStatement(var_tmp);
  633. freeStatement(else_st);
  634. freeStatement(finally_st);
  635. freeStatementList(sl);
  636. }
  637. /**
  638. * 条件分支匹配
  639. * parserIf:
  640. * | MATHER_IF parserOperation (MATHER_AS parserOperation) callParserCode
  641. * | parserIf MATHER_ELIF parserOperation (MATHER_AS parserOperation) callParserCode
  642. * | parserIf MATHER_DO callParserCode [不允许两次连用]
  643. * | parserIf MATHER_ELSE callParserCode [不允许再出现if和elif以及do] [只出现一次] [4]
  644. * | parserIf MATHER_FINALLY callParserCode [结尾]
  645. * 注释:会自动过滤 <ENTER> , 可以使用 <SEMICOLON> 作为结束表示
  646. * 注释:自动添加 <ENTER> 结尾符号
  647. * 注释:(MATHER_AS parserOperation) 表示允许出现或者不出现, 若出现则 MATHER_AS parserOperation 必须一起出现
  648. * 特别注意:自进入模式[4]后,匹配顺序自上而下不可逆
  649. * @param pm
  650. * @param inter
  651. */
  652. void parserIf(P_FUNC){
  653. Statement *st = NULL;
  654. Statement *else_st = NULL;
  655. Statement *finally_st = NULL;
  656. StatementList *sl = NULL;
  657. bool have_if = false;
  658. long int line = 0;
  659. again:
  660. switch (readBackToken(pm)) {
  661. case MATHER_IF:
  662. if (have_if)
  663. goto default_;
  664. else
  665. have_if = true;
  666. line = delToken(pm);
  667. goto not_del;
  668. case MATHER_ELIF: {
  669. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  670. long int tmp_line = delToken(pm);
  671. if (else_st != NULL) {
  672. syntaxError(pm, syntax_error, tmp_line, 1, "get elif after else");
  673. goto error_;
  674. }
  675. not_del:
  676. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, &condition_tmp, "Don't get a if condition"))
  677. goto error_;
  678. if (!callParserAs(CP_FUNC, &var_tmp, "Don't get a while var")) {
  679. freeStatement(condition_tmp);
  680. goto error_;
  681. }
  682. if (!callParserCode(CP_FUNC, &code_tmp, "Don't get a if code", tmp_line)) {
  683. freeStatement(condition_tmp);
  684. freeStatement(var_tmp);
  685. goto error_;
  686. }
  687. sl = connectStatementList(sl, makeStatementList(condition_tmp, var_tmp, code_tmp, if_b));
  688. goto again;
  689. }
  690. case MATHER_DO: {
  691. if (else_st != NULL)
  692. goto default_;
  693. Statement *code_tmp = NULL;
  694. long int tmp_line = delToken(pm);
  695. if (!callParserCode(CP_FUNC, &code_tmp, "Don't get a if...do code", tmp_line))
  696. goto error_;
  697. sl = connectStatementList(sl, makeStatementList(NULL, NULL, code_tmp, do_b));
  698. goto again;
  699. }
  700. case MATHER_ELSE: {
  701. long int tmp_line = delToken(pm);
  702. if (else_st != NULL) {
  703. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else");
  704. goto error_;
  705. }
  706. if (!callParserCode(CP_FUNC, &else_st, "Don't get a if...else code", tmp_line))
  707. goto error_;
  708. goto again;
  709. }
  710. case MATHER_FINALLY: {
  711. long int tmp_line = delToken(pm);
  712. if (!callParserCode(CP_FUNC, &finally_st, "Don't get a if...finally code", tmp_line))
  713. goto error_;
  714. break;
  715. }
  716. case MATHER_ENTER:
  717. delToken(pm);
  718. goto again;
  719. case MATHER_SEMICOLON:
  720. break;
  721. default:{
  722. default_:
  723. addLexToken(pm, MATHER_ENTER);
  724. break;
  725. }
  726. }
  727. st = makeIfStatement(line, pm->file);
  728. st->u.if_branch.if_list = sl;
  729. st->u.if_branch.else_list = else_st;
  730. st->u.if_branch.finally = finally_st;
  731. addStatementToken(IF_BRANCH, st, pm);
  732. return;
  733. error_:
  734. freeStatement(else_st);
  735. freeStatement(finally_st);
  736. freeStatementList(sl);
  737. }
  738. /**
  739. * 条件循环匹配
  740. * parserWhile:
  741. * | MATHER_WHILE parserOperation (MATHER_AS parserOperation) callParserCode
  742. * | parserWhile MATHER_DO callParserCode [只出现一次]
  743. * | parserWhile MATHER_ELSE callParserCode [只出现一次]
  744. * | parserWhile MATHER_FINALLY callParserCode [结尾]
  745. * 注释:同 ``parserIf``
  746. * 特别注意:匹配顺序自上而下不可逆
  747. * @param pm
  748. * @param inter
  749. */
  750. void parserWhile(P_FUNC){
  751. Statement *st = NULL;
  752. Statement *else_st = NULL;
  753. Statement *finally_st = NULL;
  754. Statement *do_st = NULL;
  755. StatementList *sl = NULL;
  756. bool have_while = false;
  757. long int line = 0;
  758. again:
  759. switch (readBackToken(pm)) {
  760. case MATHER_WHILE: {
  761. if (have_while)
  762. goto default_;
  763. else
  764. have_while = true;
  765. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  766. line = delToken(pm);
  767. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, &condition_tmp, "Don't get a while condition"))
  768. goto error_;
  769. if (!callParserAs(CP_FUNC, &var_tmp, "Don't get a while var")){
  770. freeStatement(condition_tmp);
  771. goto error_;
  772. }
  773. if (!callParserCode(CP_FUNC, &code_tmp, "Don't get a while code", line)) {
  774. freeStatement(condition_tmp);
  775. freeStatement(var_tmp);
  776. goto error_;
  777. }
  778. if (sl != NULL)
  779. freeStatementList(sl);
  780. sl = makeStatementList(condition_tmp, var_tmp, code_tmp, while_b);
  781. goto again;
  782. }
  783. case MATHER_DO: {
  784. if (do_st != NULL || else_st != NULL)
  785. goto default_;
  786. long int tmp_line = delToken(pm);
  787. if (!callParserCode(CP_FUNC, &do_st, "Don't get a while...do code", tmp_line))
  788. goto error_;
  789. goto again;
  790. }
  791. case MATHER_ELSE: {
  792. long int tmp_line = delToken(pm);
  793. if (else_st != NULL) {
  794. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else\n");
  795. goto error_;
  796. }
  797. if (!callParserCode(CP_FUNC, &else_st, "Don't get a while...else code", tmp_line))
  798. goto error_;
  799. goto again;
  800. }
  801. case MATHER_FINALLY: {
  802. long int tmp_line = delToken(pm);
  803. if (!callParserCode(CP_FUNC, &finally_st, "Don't get a while...finally code", tmp_line))
  804. goto error_;
  805. break;
  806. }
  807. case MATHER_ENTER:
  808. delToken(pm);
  809. goto again;
  810. case MATHER_SEMICOLON:
  811. break;
  812. default: {
  813. default_:
  814. addLexToken(pm, MATHER_ENTER);
  815. break;
  816. }
  817. }
  818. st = makeWhileStatement(line, pm->file);
  819. st->u.while_branch.while_list = sl;
  820. st->u.while_branch.else_list = else_st;
  821. st->u.while_branch.finally = finally_st;
  822. st->u.while_branch.after = do_st;
  823. addStatementToken(WHILE_BRANCH, st, pm);
  824. return;
  825. error_:
  826. freeStatement(else_st);
  827. freeStatement(finally_st);
  828. freeStatement(do_st);
  829. freeStatementList(sl);
  830. }
  831. /**
  832. * 异常捕获分支匹配
  833. * parserTry:
  834. * | MATHER_TRY callParserCode
  835. * | parserTry MATHER_EXCEPT (MATHER_AS parserOperation) callParserCode
  836. * | parserTry MATHER_ELSE callParserCode [只出现一次]
  837. * | parserTry MATHER_FINALLY callParserCode [结尾]
  838. * 注释:同 ``parserIf``
  839. * 特别注意:匹配顺序自上而下不可逆
  840. * @param pm
  841. * @param inter
  842. */
  843. void parserTry(P_FUNC){
  844. Statement *st = NULL;
  845. Statement *try_st = NULL;
  846. Statement *else_st = NULL;
  847. Statement *finally_st = NULL;
  848. StatementList *sl = NULL;
  849. long int line = 0;
  850. again:
  851. switch (readBackToken(pm)) {
  852. case MATHER_TRY:{
  853. if (try_st != NULL)
  854. goto default_;
  855. line = delToken(pm);
  856. if (!callParserCode(CP_FUNC, &try_st, "Don't get a try code", line))
  857. goto error_;
  858. goto again;
  859. }
  860. case MATHER_EXCEPT: {
  861. Statement *code_tmp = NULL, *var_tmp = NULL, *condition_tmp = NULL;
  862. long int tmp_line = delToken(pm);
  863. if (else_st != NULL) {
  864. syntaxError(pm, syntax_error, tmp_line, 1, "get except after else");
  865. goto error_;
  866. }
  867. if (readBackToken(pm) != MATHER_LC)
  868. callChildStatement(CP_FUNC, parserOperation, OPERATION, &condition_tmp, NULL);
  869. if (!callParserAs(CP_FUNC, &var_tmp, "Don't get a except var")){
  870. freeStatement(condition_tmp);
  871. goto error_;
  872. }
  873. if (!callParserCode(CP_FUNC, &code_tmp, "Don't get a except code", tmp_line)) {
  874. freeStatement(condition_tmp);
  875. freeStatement(var_tmp);
  876. goto error_;
  877. }
  878. sl = connectStatementList(sl, makeStatementList(condition_tmp, var_tmp, code_tmp, except_b));
  879. goto again;
  880. }
  881. case MATHER_ELSE: {
  882. long int tmp_line = delToken(pm);
  883. if (else_st != NULL) {
  884. syntaxError(pm, syntax_error, tmp_line, 1, "get else after else");
  885. goto error_;
  886. }
  887. if (!callParserCode(CP_FUNC, &else_st, "Don't get a try...else code", tmp_line))
  888. goto error_;
  889. goto again;
  890. }
  891. case MATHER_FINALLY: {
  892. long int tmp_line = delToken(pm);
  893. if (!callParserCode(CP_FUNC, &finally_st, "Don't get a try...finally code", tmp_line))
  894. goto error_;
  895. break;
  896. }
  897. case MATHER_ENTER:
  898. delToken(pm);
  899. goto again;
  900. case MATHER_SEMICOLON:
  901. break;
  902. default: {
  903. default_:
  904. addLexToken(pm, MATHER_ENTER);
  905. break;
  906. }
  907. }
  908. st = makeTryStatement(line, pm->file);
  909. st->u.try_branch.try = try_st;
  910. st->u.try_branch.except_list = sl;
  911. st->u.try_branch.else_list = else_st;
  912. st->u.try_branch.finally = finally_st;
  913. addStatementToken(TRY_BRANCH, st, pm);
  914. return;
  915. error_:
  916. freeStatement(try_st);
  917. freeStatement(else_st);
  918. freeStatement(finally_st);
  919. freeStatementList(sl);
  920. }
  921. /**
  922. * 函数定义匹配
  923. * parserDef:
  924. * | parserBaseValue MATHER_LP parserParameter(is_formal) MATHER_RP callParserCode
  925. * 注释:自动添加 <ENTER> 结尾符号
  926. * @param pm
  927. * @param inter
  928. */
  929. void parserDef(P_FUNC){
  930. Statement *st = NULL;
  931. Statement *name_tmp = NULL;
  932. Statement *code_tmp = NULL;
  933. Parameter *pt = NULL;
  934. int type = readBackToken(pm);
  935. long int line = delToken(pm);
  936. if (!callChildStatement(CP_FUNC, parserBaseValue, BASEVALUE, &name_tmp,
  937. "Don't get a func/V_class name"))
  938. goto error_;
  939. if (!checkToken(pm, MATHER_LP))
  940. goto get_code;
  941. if (!parserParameter(CP_FUNC, &pt, true, true, false, false, MATHER_COMMA, MATHER_ASSIGNMENT, type == MATHER_DEF ? MATHER_SEMICOLON : -1)) {
  942. lexEnter(pm, false);
  943. syntaxError(pm, syntax_error, line, 1, "Don't get a func/V_class parameter");
  944. goto error_;
  945. }
  946. if (!checkToken(pm, MATHER_RP)) {
  947. syntaxError(pm, syntax_error, line, 1, "Don't get a func/V_class ) after parameter");
  948. goto error_;
  949. }
  950. get_code:
  951. if (!callParserCode(CP_FUNC, &code_tmp, "Don't get a func code", line)) {
  952. syntaxError(pm, syntax_error, line, 1, "Don't get a func code");
  953. goto error_;
  954. }
  955. if (type == MATHER_DEF)
  956. st = makeFunctionStatement(name_tmp, code_tmp, pt);
  957. else
  958. st = makeClassStatement(name_tmp, code_tmp, pt);
  959. addLexToken(pm, MATHER_ENTER);
  960. addStatementToken(FUNCTION, st, pm);
  961. return;
  962. error_:
  963. freeStatement(name_tmp);
  964. freeStatement(code_tmp);
  965. freeParameter(pt, true);
  966. }
  967. /**
  968. * 函数定义匹配
  969. * parserCode:
  970. * | MATHER_LC parserCommandList MATHER_RC
  971. * 注释:自动忽略MATHER_LC前的空格
  972. * @param pm
  973. * @param inter
  974. */
  975. void parserCode(P_FUNC) {
  976. long int line = 0;
  977. Statement *st = makeStatement(line, pm->file);
  978. while (true){
  979. if (readBackToken(pm) != MATHER_LC)
  980. goto again_;
  981. line = delToken(pm);
  982. break;
  983. again_:
  984. if (!checkToken(pm, MATHER_ENTER))
  985. goto return_;
  986. }
  987. parserCommandList(CP_FUNC, false, false, st);
  988. if (!call_success(pm))
  989. goto error_;
  990. if (!checkToken(pm, MATHER_RC)) {
  991. syntaxError(pm, syntax_error, line, 1, "Don't get the }"); // 使用{的行号
  992. goto error_;
  993. }
  994. return_:
  995. addStatementToken(CODE, st, pm);
  996. return;
  997. error_:
  998. freeStatement(st);
  999. }
  1000. /**
  1001. * 表达式匹配
  1002. * parserOperation:
  1003. * | parserAssignment
  1004. */
  1005. void parserOperation(P_FUNC){
  1006. Statement *operation_st = NULL;
  1007. if (!callChildStatement(CP_FUNC, parserAssignment, ASSIGNMENT, &operation_st, NULL))
  1008. goto return_;
  1009. addStatementToken(OPERATION, operation_st, pm);
  1010. return_:
  1011. return;
  1012. }
  1013. /**
  1014. * 赋值表达式匹配
  1015. * parserAssignment:
  1016. * | parserTuple
  1017. * | parserAssignment ASSIGNMENT parserTuple [2]
  1018. * 注意:在链接statement的时候, 模式[2]相当于 parserTuple ASSIGNMENT parserAssignment
  1019. */
  1020. bool checkAssignmentLeft(P_FUNC, Statement *left){
  1021. if (left->type == call_function && !checkFormal(left->u.call_function.parameter)){
  1022. syntaxError(pm, syntax_error, left->line, 1, "Don't get success func definition from Assignment22");
  1023. return false;
  1024. }
  1025. return true;
  1026. }
  1027. bool switchAssignment(P_FUNC, int symbol, Statement **st){
  1028. switch (symbol) { // 此处保持使用switch分支
  1029. case MATHER_ASSIGNMENT:
  1030. *st = makeOperationBaseStatement(OPT_ASS, 0, pm->file);
  1031. break;
  1032. default:
  1033. return false;
  1034. }
  1035. return true;
  1036. }
  1037. void parserAssignment(P_FUNC){
  1038. return twoOperation(CP_FUNC, parserTuple, switchAssignment, checkAssignmentLeft, TUPLE, ASSIGNMENT,
  1039. "polynomial", "assignment", true);
  1040. }
  1041. /**
  1042. * 元组匹配
  1043. * parserTuple:
  1044. * | parserPolynomial
  1045. * | parserTuple COMMA parserPolynomial
  1046. * @param pm
  1047. * @param inter
  1048. */
  1049. void parserTuple(P_FUNC){
  1050. Parameter *pt = NULL;
  1051. Statement *st = NULL;
  1052. Token *tmp = NULL;
  1053. long int line = 0;
  1054. if (readBackToken(pm) == MATHER_MUL) {
  1055. line = pm->tm->ts->token_list->line;
  1056. goto parserPt;
  1057. }
  1058. if (!callChildToken(CP_FUNC, parserPolynomial, POLYNOMIAL, &tmp, NULL, syntax_error))
  1059. goto return_;
  1060. if (readBackToken(pm) != MATHER_COMMA){
  1061. tmp->token_type = TUPLE;
  1062. addToken_(pm ,tmp);
  1063. goto return_;
  1064. }
  1065. line = tmp->line;
  1066. addToken_(pm ,tmp);
  1067. parserPt:
  1068. if (!parserParameter(CP_FUNC, &pt, false, false, true, false, MATHER_COMMA, MATHER_ASSIGNMENT, -1)) {
  1069. syntaxError(pm, syntax_error, line, 1, "Don't get tuple element");
  1070. goto return_;
  1071. }
  1072. st = makeTupleStatement(pt, L_tuple, pt->data.value->line, pm->file);
  1073. addStatementToken(TUPLE, st, pm);
  1074. return_:
  1075. return;
  1076. }
  1077. /**
  1078. * 多项式匹配
  1079. * parserPolynomial:
  1080. * | parserBaseValue
  1081. * | parserPolynomial OPT_ADD parserFactor
  1082. * | parserPolynomial OPT_SUB parserFactor
  1083. */
  1084. bool switchPolynomial(P_FUNC, int symbol, Statement **st){
  1085. switch (symbol) {
  1086. case MATHER_ADD:
  1087. *st = makeOperationBaseStatement(OPT_ADD, 0, pm->file);
  1088. break;
  1089. case MATHER_SUB:
  1090. *st = makeOperationBaseStatement(OPT_SUB, 0, pm->file);
  1091. break;
  1092. default:
  1093. return false;
  1094. }
  1095. return true;
  1096. }
  1097. void parserPolynomial(P_FUNC){
  1098. return twoOperation(CP_FUNC, parserFactor, switchPolynomial, NULL, FACTOR, POLYNOMIAL,
  1099. "factor", "polynomial", false);
  1100. }
  1101. /**
  1102. * 因式匹配
  1103. * parserFactor:
  1104. * | parserCallBack
  1105. * | switchFactor OPT_ADD parserCallBack
  1106. * | switchFactor OPT_SUB parserCallBack
  1107. */
  1108. bool switchFactor(P_FUNC, int symbol, Statement **st){
  1109. switch (symbol) {
  1110. case MATHER_MUL:
  1111. *st = makeOperationBaseStatement(OPT_MUL, 0, pm->file);
  1112. break;
  1113. case MATHER_DIV:
  1114. *st = makeOperationBaseStatement(OPT_DIV, 0, pm->file);
  1115. break;
  1116. default:
  1117. return false;
  1118. }
  1119. return true;
  1120. }
  1121. void parserFactor(P_FUNC){
  1122. return twoOperation(CP_FUNC, parserCallBack, switchFactor, NULL, CALLBACK, FACTOR,
  1123. "call back", "factor", false);
  1124. }
  1125. /**
  1126. * 函数回调匹配
  1127. * parserCallBack:
  1128. * | parserBaseValue
  1129. * | parserCallBack MATHER_LP parserParameter MATHER_RP
  1130. */
  1131. bool tailCall(P_FUNC, Token *left_token, Statement **st){
  1132. Parameter *pt = NULL;
  1133. long int line = delToken(pm);
  1134. if (checkToken(pm, MATHER_RP))
  1135. goto not_pt;
  1136. if (!parserParameter(CP_FUNC, &pt, true, false, false, false, MATHER_COMMA, MATHER_ASSIGNMENT, MATHER_SEMICOLON)) {
  1137. syntaxError(pm, syntax_error, line, 1, "Don't get call parameter");
  1138. return false;
  1139. }
  1140. if (!checkToken(pm, MATHER_RP)) {
  1141. freeParameter(pt, true);
  1142. syntaxError(pm, syntax_error, line, 1, "Don't get ) from call back");
  1143. return false;
  1144. }
  1145. not_pt:
  1146. *st = makeCallStatement(left_token->data.st, pt);
  1147. return true;
  1148. }
  1149. bool tailSlice(P_FUNC, Token *left_token, Statement **st){
  1150. Parameter *pt = NULL;
  1151. Token *tmp = NULL;
  1152. enum SliceType type; // 0-slice 1-down
  1153. long int line = delToken(pm);
  1154. if (!callChildToken(CP_FUNC, parserPolynomial, POLYNOMIAL, &tmp, "Don't get slice/down element", syntax_error))
  1155. return false;
  1156. else if (readBackToken(pm) == MATHER_COLON)
  1157. type = SliceType_slice_;
  1158. else
  1159. type = SliceType_down_;
  1160. line = tmp->line;
  1161. addToken_(pm ,tmp);
  1162. if (!parserParameter(CP_FUNC, &pt, true, true, true, true,
  1163. (type == SliceType_down_ ? MATHER_COMMA : MATHER_COLON), MATHER_ASSIGNMENT, -1)) {
  1164. syntaxError(pm, syntax_error, line, 1, "Don't get slice element");
  1165. return false;
  1166. }
  1167. if (!checkToken(pm, MATHER_RB)){
  1168. freeParameter(pt, true);
  1169. syntaxError(pm, syntax_error, line, 1, "Don't get ] from slice");
  1170. return false;
  1171. }
  1172. *st = makeSliceStatement(left_token->data.st, pt, type);
  1173. return true;
  1174. }
  1175. bool taliPoint(P_FUNC, Token *left_token, Statement **st){
  1176. Statement *right_st = NULL;
  1177. delToken(pm);
  1178. if (!callChildStatement(CP_FUNC, parserBaseValue, BASEVALUE, &right_st, "Don't get a BaseValue after point"))
  1179. return false;
  1180. *st = makeOperationStatement(OPT_POINT, left_token->data.st, right_st);
  1181. return true;
  1182. }
  1183. bool taliLink(P_FUNC, Token *left_token, Statement **st){
  1184. Statement *right_st = NULL;
  1185. delToken(pm);
  1186. if (!callChildStatement(CP_FUNC, parserBaseValue, BASEVALUE, &right_st, "Don't get a BaseValue after link"))
  1187. return false;
  1188. *st = makeOperationStatement(OPT_LINK, left_token->data.st, right_st);
  1189. return true;
  1190. }
  1191. void parserCallBack(P_FUNC){
  1192. while(true){
  1193. int tk;
  1194. Token *left_token = NULL;
  1195. struct Statement *st = NULL;
  1196. if (readBackToken(pm) != CALLBACK){
  1197. if (!callChildStatement(CP_FUNC, parserBaseValue, BASEVALUE, &st, NULL))
  1198. goto return_;
  1199. addStatementToken(CALLBACK, st, pm);
  1200. continue;
  1201. }
  1202. left_token = popNewToken(pm->tm);
  1203. tk = readBackToken(pm);
  1204. if (tk == MATHER_LB && !tailSlice(CP_FUNC, left_token, &st) ||
  1205. tk == MATHER_LP && !tailCall(CP_FUNC, left_token, &st) ||
  1206. tk == MATHER_POINT && !taliPoint(CP_FUNC, left_token, &st) ||
  1207. tk == MATHER_LINK && !taliLink(CP_FUNC, left_token, &st)) {
  1208. freeToken(left_token, true);
  1209. goto return_;
  1210. } else if (tk != MATHER_LB && tk != MATHER_LP && tk != MATHER_POINT && tk != MATHER_LINK) {
  1211. backToken_(pm, left_token);
  1212. goto return_;
  1213. }
  1214. addStatementToken(CALLBACK, st, pm);
  1215. freeToken(left_token, false);
  1216. }
  1217. return_: return;
  1218. }
  1219. /**
  1220. * 字面量匹配
  1221. * parserBaseValue:
  1222. * | MATHER_NUMBER
  1223. * | MATHER_STRING
  1224. * | MATHER_VAR
  1225. * | MATHER_LAMBDA parserParameter MATHER_COLON parserOperation
  1226. * | MATHER_LP parserOperation MATHER_LP
  1227. * | MATHER_LP parserOperation MATHER_LP -> list
  1228. * | MATHER_LP parserOperation MATHER_LP MATHER_VAR
  1229. * | MATHER_LC parserParameter(dict) MATHER_LC
  1230. */
  1231. int getOperation(P_FUNC, int right_type, Statement **st, char *name){
  1232. *st = NULL;
  1233. if (checkToken(pm, right_type))
  1234. goto return_;
  1235. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, st, NULL))
  1236. return 0;
  1237. if (!checkToken(pm, right_type)){
  1238. freeStatement(*st);
  1239. return -1;
  1240. }
  1241. return_:
  1242. return 1;
  1243. }
  1244. void parserBaseValue(P_FUNC){
  1245. Token *value_token = popNewToken(pm->tm);
  1246. Statement *st = NULL;
  1247. switch (value_token->token_type) {
  1248. case MATHER_NUMBER : {
  1249. Statement *tmp = NULL;
  1250. tmp = makeBaseStrValueStatement(value_token->data.str, number_str, value_token->line, pm->file);
  1251. if (*value_token->data.second_str == NUL)
  1252. st = tmp;
  1253. else {
  1254. Statement *second_var = makeBaseVarStatement(value_token->data.second_str, NULL, value_token->line, pm->file);
  1255. st = makeCallStatement(second_var, makeValueParameter(tmp));
  1256. }
  1257. break;
  1258. }
  1259. case MATHER_STRING:{
  1260. Statement *tmp = NULL;
  1261. tmp = makeBaseStrValueStatement(value_token->data.str, string_str, value_token->line, pm->file);
  1262. if (*value_token->data.second_str == NUL)
  1263. st = tmp;
  1264. else {
  1265. Statement *sencod_var = makeBaseVarStatement(value_token->data.second_str, NULL, value_token->line, pm->file);
  1266. st = makeCallStatement(sencod_var, makeValueParameter(tmp));
  1267. }
  1268. break;
  1269. }
  1270. case MATHER_TRUE:
  1271. st = makeBaseValueStatement(bool_true, value_token->line, pm->file);
  1272. break;
  1273. case MATHER_FALSE:
  1274. st = makeBaseValueStatement(bool_false, value_token->line, pm->file);
  1275. break;
  1276. case MATHER_NULL:
  1277. st = makeBaseValueStatement(null_value, value_token->line, pm->file);
  1278. break;
  1279. case MATHER_PASSVALUE:
  1280. st = makeBaseValueStatement(pass_value, value_token->line, pm->file);
  1281. break;
  1282. case MATHER_LAMBDA: {
  1283. Parameter *pt = NULL;
  1284. Statement *lambda_st = NULL;
  1285. if (!parserParameter(CP_FUNC, &pt, false, true, false, false, MATHER_COMMA,
  1286. MATHER_ASSIGNMENT, -1)) {
  1287. freeToken(value_token, true);
  1288. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a lambda parameter");
  1289. goto return_;
  1290. }
  1291. if (!checkToken(pm, MATHER_COLON)) {
  1292. lambda_st = makeStatement(value_token->line, pm->file);
  1293. goto not_lambda_st;
  1294. }
  1295. if (!callChildStatement(CP_FUNC, parserOperation, OPERATION, &lambda_st,
  1296. "Don't get a lambda operation")) {
  1297. freeToken(value_token, true);
  1298. goto return_;
  1299. }
  1300. not_lambda_st:
  1301. st = makeLambdaStatement(lambda_st, pt);
  1302. break;
  1303. }
  1304. case MATHER_VAR:
  1305. st = makeBaseVarStatement(value_token->data.str, NULL, value_token->line, pm->file);
  1306. break;
  1307. case MATHER_SVAR: {
  1308. Statement *svar_st = NULL;
  1309. if (!callChildStatement(CP_FUNC, parserBaseValue, BASEVALUE, &svar_st, NULL)) {
  1310. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get super var after $");
  1311. freeToken(value_token, true);
  1312. goto return_;
  1313. }
  1314. st = makeBaseSVarStatement(svar_st, NULL);
  1315. break;
  1316. }
  1317. case MATHER_LB: {
  1318. int tmp;
  1319. Statement *tmp_st = NULL;
  1320. lexEnter(pm, true);
  1321. tmp = getOperation(CP_FUNC, MATHER_RB, &tmp_st, "base value");
  1322. lexEnter(pm, false);
  1323. if (tmp == 0) {
  1324. freeToken(value_token, true);
  1325. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get operation from Base Value");
  1326. goto return_;
  1327. } else if (tmp == -1) {
  1328. freeToken(value_token, true);
  1329. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get ] from list/var");
  1330. goto return_; // 优化goto return freeToken
  1331. }
  1332. if (MATHER_VAR == readBackToken(pm)) {
  1333. Token *var_token;
  1334. var_token = popNewToken(pm->tm);
  1335. st = makeBaseVarStatement(var_token->data.str, tmp_st, var_token->line, pm->file);
  1336. freeToken(var_token, false);
  1337. } else {
  1338. if (tmp_st == NULL)
  1339. st = makeTupleStatement(NULL, L_list, value_token->line, pm->file);
  1340. else if (tmp_st->type == base_list && tmp_st->u.base_list.type == L_tuple) {
  1341. tmp_st->u.base_list.type = L_list;
  1342. st = tmp_st;
  1343. } else
  1344. st = makeTupleStatement(makeValueParameter(tmp_st), L_list, value_token->token_type, pm->file);
  1345. }
  1346. break;
  1347. }
  1348. case MATHER_LP: {
  1349. int tmp;
  1350. lexEnter(pm, true);
  1351. tmp = getOperation(CP_FUNC, MATHER_RP, &st, "base value");
  1352. lexEnter(pm, false);
  1353. if (tmp == 0) {
  1354. freeToken(value_token, true);
  1355. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get operation from Base Value");
  1356. goto return_;
  1357. } else if (tmp == -1) {
  1358. freeToken(value_token, true);
  1359. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get ) from Base Value");
  1360. goto return_;
  1361. }
  1362. if (st->type == base_var)
  1363. st->u.base_var.run = false;
  1364. else if (st->type == base_svar)
  1365. st->u.base_svar.run = false;
  1366. break;
  1367. }
  1368. case MATHER_LC: {
  1369. Parameter *pt = NULL;
  1370. int parser_status;
  1371. parser_status = parserParameter(CP_FUNC, &pt, true, false, false, true, MATHER_COMMA,
  1372. MATHER_COLON, -1);
  1373. if (!parser_status) {
  1374. freeToken(value_token, true);
  1375. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a dict parameter");
  1376. goto return_;
  1377. }
  1378. if (!checkToken(pm, MATHER_RC)) {
  1379. freeToken(value_token, true);
  1380. freeParameter(pt, true);
  1381. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a } after dict");
  1382. goto return_;
  1383. }
  1384. st = makeBaseDictStatement(pt, value_token->line, pm->file);
  1385. break;
  1386. }
  1387. case MATHER_BLOCK: {
  1388. Statement *block = NULL;
  1389. if (!callParserCode(CP_FUNC, &block, "Don't get a while code", value_token->line)) {
  1390. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get block command");
  1391. freeToken(value_token, true);
  1392. goto return_;
  1393. }
  1394. st = makeOperationStatement(OPT_BLOCK, block, NULL);
  1395. break;
  1396. }
  1397. case MATHER_PRIVATE:
  1398. case MATHER_PROTECT:
  1399. case MATHER_PUBLIC: {
  1400. if (MATHER_COLON != readBackToken(pm)) {
  1401. syntaxError(pm, syntax_error, value_token->line, 1, "Don't get a : after aut token");
  1402. freeToken(value_token, true);
  1403. goto return_;
  1404. }
  1405. delToken(pm);
  1406. if (!callChildStatement(CP_FUNC, parserBaseValue, BASEVALUE, &st, "Don't get Base Value after aut token")) {
  1407. freeToken(value_token, true);
  1408. goto return_;
  1409. }
  1410. switch (value_token->token_type) {
  1411. case MATHER_PROTECT:
  1412. st->aut = protect_aut;
  1413. break;
  1414. case MATHER_PRIVATE:
  1415. st->aut = private_aut;
  1416. break;
  1417. case MATHER_PUBLIC:
  1418. st->aut = public_aut;
  1419. break;
  1420. }
  1421. break;
  1422. }
  1423. default:{
  1424. backToken_(pm, value_token);
  1425. goto return_;
  1426. }
  1427. }
  1428. freeToken(value_token, false);
  1429. addStatementToken(BASEVALUE, st, pm);
  1430. return_: return;
  1431. }