1
0

grammar.c 40 KB

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