Files

51 lines
2.7 KiB
C++
Raw Permalink Normal View History

#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);