syntactic.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #include <ctype.h>
  2. #include "aFunCore.h"
  3. #include "__code.h"
  4. #include "__parser.h"
  5. #include "parserl_warning_error.h"
  6. static void printSyntacticError(char *info, af_Parser *parser) {
  7. if (parser->error == NULL)
  8. return;
  9. fprintf(parser->error, "[Syntactic-Error] %s\n", info);
  10. parser->is_error = true;
  11. }
  12. static void printSyntacticWarning(char *info, af_Parser *parser) {
  13. if (parser->error == NULL)
  14. return;
  15. fprintf(parser->error, "[Syntactic-Warning] %s\n", info);
  16. }
  17. static bool getToken(af_Parser *parser) {
  18. if (parser->syntactic->back) {
  19. parser->syntactic->back = false;
  20. return true;
  21. }
  22. parser->syntactic->token = getTokenFromLexical(&parser->syntactic->text, parser);
  23. return parser->syntactic->token != TK_ERROR; // 非错误则返回true, 遇到错误则返回false
  24. }
  25. static bool goBackToken(af_Parser *parser) {
  26. if (parser->syntactic->back)
  27. return false; // 已经有一个回退
  28. parser->syntactic->back = true;
  29. return true;
  30. }
  31. static af_Code *codeList(size_t deep, af_Parser *parser);
  32. static af_Code *code(size_t deep, char prefix, af_Parser *parser) {
  33. af_Code *re;
  34. af_Code *code_list = NULL;
  35. deep++;
  36. getToken(parser);
  37. switch (parser->syntactic->token) {
  38. case TK_ELEMENT_SHORT:
  39. case TK_ELEMENT_LONG:
  40. re = makeElementCode(parser->syntactic->text, prefix, parser->reader->line, NULL);
  41. free(parser->syntactic->text);
  42. break;
  43. case TK_LP:
  44. if (deep <= SYNTACTIC_MAX_DEEP)
  45. code_list = codeList(deep, parser);
  46. else
  47. printSyntacticError(SYNTACTIC_TOO_DEEP(), parser);
  48. getToken(parser);
  49. switch (parser->syntactic->token) {
  50. case TK_RP:
  51. break;
  52. case TK_ERROR:
  53. freeAllCode(code_list);
  54. return NULL;
  55. default:
  56. goBackToken(parser);
  57. printSyntacticError(CodeEndError(") or !)"), parser);
  58. break;
  59. }
  60. re = makeBlockCode(parentheses, code_list, prefix, parser->reader->line, NULL, NULL);
  61. break;
  62. case TK_LB:
  63. if (deep <= SYNTACTIC_MAX_DEEP)
  64. code_list = codeList(deep, parser);
  65. else
  66. printSyntacticError(SYNTACTIC_TOO_DEEP(), parser);
  67. getToken(parser);
  68. switch (parser->syntactic->token) {
  69. case TK_RB:
  70. break;
  71. case TK_ERROR:
  72. freeAllCode(code_list);
  73. return NULL;
  74. default:
  75. goBackToken(parser);
  76. printSyntacticError(CodeEndError("] or @)"), parser);
  77. break;
  78. }
  79. re = makeBlockCode(brackets, code_list, prefix, parser->reader->line, NULL, NULL);
  80. break;
  81. case TK_LC:
  82. if (deep <= SYNTACTIC_MAX_DEEP)
  83. code_list = codeList(deep, parser);
  84. else
  85. printSyntacticError(SYNTACTIC_TOO_DEEP(), parser);
  86. getToken(parser);
  87. switch (parser->syntactic->token) {
  88. case TK_RC:
  89. break;
  90. case TK_ERROR:
  91. freeAllCode(code_list);
  92. return NULL;
  93. default:
  94. goBackToken(parser);
  95. printSyntacticError(CodeEndError("} or #)"), parser);
  96. break;
  97. }
  98. re = makeBlockCode(curly, code_list, prefix, parser->reader->line, NULL, NULL);
  99. break;
  100. case TK_ERROR:
  101. return NULL;
  102. default:
  103. printSyntacticError(CodeStartError(), parser);
  104. return NULL;
  105. }
  106. if (re == NULL)
  107. printSyntacticError(MakeCodeFail(), parser);
  108. return re;
  109. }
  110. static af_Code *codePrefix(size_t deep, af_Parser *parser) {
  111. char ch = NUL;
  112. getToken(parser);
  113. if (parser->syntactic->token != TK_PREFIX) {
  114. goBackToken(parser);
  115. printSyntacticError(PREFIX_ERROR(codePrefix), parser);
  116. } else if (STR_LEN( parser->syntactic->text) != 1) {
  117. printSyntacticError(PREFIX_ERROR(codePrefix), parser);
  118. free(parser->syntactic->text);
  119. } else {
  120. ch = *(parser->syntactic->text);
  121. free(parser->syntactic->text);
  122. }
  123. return code(deep, ch, parser);
  124. }
  125. static af_Code *codeList(size_t deep, af_Parser *parser) {
  126. af_Code *re = NULL;
  127. af_Code **pre = &re;
  128. af_Code *code_list;
  129. while (1) {
  130. getToken(parser);
  131. switch (parser->syntactic->token) {
  132. case TK_PREFIX:
  133. goBackToken(parser);
  134. code_list = codePrefix(deep, parser);
  135. if (code_list != NULL)
  136. pre = &(pushCode(pre, code_list)->next);
  137. break;
  138. case TK_ELEMENT_SHORT:
  139. case TK_ELEMENT_LONG:
  140. case TK_LP:
  141. case TK_LB:
  142. case TK_LC:
  143. goBackToken(parser);
  144. code_list = code(deep, NUL, parser);
  145. if (code_list != NULL)
  146. pre = &(pushCode(pre, code_list)->next);
  147. break;
  148. case TK_ERROR:
  149. freeAllCode(re);
  150. return NULL;
  151. default: /* 结束 */
  152. goBackToken(parser);
  153. return re;
  154. }
  155. }
  156. }
  157. static af_Code *codeListEnd(af_Parser *parser) {
  158. af_Code *re = NULL;
  159. af_Code **pre = &re;
  160. af_Code *code_list;
  161. getToken(parser);
  162. switch (parser->syntactic->token) {
  163. case TK_EOF:
  164. break; // 结束
  165. case TK_PREFIX:
  166. case TK_ELEMENT_SHORT:
  167. case TK_ELEMENT_LONG:
  168. case TK_LP:
  169. case TK_LB:
  170. case TK_LC:
  171. goBackToken(parser);
  172. code_list = codeList(0, parser);
  173. pushCode(pre, code_list);
  174. getToken(parser);
  175. switch (parser->syntactic->token) {
  176. case TK_EOF:
  177. break; // 正常结束
  178. case TK_ERROR:
  179. freeAllCode(re);
  180. return NULL;
  181. default:
  182. printSyntacticError(CodeListEndError(), parser);
  183. freeAllCode(re);
  184. return NULL;
  185. }
  186. break;
  187. case TK_ERROR:
  188. return NULL;
  189. default:
  190. printSyntacticError(CodeListStartError(), parser);
  191. return NULL;
  192. }
  193. return re;
  194. }
  195. af_Code *parserCode(FilePath file, af_Parser *parser) {
  196. af_Code *code = codeListEnd(parser);
  197. if (file == NULL)
  198. return NULL;
  199. if (parser->is_error) {
  200. freeAllCode(code);
  201. return NULL;
  202. }
  203. if (code != NULL)
  204. code->path = pathCopy(file);
  205. return code;
  206. }