grammar.c 31 KB

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