Jump to content

Connect SuperML | Leeroopedia MCP: Equip your AI agents with best practices, code verification, and debugging knowledge. Powered by Leeroo — building Organizational Superintelligence. Contact us at founders@leeroo.com.

Implementation:Ggml org Llama cpp Chat Peg Parser Header

From Leeroopedia
Knowledge Sources
Domains Chat, Parsing
Last Updated 2026-02-15 00:00 GMT

Overview

Declares the PEG parser builder and mapper class hierarchies for constructing PEG grammars and converting their AST output into structured chat messages.

Description

Defines three builder hierarchies that extend `common_peg_parser_builder`: `common_chat_peg_builder` (base, with REASONING/CONTENT tags), `common_chat_peg_native_builder` (adds TOOL_OPEN/NAME/ID/ARGS tags for models with native JSON tool arguments), and `common_chat_peg_constructed_builder` (adds TOOL_ARG_NAME/STRING_VALUE/JSON_VALUE tags for models with structured per-argument output). Each builder has a corresponding mapper class that traverses PEG AST nodes and populates a `common_chat_msg`. Inline helper functions (`build_chat_peg_parser`, `build_chat_peg_native_parser`, `build_chat_peg_constructed_parser`) simplify parser construction via lambdas.

Usage

Use this header when implementing PEG-based parsing for chat model output formats. The three builder levels support different tool call structure granularities, from simple content/reasoning extraction to full per-argument tool call parsing.

Code Reference

Source Location

Signature

// Base builder - reasoning and content tags
class common_chat_peg_builder : public common_peg_parser_builder {
  public:
    static constexpr const char * REASONING_BLOCK = "reasoning-block";
    static constexpr const char * REASONING = "reasoning";
    static constexpr const char * CONTENT = "content";
    common_peg_parser reasoning_block(const common_peg_parser & p);
    common_peg_parser reasoning(const common_peg_parser & p);
    common_peg_parser content(const common_peg_parser & p);
};

// Native builder - tool calls with JSON args
class common_chat_peg_native_builder : public common_chat_peg_builder {
  public:
    static constexpr const char * TOOL_OPEN = "tool-open";
    static constexpr const char * TOOL_NAME = "tool-name";
    static constexpr const char * TOOL_ID = "tool-id";
    static constexpr const char * TOOL_ARGS = "tool-args";
    // ... builder methods
};

// Constructed builder - per-argument tool calls
class common_chat_peg_constructed_builder : public common_chat_peg_builder {
  public:
    static constexpr const char * TOOL_ARG_NAME = "tool-arg-name";
    static constexpr const char * TOOL_ARG_STRING_VALUE = "tool-arg-string-value";
    static constexpr const char * TOOL_ARG_JSON_VALUE = "tool-arg-json-value";
    // ... builder methods
};

// Mapper classes
class common_chat_peg_mapper { /* base mapper */ };
class common_chat_peg_native_mapper : public common_chat_peg_mapper { /* native tool call mapper */ };
class common_chat_peg_constructed_mapper : public common_chat_peg_mapper { /* constructed tool call mapper */ };

// Factory functions
inline common_peg_arena build_chat_peg_parser(const std::function<...> & fn);
inline common_peg_arena build_chat_peg_native_parser(const std::function<...> & fn);
inline common_peg_arena build_chat_peg_constructed_parser(const std::function<...> & fn);

Import

#include "chat.h"
#include "peg-parser.h"

I/O Contract

Inputs

Name Type Required Description
fn std::function lambda Yes Lambda receiving a builder reference, returning a PEG parser root rule
msg common_chat_msg& Yes Mutable chat message reference to populate during AST mapping
node common_peg_ast_node Yes Individual AST node to map

Outputs

Name Type Description
common_peg_arena object Compiled PEG grammar arena ready for parsing
common_chat_msg struct Populated chat message with content, reasoning, and tool calls

Usage Examples

#include "chat-peg-parser.h"

// Build a native PEG parser for tool calls
auto arena = build_chat_peg_native_parser([](common_chat_peg_native_builder & b) {
    auto tool = b.tool(b.seq({
        b.tool_open(b.lit("<tool_call>")),
        b.tool_name(b.until(b.lit("\n"))),
        b.tool_args(b.until(b.lit("</tool_call>"))),
        b.tool_close(b.lit("</tool_call>"))
    }));
    return b.seq({
        b.opt(b.reasoning_block(b.reasoning(b.until(b.lit("</think>"))))),
        b.content(b.until(b.lookahead(b.lit("<tool_call>")))),
        b.many(tool)
    });
});

// Parse and map
auto result = arena.parse(model_output);
common_chat_msg msg;
common_chat_peg_native_mapper mapper(msg);
mapper.from_ast(arena.ast_arena(), result);

Related Pages

Page Connections

Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment