grammar.c 31 KB

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