syntactic.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "core-parser.h"
  2. #include "core-init.h"
  3. namespace aFuncore {
  4. bool Parser::getToken() {
  5. if (syntactic.back) {
  6. syntactic.back = false;
  7. return true;
  8. }
  9. syntactic.token = getTokenFromLexical(syntactic.text);
  10. return syntactic.token != TK_ERROR; // 非错误则返回true, 遇到错误则返回false
  11. }
  12. bool Parser::goBackToken() {
  13. if (syntactic.back)
  14. return false; // 已经有一个回退
  15. syntactic.back = true;
  16. return true;
  17. }
  18. Code::ByteCode *Parser::codeSelf(Code &code, size_t depth, char prefix) { // NOLINT
  19. depth++;
  20. getToken();
  21. switch (syntactic.token) {
  22. case TK_ELEMENT_SHORT:
  23. case TK_ELEMENT_LONG:
  24. return new Code::ByteCode(code, syntactic.text, reader.getFileLine(), prefix);
  25. case TK_LP: {
  26. Code::ByteCode *code_list;
  27. if (depth <= SYNTACTIC_MAX_DEPTH) {
  28. code_list = codeList(code, depth);
  29. code_list = new Code::ByteCode(code, Code::ByteCode::block_p, code_list, reader.getFileLine(), prefix);
  30. } else {
  31. pushEvent({ParserEvent::syntactic_error_nested_too_deep, reader.getFileLine(), ""});
  32. syntactic.is_error = true;
  33. return nullptr;
  34. }
  35. getToken();
  36. if (syntactic.token != TK_RP && syntactic.token != TK_ERROR) {
  37. goBackToken();
  38. pushEvent({ParserEvent::syntactic_error_block_p_end, reader.getFileLine(), ""});
  39. syntactic.is_error = true;
  40. }
  41. return code_list;
  42. }
  43. case TK_LB: {
  44. Code::ByteCode *code_list;
  45. if (depth <= SYNTACTIC_MAX_DEPTH) {
  46. code_list = codeList(code, depth);
  47. code_list = new Code::ByteCode(code, Code::ByteCode::block_b, code_list, reader.getFileLine(), prefix);
  48. } else {
  49. pushEvent({ParserEvent::syntactic_error_nested_too_deep, reader.getFileLine(), ""});
  50. syntactic.is_error = true;
  51. return nullptr;
  52. }
  53. getToken();
  54. if (syntactic.token != TK_RB && syntactic.token != TK_ERROR) {
  55. goBackToken();
  56. pushEvent({ParserEvent::syntactic_error_block_b_end, reader.getFileLine(), ""});
  57. syntactic.is_error = true;
  58. }
  59. return code_list;
  60. }
  61. case TK_LC: {
  62. Code::ByteCode *code_list;
  63. if (depth <= SYNTACTIC_MAX_DEPTH) {
  64. code_list = codeList(code, depth);
  65. code_list = new Code::ByteCode(code, Code::ByteCode::block_c, code_list, reader.getFileLine(), prefix);
  66. } else {
  67. pushEvent({ParserEvent::syntactic_error_nested_too_deep, reader.getFileLine(), ""});
  68. syntactic.is_error = true;
  69. return nullptr;
  70. }
  71. getToken();
  72. if (syntactic.token != TK_RC && syntactic.token != TK_ERROR) {
  73. goBackToken();
  74. pushEvent({ParserEvent::syntactic_error_block_c_end, reader.getFileLine(), ""});
  75. syntactic.is_error = true;
  76. }
  77. return code_list;
  78. }
  79. case TK_ERROR:
  80. return nullptr;
  81. default:
  82. pushEvent({ParserEvent::parser_error_unknown, reader.getFileLine(), ""});
  83. syntactic.is_error = true;
  84. return nullptr;
  85. }
  86. }
  87. Code::ByteCode *Parser::codePrefix(Code &code, size_t depth) { // NOLINT
  88. char ch = aFuntool::NUL;
  89. getToken();
  90. if (syntactic.token != TK_PREFIX) {
  91. goBackToken();
  92. pushEvent({ParserEvent::syntactic_error_prefix, reader.getFileLine(), ""});
  93. syntactic.is_error = true;
  94. } else if (syntactic.text.size() != 1) {
  95. pushEvent({ParserEvent::syntactic_error_prefix, reader.getFileLine(), ""});
  96. syntactic.is_error = true;
  97. } else
  98. ch = syntactic.text[0];
  99. return codeSelf(code, depth, ch);
  100. }
  101. Code::ByteCode *Parser::codeList(Code &code, size_t depth) { // NOLINT
  102. Code::ByteCode *re = nullptr;
  103. Code::ByteCode *new_re = nullptr;
  104. Code::ByteCode *code_list;
  105. while (true) {
  106. getToken();
  107. switch (syntactic.token) {
  108. case TK_PREFIX:
  109. goBackToken();
  110. code_list = codePrefix(code, depth);
  111. if (code_list != nullptr) {
  112. if (new_re == nullptr) {
  113. re = code_list;
  114. new_re = re->connect(nullptr);
  115. } else
  116. new_re = new_re->connect(code_list);
  117. }
  118. break;
  119. case TK_ELEMENT_SHORT:
  120. case TK_ELEMENT_LONG:
  121. case TK_LP:
  122. case TK_LB:
  123. case TK_LC:
  124. goBackToken();
  125. code_list = codeSelf(code, depth, aFuntool::NUL);
  126. if (code_list != nullptr) {
  127. if (new_re == nullptr) {
  128. re = code_list;
  129. new_re = re->connect(nullptr);
  130. } else
  131. new_re = new_re->connect(code_list);
  132. }
  133. break;
  134. case TK_ERROR:
  135. return re;
  136. default: /* 结束 */
  137. goBackToken();
  138. return re;
  139. }
  140. }
  141. }
  142. Code::ByteCode *Parser::codeListEnd(Code &code) {
  143. getToken();
  144. switch (syntactic.token) {
  145. case TK_EOF:
  146. case TK_ERROR:
  147. return nullptr; // 结束
  148. case TK_PREFIX:
  149. case TK_ELEMENT_SHORT:
  150. case TK_ELEMENT_LONG:
  151. case TK_LP:
  152. case TK_LB:
  153. case TK_LC: {
  154. goBackToken();
  155. Code::ByteCode *re = codeList(code, 0);
  156. getToken();
  157. if (syntactic.token != TK_EOF && syntactic.token != TK_ERROR) {
  158. pushEvent({ParserEvent::parser_error_unknown, reader.getFileLine(), ""});
  159. syntactic.is_error = true;
  160. }
  161. return re;
  162. }
  163. default:
  164. pushEvent({ParserEvent::parser_error_unknown, reader.getFileLine(), ""});
  165. syntactic.is_error = true;
  166. return nullptr;
  167. }
  168. }
  169. bool Parser::parserCode(Code &code) {
  170. Code::ByteCode *bytecode = codeListEnd(code);
  171. code.getByteCode()->connect(bytecode);
  172. if (syntactic.is_error || reader.isError() || lexical.is_error)
  173. return false;
  174. return true;
  175. }
  176. }