Setting up the use of this module.

§1. This section simply sets up the module in ways expected by foundation, and contains no code of interest. The following constant exists only in tools which use this module:

define LINGUISTICS_MODULE TRUE

§2. This module defines the following classes:

enumerate adjective_CLASS 
enumerate article_CLASS 
enumerate article_usage_CLASS 
enumerate quantifier_CLASS 
enumerate determiner_CLASS 
enumerate grammatical_category_CLASS 
enumerate linguistic_stock_item_CLASS 
enumerate grammatical_usage_CLASS 
enumerate verb_CLASS 
enumerate verb_form_CLASS 
enumerate verb_meaning_CLASS 
enumerate verb_sense_CLASS 
enumerate verb_usage_CLASS 
enumerate verb_usage_tier_CLASS 
enumerate preposition_CLASS 
enumerate noun_CLASS 
enumerate noun_usage_CLASS 
enumerate pronoun_CLASS 
enumerate pronoun_usage_CLASS 
enumerate small_word_set_CLASS 
enumerate special_meaning_holder_CLASS 
enumerate time_period_CLASS 
DECLARE_CLASS(adjective)
DECLARE_CLASS(article)
DECLARE_CLASS(article_usage)
DECLARE_CLASS(quantifier)
DECLARE_CLASS(determiner)
DECLARE_CLASS(grammatical_category)
DECLARE_CLASS(linguistic_stock_item)
DECLARE_CLASS(grammatical_usage)
DECLARE_CLASS(verb)
DECLARE_CLASS(verb_form)
DECLARE_CLASS_ALLOCATED_IN_ARRAYS(verb_meaning, 100)
DECLARE_CLASS(verb_sense)
DECLARE_CLASS(verb_usage)
DECLARE_CLASS(verb_usage_tier)
DECLARE_CLASS(preposition)
DECLARE_CLASS(time_period)
DECLARE_CLASS(noun)
DECLARE_CLASS(noun_usage)
DECLARE_CLASS(pronoun)
DECLARE_CLASS(pronoun_usage)
DECLARE_CLASS(special_meaning_holder)
DECLARE_CLASS(small_word_set)

§3. Like all modules, this one must define a start and end function:

enumerate LINGUISTIC_STOCK_DA 
enumerate TIME_PERIODS_DA 
enumerate VERB_USAGES_DA 
enumerate VERB_FORMS_DA 
COMPILE_WRITER(noun *, Nouns::log)

void LinguisticsModule::start(void) {
    Register this module's debugging log aspects3.1;
    Register this module's debugging log writers3.2;
    Declare new memory allocation reasons3.3;
    Stock::create_categories();
    Cardinals::enable_in_word_form();
    Articles::mark_for_preform();
    Prepositions::mark_for_preform();
    Diagrams::declare_annotations();
}
void LinguisticsModule::end(void) {
}

§3.1. Register this module's debugging log aspects3.1 =

    Log::declare_aspect(LINGUISTIC_STOCK_DA, U"linguistic stock", FALSE, FALSE);
    Log::declare_aspect(TIME_PERIODS_DA, U"time periods", FALSE, FALSE);
    Log::declare_aspect(VERB_USAGES_DA, U"verb usages", FALSE, TRUE);
    Log::declare_aspect(VERB_FORMS_DA, U"verb forms", FALSE, TRUE);

§3.2. Register this module's debugging log writers3.2 =

    Writers::register_logger('t', Occurrence::log);
    Writers::register_logger('p', Prepositions::log);
    Writers::register_logger('w', Verbs::log_verb);
    Writers::register_logger('y', VerbMeanings::log);
    REGISTER_WRITER('z', Nouns::log);

§3.3. Not all of our memory will be claimed in the form of structures: now and then we need to use the equivalent of traditional malloc and calloc routines.

enumerate STOCK_MREASON 
enumerate SWS_MREASON 

Declare new memory allocation reasons3.3 =

    Memory::reason_name(STOCK_MREASON, "linguistic stock array");
    Memory::reason_name(SWS_MREASON, "small word set array");

§4. This module requires words, which contains the Preform parser. When that initialises, it calls the following routine to improve its performance.

define PREFORM_OPTIMISER_WORDS_CALLBACK LinguisticsModule::preform_optimiser
int first_round_of_nt_optimisation_made = FALSE;
void LinguisticsModule::preform_optimiser(void) {
    Cardinals::preform_optimiser();
    VerbUsages::preform_optimiser();
    Prepositions::preform_optimiser();
    if (first_round_of_nt_optimisation_made == FALSE) {
        first_round_of_nt_optimisation_made = TRUE;
        Quantifiers::make_built_in();
    }
}