This part could just have been: char_('\x21', '\x7e') | char_('\t') | char_(' '). You might want to reorder it for the most common stuff to come first. Oh, since you put it in an omit below, it's even simpler: char_('\x21', '\x7e') | '\y' | ' '.
I just wanted to chime in and say that this feedback actually worked and the code is a good bit cleaner now! // reason-phrase = 1*( HTAB / SP / VCHAR / obs-text ) // VCHAR = %x21-7E auto const on_reason_phrase = [](auto &ctx) { auto sv = _attr(ctx); response::metadata &md = _globals(ctx).md_; md.reason_phrase_begin_ = sv.begin(); md.reason_phrase_end_ = sv.end(); md.status_line_end_ = sv.end(); }; auto const reason_phrase = parser::string_view[+(parser::char_('\x21', '\x7e') | '\t' | ' ')] [on_reason_phrase]; The `string_view[]` directive was very sorely missing from X3 the last time I used it in any serious capacity. Thanks for the feedback, Zach! This code actually looks really nice now. - Christian