core-lexical.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <cstdio>
  2. #include "parser.h"
  3. const char *str = "Hello_var\n"
  4. "10 20.32 100var\n"
  5. "|10 20.32|int->num\n"
  6. "|10||20.32|int->num\n"
  7. "{if true 10}\n"
  8. "of(HelloWorld)\n"
  9. "!(!) @(@) #(#)\n"
  10. "() [] {}\n"
  11. "Hello ;comment\n"
  12. "Hello ;;comment\n"
  13. "commment2;=\n"
  14. "var-200 ;; comment\n"
  15. ";; comment\n"
  16. ";= comment\n"
  17. ";= var-300\n";
  18. class ReaderString : public aFuncore::Reader {
  19. std::string str;
  20. size_t index;
  21. size_t len;
  22. public:
  23. ReaderString(std::string str_, const aFuntool::FilePath &path_) : Reader{path_, 0}, str{std::move(str_)} {
  24. index = 0;
  25. len = str.size();
  26. }
  27. size_t readText(char *dest, size_t read_len, ReadMode &mode) override {
  28. if (index == len) // 读取到末尾
  29. return 0;
  30. if (index + read_len > len) { // 超出长度范围
  31. read_len = len - index;
  32. mode = read_mode_finished;
  33. }
  34. memcpy(dest, str.c_str() + index, read_len);
  35. index += read_len;
  36. return read_len;
  37. }
  38. };
  39. int main() {
  40. auto reader = ReaderString(str, "str");
  41. auto parser = aFuncore::Parser(reader);
  42. aFuncore::Parser::TokenType tt;
  43. std::string text;
  44. do {
  45. tt = parser.getTokenFromLexical(text);
  46. printf("tt = %d, text = %s\n", tt, text.c_str());
  47. } while (tt != aFuncore::Parser::TK_EOF && tt != aFuncore::Parser::TK_ERROR);
  48. return 0;
  49. }