grammar.c 40 KB

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