grammar.c 31 KB

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