1
0

chat-peg-parser.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #pragma once
  2. #include "chat.h"
  3. #include "peg-parser.h"
  4. class common_chat_peg_builder : public common_peg_parser_builder {
  5. public:
  6. static constexpr const char * REASONING_BLOCK = "reasoning-block";
  7. static constexpr const char * REASONING = "reasoning";
  8. static constexpr const char * CONTENT = "content";
  9. common_peg_parser reasoning_block(const common_peg_parser & p) { return tag(REASONING_BLOCK, p); }
  10. common_peg_parser reasoning(const common_peg_parser & p) { return tag(REASONING, p); }
  11. common_peg_parser content(const common_peg_parser & p) { return tag(CONTENT, p); }
  12. };
  13. inline common_peg_arena build_chat_peg_parser(const std::function<common_peg_parser(common_chat_peg_builder & builder)> & fn) {
  14. common_chat_peg_builder builder;
  15. builder.set_root(fn(builder));
  16. return builder.build();
  17. }
  18. class common_chat_peg_mapper {
  19. public:
  20. common_chat_msg & result;
  21. common_chat_peg_mapper(common_chat_msg & msg) : result(msg) {}
  22. virtual void from_ast(const common_peg_ast_arena & arena, const common_peg_parse_result & result);
  23. virtual void map(const common_peg_ast_node & node);
  24. };
  25. class common_chat_peg_native_builder : public common_chat_peg_builder {
  26. public:
  27. static constexpr const char * TOOL = "tool";
  28. static constexpr const char * TOOL_OPEN = "tool-open";
  29. static constexpr const char * TOOL_CLOSE = "tool-close";
  30. static constexpr const char * TOOL_ID = "tool-id";
  31. static constexpr const char * TOOL_NAME = "tool-name";
  32. static constexpr const char * TOOL_ARGS = "tool-args";
  33. common_peg_parser tool(const common_peg_parser & p) { return tag(TOOL, p); }
  34. common_peg_parser tool_open(const common_peg_parser & p) { return atomic(tag(TOOL_OPEN, p)); }
  35. common_peg_parser tool_close(const common_peg_parser & p) { return atomic(tag(TOOL_CLOSE, p)); }
  36. common_peg_parser tool_id(const common_peg_parser & p) { return atomic(tag(TOOL_ID, p)); }
  37. common_peg_parser tool_name(const common_peg_parser & p) { return atomic(tag(TOOL_NAME, p)); }
  38. common_peg_parser tool_args(const common_peg_parser & p) { return tag(TOOL_ARGS, p); }
  39. };
  40. class common_chat_peg_native_mapper : public common_chat_peg_mapper {
  41. common_chat_tool_call * current_tool;
  42. public:
  43. common_chat_peg_native_mapper(common_chat_msg & msg) : common_chat_peg_mapper(msg) {}
  44. void map(const common_peg_ast_node & node) override;
  45. };
  46. inline common_peg_arena build_chat_peg_native_parser(const std::function<common_peg_parser(common_chat_peg_native_builder & builder)> & fn) {
  47. common_chat_peg_native_builder builder;
  48. builder.set_root(fn(builder));
  49. return builder.build();
  50. }
  51. class common_chat_peg_constructed_builder : public common_chat_peg_builder {
  52. public:
  53. static constexpr const char * TOOL = "tool";
  54. static constexpr const char * TOOL_OPEN = "tool-open";
  55. static constexpr const char * TOOL_CLOSE = "tool-close";
  56. static constexpr const char * TOOL_NAME = "tool-name";
  57. static constexpr const char * TOOL_ARG = "tool-arg";
  58. static constexpr const char * TOOL_ARG_OPEN = "tool-arg-open";
  59. static constexpr const char * TOOL_ARG_CLOSE = "tool-arg-close";
  60. static constexpr const char * TOOL_ARG_NAME = "tool-arg-name";
  61. static constexpr const char * TOOL_ARG_STRING_VALUE = "tool-arg-string-value";
  62. static constexpr const char * TOOL_ARG_JSON_VALUE = "tool-arg-json-value";
  63. common_peg_parser tool(const common_peg_parser & p) { return tag(TOOL, p); }
  64. common_peg_parser tool_open(const common_peg_parser & p) { return atomic(tag(TOOL_OPEN, p)); }
  65. common_peg_parser tool_close(const common_peg_parser & p) { return atomic(tag(TOOL_CLOSE, p)); }
  66. common_peg_parser tool_name(const common_peg_parser & p) { return atomic(tag(TOOL_NAME, p)); }
  67. common_peg_parser tool_arg(const common_peg_parser & p) { return tag(TOOL_ARG, p); }
  68. common_peg_parser tool_arg_open(const common_peg_parser & p) { return atomic(tag(TOOL_ARG_OPEN, p)); }
  69. common_peg_parser tool_arg_close(const common_peg_parser & p) { return atomic(tag(TOOL_ARG_CLOSE, p)); }
  70. common_peg_parser tool_arg_name(const common_peg_parser & p) { return atomic(tag(TOOL_ARG_NAME, p)); }
  71. common_peg_parser tool_arg_string_value(const common_peg_parser & p) { return tag(TOOL_ARG_STRING_VALUE, p); }
  72. common_peg_parser tool_arg_json_value(const common_peg_parser & p) { return tag(TOOL_ARG_JSON_VALUE, p); }
  73. };
  74. class common_chat_peg_constructed_mapper : public common_chat_peg_mapper {
  75. common_chat_tool_call * current_tool;
  76. int arg_count = 0;
  77. bool needs_closing_quote = false;
  78. public:
  79. common_chat_peg_constructed_mapper(common_chat_msg & msg) : common_chat_peg_mapper(msg) {}
  80. void map(const common_peg_ast_node & node) override;
  81. };
  82. inline common_peg_arena build_chat_peg_constructed_parser(const std::function<common_peg_parser(common_chat_peg_constructed_builder & builder)> & fn) {
  83. common_chat_peg_constructed_builder builder;
  84. builder.set_root(fn(builder));
  85. return builder.build();
  86. }