grammar.c 28 KB

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