grammar.c 52 KB

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