grammar.c 29 KB

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