syntactic.c 7.0 KB

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