#pragma once #include "katom.h" // Finding katoms in text by MATCHING: at each // position, the katom type that matches the most characters wins, and the // position advances past it. No text is divided and no katom rewrite rule // is consulted. // // A COMPONENT, not a katomization method in itself -- which is what the // name says. The composition that makes a method of it, // katomize_text_by_matching(), lives in katomize.{h,cpp} beside the entry // point for katomization by rewriting, because naming the process is that // file's job and this one only supplies a way of doing part of it. // // It is built into libklammertext.so but NOTHING IN THE ENGINE CALLS IT: // katomization goes through katomize.{h,cpp}, which divides text by the // rules. This is the alternative, kept so the two stay comparable // (dbg/katomize_compare.sh --which category,matching) and so the question // stays open rather than being settled by deletion. // // The claim under test is not "this is faster" or "this is more correct". // It is that matching over the EXISTING katom_types table is easier for one // person to hold in their head than 30 ordered katom rewrite rules. It // diverges on 153 of 9,694 corpus lines, every one of them prose that // MENTIONS syntax rather than using it -- so the choice is not between two // readings of the language but between two behaviours on text that is not // quite in it. // The character stream to katoms, longest match at each position. No // rewriting, no recursion. katom_list katomize_by_matching(const std::string& s, const std::string& source, int source_line); // Desugaring only: the abbreviated form @name-arg-arg becomes the katoms // @name arg | arg @. A separate pass over the katom list, because it is a // separate job -- it INSERTS a delimiter that was not in the source, which // is a source-to-source transform and not a question about where katoms // begin and end. In katomization by rewriting these two jobs share one loop. katom_list expand_abbreviations(const katom_list& katoms); // Whether a katom type is something the SOURCE can contain. Five of the // katom_t values are processing STATES a katom is later moved into // (replaced, ignored, literal, eval_result, ws_added), not source // categories, and their entries in katom_types carry no usable pattern -- // four are the empty string, which as a regex matches everywhere and would // stall any katomizer. See notes/Klammertext_improvements.md ยง1: "katom_t // mixes source categories with processing states". The rewrite katomizer // never trips over this because it only ever asks whole-text "does this // match", and an empty pattern matches only the empty string there. bool appears_in_source(katom_t type);