grammar.c 32 KB

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