10template <
size_t FieldCount>
13 std::array<size_t, FieldCount>
27template <
size_t MaxFieldCount>
30 std::array<size_t, MaxFieldCount>
order{};
37 [[nodiscard]]
consteval Error Text(
size_t,
size_t)
const {
return Error::None; }
39 [[nodiscard]]
consteval Error Field(
const ParsedField& field)
42 size_t used_argument_count = field.arg_index + 1;
51#include "format_frontend_parser.hpp"
62[[nodiscard]]
consteval Error
WalkSource(std::string_view source,
auto& visitor)
66 return Error::EmbeddedNul;
70 size_t text_begin = 0;
73 while (pos < source.size())
75 if (source[pos] ==
'{')
77 if (pos + 1 < source.size() && source[pos + 1] ==
'{')
79 auto error = visitor.Text(text_begin, pos - text_begin);
80 if (error != Error::None)
84 error = visitor.Text(pos, 1);
85 if (error != Error::None)
94 auto error = visitor.Text(text_begin, pos - text_begin);
95 if (error != Error::None)
101 error =
ParseField(source, pos, indexing, field);
102 if (error != Error::None)
107 error = visitor.Field(field);
108 if (error != Error::None)
117 if (source[pos] ==
'}')
119 if (pos + 1 < source.size() && source[pos + 1] ==
'}')
121 auto error = visitor.Text(text_begin, pos - text_begin);
122 if (error != Error::None)
126 error = visitor.Text(pos, 1);
127 if (error != Error::None)
136 return Error::UnmatchedBrace;
142 return visitor.Text(text_begin, source.size() - text_begin);
154template <Text Source>
157 constexpr auto scratch = []()
consteval
160 visitor.
error =
WalkSource(std::string_view(Source.Data(), Source.Size()), visitor);
164 SourceAnalysis<scratch.field_count> result{};
165 result.required_argument_count = scratch.required_argument_count;
166 result.error = scratch.error;
167 for (
size_t i = 0; i < scratch.field_count; ++i)
169 result.argument_order[i] = scratch.order[i];
printf 降级阶段共享的描述表与策略辅助函数 / Shared descriptor-table and policy helpers for printf lowering
constexpr bool HasEmbeddedNul(std::string_view source)
判断源字符串在终止前是否包含嵌入式 NUL / Return whether the source contains an embedded NUL before the terminator
consteval Error ParseField(std::string_view source, size_t &pos, IndexingState &indexing, ParsedField &field)
解析一个完整 brace 字段,从 { 一直到匹配的 } / Parse one complete brace field from { through the matching }
consteval auto Analyze()
对一个 brace 字面量执行仅源串分析,并返回按顺序整理的参数索引摘要 / Run source-only analysis for one brace literal and return the ...
consteval Error WalkSource(std::string_view source, auto &visitor)
遍历一个 brace 源字符串,并发射字面文本片段与已解析字段 / Walk one brace source string and emit literal-text spans plus parse...
brace 字段自动索引与手动索引的源级状态 / Source-level indexing mode for automatic versus manual brace fields
单条 brace 风格格式字面量的仅源串分析数据 / Source-only analysis data for one brace-style format literal
size_t required_argument_count
minimum call-site argument count / 调用点至少需要的参数个数
std::array< size_t, FieldCount > argument_order
Error error
first source-only parse error / 首个仅源串解析错误
仅源串分析阶段使用的保守临时累加器 / Conservative temporary accumulator used during source-only analysis
std::array< size_t, MaxFieldCount > order
field-ordered source argument indexes / 按字段顺序排列的源参数索引
Error error
first parse error / 首个解析错误
size_t required_argument_count
minimum call-site argument count / 调用点至少需要的参数个数
size_t field_count
parsed replacement-field count / 已解析的替换字段数量