The set of meaning codes used when Inform runs the excerpt parser.
§1. See Excerpt Meanings (in lexicon) for more, but briefly: the lexicon module provides a parser for "excerpts" of natural language text. The user of that module is supposed to provide bitmap-friendly codes which categorise the various meanings likely to be given. Several modules do this, but this is where the Inform compiler-specific codes appear.
define VOID_PHRASE_MC 0x00000010 e.g., award # points define VALUE_PHRASE_MC 0x00000020 e.g., number of rows in # define COND_PHRASE_MC 0x00000040 e.g., # has not ended define PROPERTY_MC 0x00000080 e.g., carrying capacity define NAMED_CONSTANT_MC 0x00000100 e.g., green define TABLE_MC 0x00000200 e.g., table of rankings define TABLE_COLUMN_MC 0x00000400 e.g., rank define RULE_MC 0x00000800 e.g., update chronological records rule define RULEBOOK_MC 0x00001000 e.g., instead define ACTIVITY_MC 0x00002000 e.g., reading a command define EQUATION_MC 0x00004000 e.g., Newton's Second Law define VARIABLE_MC 0x00008000 e.g., left hand status line define NAMED_AP_MC 0x00010000 e.g., bad behaviour define SAY_PHRASE_MC 0x00020000 e.g., say # in words define PHRASE_CONSTANT_MC 0x00040000 e.g., doubling function
§2. This one is used only by the if module, but let's define it here anyway:
define ACTION_PARTICIPLE_MC 0x02000000 a word like "taking"
§3. We use callback functions to tell lexicon any special rules for parsing excerpts with these codes:
define EM_CASE_SENSITIVITY_TEST_LEXICON_CALLBACK MeaningCodes::case_sensitivity define EM_ALLOW_BLANK_TEST_LEXICON_CALLBACK MeaningCodes::allow_blank define EM_IGNORE_DEFINITE_ARTICLE_TEST_LEXICON_CALLBACK MeaningCodes::ignore_definite_article
int MeaningCodes::case_sensitivity(unsigned int mc) { if (mc == SAY_PHRASE_MC) return TRUE; return FALSE; } int MeaningCodes::allow_blank(unsigned int mc) { if (mc == SAY_PHRASE_MC) return TRUE; return FALSE; } int MeaningCodes::ignore_definite_article(unsigned int mc) { if ((mc & SAY_PHRASE_MC) == 0) return TRUE; return FALSE; }
§4. We decide which form of parsing to use with the following bitmaps:
define EXACT_PARSING_BITMAP (MISCELLANEOUS_MC + PROPERTY_MC + ADJECTIVE_MC + NAMED_CONSTANT_MC + VARIABLE_MC + KIND_SLOW_MC + RULE_MC + RULEBOOK_MC + TABLE_MC + TABLE_COLUMN_MC + NAMED_AP_MC + ACTIVITY_MC + EQUATION_MC + PHRASE_CONSTANT_MC) define SUBSET_PARSING_BITMAP (NOUN_MC) define PARAMETRISED_PARSING_BITMAP (VOID_PHRASE_MC + VALUE_PHRASE_MC + COND_PHRASE_MC + SAY_PHRASE_MC)
§5. The lexicon module is generally quite uncomplaining, but:
define PROBLEM_LEXICON_CALLBACK MeaningCodes::linguistics_problem_handler
void MeaningCodes::linguistics_problem_handler(int err_no, wording W, void *ref, int k) { switch (err_no) { case TooLongName_LEXICONERROR: StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooLongName), "that seems to involve far too long a name", "since in general names are limited to a maximum of 32 words."); break; default: internal_error("unimplemented problem message"); } }
§6. Here we log a general bitmap made up from meaning codes:
define LOG_UNENUMERATED_NODE_TYPES_SYNTAX_CALLBACK MeaningCodes::log_meaning_code
void MeaningCodes::log_meaning_code(OUTPUT_STREAM, unsigned int mc) { int i, f = FALSE; unsigned int j; for (i=0, j=1; i<31; i++, j*=2) if (mc & j) { if (f) LOG(" + "); f = TRUE; switch (j) { case ACTION_PARTICIPLE_MC: WRITE("ACTION_PARTICIPLE_MC"); break; case ACTIVITY_MC: WRITE("ACTIVITY_MC"); break; case ADJECTIVE_MC: WRITE("ADJECTIVE_MC"); break; case COND_PHRASE_MC: WRITE("COND_PHRASE_MC"); break; case EQUATION_MC: WRITE("EQUATION_MC"); break; case I6_MC: WRITE("I6_MC"); break; case ING_MC: WRITE("ING_MC"); break; case KIND_FAST_MC: WRITE("KIND_FAST_MC"); break; case KIND_SLOW_MC: WRITE("KIND_SLOW_MC"); break; case MISCELLANEOUS_MC: WRITE("MISCELLANEOUS_MC"); break; case NAMED_AP_MC: WRITE("NAMED_AP_MC"); break; case NAMED_CONSTANT_MC: WRITE("NAMED_CONSTANT_MC"); break; case NOUN_MC: WRITE("NOUN_MC"); break; case NUMBER_MC: WRITE("NUMBER_MC"); break; case ORDINAL_MC: WRITE("ORDINAL_MC"); break; case PHRASE_CONSTANT_MC: WRITE("PHRASE_CONSTANT_MC"); break; case PREPOSITION_MC: WRITE("PREPOSITION_MC"); break; case PROPERTY_MC: WRITE("PROPERTY_MC"); break; case RULE_MC: WRITE("RULE_MC"); break; case RULEBOOK_MC: WRITE("RULEBOOK_MC"); break; case SAY_PHRASE_MC: WRITE("SAY_PHRASE_MC"); break; case TABLE_COLUMN_MC: WRITE("TABLE_COLUMN_MC"); break; case TABLE_MC: WRITE("TABLE_MC"); break; case TEXT_MC: WRITE("TEXT_MC"); break; case TEXTWITHSUBS_MC: WRITE("TEXTWITHSUBS_MC"); break; case VALUE_PHRASE_MC: WRITE("VALUE_PHRASE_MC"); break; case VARIABLE_MC: WRITE("VARIABLE_MC"); break; case VOID_PHRASE_MC: WRITE("VOID_PHRASE_MC"); break; default: WRITE("<unknown-mc>"); break; } } }