§1. Initially, the invocations (parsed as just UNKNOWN_NT) defining a
-rule (RULE_NT) are simply listed after it in the parse tree, but we
-want them to become its children, and we give them the node type
-INVOCATION_LIST_NT.
-
-
-
This function is used whenever new material is added. Whenever it finds a
-childless RULE_NT followed by a sequence of UNKNOWN_NT nodes, it
-joins these in sequence as children of the RULE_NT. Since it always
-acts so as to leave a non-zero number of children, and since it acts only
-on childless nodes, it cannot ever act on the same node twice.
+
§1. Blocks of imperative code in Inform 7 source text enter the syntax tree
+at IMPERATIVE_NT nodes: some define phrases, some define rules. Those nodes
+are initially followed by a run of UNKNOWN_NT nodes for the actual code.
+The process of "acceptance" turns such definitions into a subtree, as
+follows:
-voidRuleSubtrees::register_recently_lexed_phrases(void) {
+IMPERATIVE_NT 'every turn' IMPERATIVE_NT 'every turn
+UNKNOWN_NT 'say "Hello!"' --> INVOCATION_LIST_NT 'say "Hello!"'
+UNKNOWN_NT 'now the guard is alert' INVOCATION_LIST_NT 'now the guard is alert'
+
+
ImperativeSubtrees::accept needs to be called on every IMPERATIVE_NT node in order
+for this to work; note that it does nothing further, but also causes no harm,
+if called multiple times on the same node. ImperativeSubtrees::accept_all can
+therefore safely be used to sweep up any IMPERATIVE_NT nodes not already processed.
+
+
+
+voidImperativeSubtrees::accept_all(void) {if (problem_count > 0) return; for then the tree is perhaps broken anyway
-SyntaxTree::traverse(Task::syntax_tree(), RuleSubtrees::demote_command_nodes);
+SyntaxTree::traverse(Task::syntax_tree(), ImperativeSubtrees::accept);}
-voidRuleSubtrees::demote_command_nodes(parse_node *p) {
-if ((Node::get_type(p) == RULE_NT) && (p->down == NULL)) {
+voidImperativeSubtrees::accept(parse_node *p) {
+if ((Node::get_type(p) == IMPERATIVE_NT) && (p->down == NULL)) {parse_node *end_def = p;while ((end_def->next) && (Node::get_type(end_def->next) == UNKNOWN_NT))end_def = end_def->next;
-if (p == end_def) return; RULE_NT not followed by any UNKNOWN_NTs
+if (p == end_def) return; IMPERATIVE_NT not followed by any UNKNOWN_NTs splice so that p->next to end_def become the children of p:p->down = p->next;p->next = end_def->next;end_def->next = NULL;for (parse_node *inv_p = p->down; inv_p; inv_p = inv_p->next)Node::set_type(inv_p, INVOCATION_LIST_NT);
-RuleSubtrees::parse_routine_structure(p);
+Parse the structure of the code block1.1; }}
-
§2. Parsing Routine Structure. There are now two possible syntaxes to express the structural makeup of a
-routine. Traditional I7 syntax for blocks is to place them within begin/end
-markers: the "begin" occurring at the end of the conditional or loop header,
-and the "end if", "end while", etc., as a phrase of its own at the end of
-the block. Newer I7 syntax (March 2008) is to use Python-style colons and
-indentation. Both are allowed, but not in the same routine.
+
§1.1. After acceptance, and therefore exactly once, the structure of the code in
+the definition is parsed and checked for sanity.
-
This routine opens with the routine's parse tree consisting of a simple
-linked list of code-point nodes, one for each phrase. We must work out
-which syntax is used, decipher it, and turn the list into a proper tree
-structure in a single unified format.
+
Though it is now a historical relic, Inform has two different syntaxes for
+blocks of code: "colon syntax", introduced in March 2008, which uses Python-like
+colons and indentation to show structural subdivision; and "begin/end syntax",
+which uses explicit marker phrases like "end if" and "end while". The compiler
+continues to support both though they cannot be mixed in a single IMPERATIVE_NT
+subtree.
-
How much simpler this would all be if we could abolish the old format, but
-it's kept for the benefit of partially sighted users, who find tabbed
-indentation difficult to manage with screen-readers.
+
The old syntax is retained not for compatibility with old code — very little
+remains from the pre-2008 era which has not been modernised — but because
+some partially sighted users find tabbed indentation difficult to manage
+with screen-readers.
+
+
+
Here, then, we must work out which syntax is used, decipher it, and turn the
+list into a proper tree structure in a single unified format. We will also
+try to find and report as many problems as we can which are due to code blocks
+being improperly opened or closed, because punctuation errors in rules are
+one of the biggest sources of beginners' difficulties with Inform, and we want
+to catch and report these problems early.
+
+
+
This means looking out for control structures such as "if" and "while": see
+Control Structures (in supervisor) for where these are defined.
+
§1.1.2. (a.2) Report problems if the two syntaxes are mixed up with each other1.1.2 =
if ((uses_colon_syntax) && (mispunctuates_begin_end_syntax)) {
-current_sentence = routine_node;
+current_sentence = imperative_node;Problems::quote_source(1, current_sentence);Problems::quote_source(2, mispunctuates_begin_end_syntax);StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BadOldSyntax));Problems::issue_problem_segment(
-"The rule or phrase definition %1 seems to use indentation and "
-"colons to group phrases together into 'if', 'repeat' or 'while' "
-"blocks. That's fine, but then this phrase seems to be missing "
-"some punctuation - %2. Perhaps a colon is missing?");
+"The rule or phrase definition %1 seems to use indentation and colons to group "
+"phrases together into 'if', 'repeat' or 'while' blocks. That's fine, but then "
+"this phrase seems to be missing some punctuation - %2. Perhaps a colon is missing?");Problems::issue_problem_end();return; }if ((uses_colon_syntax) && (uses_begin_end_syntax)) {
-current_sentence = routine_node;
+current_sentence = imperative_node;Problems::quote_source(1, current_sentence);Problems::quote_source(2, uses_colon_syntax);Problems::quote_source(3, uses_begin_end_syntax);StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_BothBlockSyntaxes));Problems::issue_problem_segment(
-"The rule or phrase definition %1 seems to use both ways of grouping "
-"phrases together into 'if', 'repeat' and 'while' blocks at once. "
-"Inform allows two alternative forms, but they cannot be mixed in "
-"the same definition. %POne way is to end the 'if', 'repeat' or "
-"'while' phrases with a 'begin', and then to match that with an "
-"'end if' or similar. ('Otherwise' or 'otherwise if' clauses are "
-"phrases like any other, and end with semicolons in this case.) "
+"The rule or phrase definition %1 seems to use both ways of grouping phrases "
+"together into 'if', 'repeat' and 'while' blocks at once. Inform allows two "
+"alternative forms, but they cannot be mixed in the same definition. %P"
+"One way is to end the 'if', 'repeat' or 'while' phrases with a 'begin', and "
+"then to match that with an 'end if' or similar. ('Otherwise' or 'otherwise if' "
+"clauses are phrases like any other, and end with semicolons in this case.) ""You use this begin/end form here, for instance - %3. %P"
-"The other way is to end with a colon ':' and then indent the "
-"subsequent phrases underneath, using tabs. (Note that any "
-"'otherwise' or 'otherwise if' clauses also have to end with "
-"colons in this case.) You use this indented form here - %2.");
+"The other way is to end with a colon ':' and then indent the subsequent phrases "
+"underneath, using tabs. (Note that any 'otherwise' or 'otherwise if' clauses "
+"also have to end with colons in this case.) You use this indented form here - %2.");Problems::issue_problem_end();return; }if ((requires_colon_syntax) && (uses_begin_end_syntax)) {
-current_sentence = routine_node;
+current_sentence = imperative_node;Problems::quote_source(1, current_sentence);Problems::quote_source(2, requires_colon_syntax);StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotInOldSyntax));Problems::issue_problem_segment(
-"The construction %2, in the rule or phrase definition %1, "
-"is only allowed if the rule is written in the 'new' format, "
-"that is, with the phrases written one to a line with "
-"indentation showing how they are grouped together, and "
-"with colons indicating the start of such a group.");
+"The construction %2, in the rule or phrase definition %1, is only allowed if the "
+"rule is written in the 'new' format, that is, with the phrases written one to a "
+"line with indentation showing how they are grouped together, and with colons "
+"indicating the start of such a group.");Problems::issue_problem_end();return; }
§1.1.3. If we're using Pythonesque notation, then the number of tab stops of
indentation of a phrase tells us where it belongs in the structure, so
we mark up the tree with that information.
-
(b.1) Annotate the parse tree with indentation levels2.3 =
+
(b.1) Annotate the parse tree with indentation levels1.1.3 =
§1.1.4. Note that we are a little cautious about recognising phrases which will
open blocks, such as "repeat...", because of the dangers of false positives;
so we look for the "begin" keyword, or the colon. We're less cautious with
subordinate phrases (such as "otherwise") because we know their wonding
more certainly, and similarly for "end X" phrases.
-
(b.2) Annotate the parse tree with control structure usage2.4 =
+
(b.2) Annotate the parse tree with control structure usage1.1.4 =
-for (parse_node *p = routine_node->down; p; p = p->next) {
+for (parse_node *p = imperative_node->down; p; p = p->next) {control_structure_phrase *csp;csp = ControlStructures::detect(Node::get_text(p));if (csp) {
@@ -313,26 +327,26 @@ more certainly, and similarly for "end X" phrases.
(<phrase-beginning-block>(Node::get_text(p))) || (csp->subordinate_to)) {Node::set_control_structure_used(p, csp);
-if (csp == case_CSP) Trim a switch case to just the case value2.4.1;
+if (csp == case_CSP) Trim a switch case to just the case value1.1.4.1; } }csp = ControlStructures::detect_end(Node::get_text(p));if (csp) Node::set_end_control_structure_used(p, csp); }
@@ -376,49 +390,49 @@ to break this up.
Annotations::read_int(p, indentation_level_ANNOT) + 1);Node::set_text(then_node, ACW);
-parse_node *last_node_of_if_construction = then_node, *rest_of_routine = p->next;
+parse_node *last_node_of_if_construction = then_node, *rest_of_defn = p->next; Attach the "then" node after the "if" node:p->next = then_node;
-Deal with an immediately following otherwise node, if there is one2.5.1.1;
+Deal with an immediately following otherwise node, if there is one1.1.5.1.1;if (uses_colon_syntax == FALSE) {
-last_node_of_if_construction->next = RuleSubtrees::end_node(p);
-last_node_of_if_construction->next->next = rest_of_routine;
+last_node_of_if_construction->next = ImperativeSubtrees::end_node(p);
+last_node_of_if_construction->next->next = rest_of_defn; } else {
-last_node_of_if_construction->next = rest_of_routine;
+last_node_of_if_construction->next = rest_of_defn; }
§1.1.6. If the old-style syntax is used, there are explicit "end if", "end repeat"
and "end while" nodes in the list already. But if the Pythonesque syntax is
used then we need to create these nodes and insert them into the list; we
do these by reading off the structure from the pattern of indentation. It's
@@ -461,7 +475,7 @@ quite a long task, since this pattern may contain errors, which we have to
report more or less helpfully.
-
(d) Insert end nodes and check the indentation2.6 =
+
(d) Insert end nodes and check the indentation1.1.6 =
§1.1.6.2. Here we set indent to the number of tab-stops in from the margin, or to
expected_indent if the text does not appear to be at the start of its own
line in the source (because it runs on from a previous phrase, in
which case we set the run_on_at flag: except for following on from cases
@@ -520,7 +534,7 @@ in switches with a non-control-structure, which is allowed, because otherwise
the lines often look silly and short).
-
Determine actual indentation of this phrase2.6.2 =
+
Determine actual indentation of this phrase1.1.6.2 =
§1.1.6.3. We now know the indent level of the line as read, and also the
expected_indent given the definition so far. If they agree, fine. If they
don't agree, it isn't necessarily bad news — if each line's indentation were
a function of the last, there would be no information in it, after all.
@@ -556,29 +570,29 @@ current block(s) has or have been closed, because blocks are indeed closed
implicitly just by moving the indentation back in.
-
Compare actual indentation to what we expect from structure so far2.6.3 =
+
Compare actual indentation to what we expect from structure so far1.1.6.3 =
§1.1.6.3.1. This is a small variation used for an intermediate phrase like "otherwise".
These are required to be at the same indentation as the line which opened the
block, rather than being one tab step in from there: in other words they are
not deemed part of the block itself. They can also occur in "stages", which
@@ -587,28 +601,28 @@ one — for instance, "otherwise if..." is not allowed after an "otherwise"
within an "if".
-
Compare actual indentation to what we expect for an intermediate phrase2.6.3.1 =
+
Compare actual indentation to what we expect for an intermediate phrase1.1.6.3.1 =
§1.1.6.5. Now for the closing of colon-syntax blocks. We know that blocks must be
being closed if the indentation has jumped backwards: but it may be that many
blocks are being closed at once. (It may also be that the indentation has
gone awry.)
-
Try closing blocks to bring expected indentation down to match2.6.5 =
+
Try closing blocks to bring expected indentation down to match1.1.6.5 =
§1.1.6.5.1. An end marker is a phrase like "end if" which matches the "if... begin"
above it: here we insert such a marker at a place where the source text
indentation implicitly requires it.
-
Insert end marker to match the opening of the block phrase2.6.5.1 =
+
Insert end marker to match the opening of the block phrase1.1.6.5.1 =
§1.1.6.6. ...and catch it with something of a catch-all message:
-
Issue problem message for misaligned indentation2.6.6 =
+
Issue problem message for misaligned indentation1.1.6.6 =
if (suppress_further_problems == FALSE) {
-LOG("$T\n", routine_node);
-current_sentence = routine_node;
+LOG("$T\n", imperative_node);
+current_sentence = imperative_node;Problems::quote_source_eliding_begin(1, current_sentence);Problems::quote_source_eliding_begin(2, first_misaligned_phrase);
-StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_MisalignedIndentation));
+StandardProblems::handmade_problem(Task::syntax_tree(),
+_p_(PM_MisalignedIndentation));Problems::issue_problem_segment(
-"The phrase or rule definition %1 is written using the 'colon "
-"and indentation' syntax for its 'if's, 'repeat's and 'while's, "
-"where blocks of phrases grouped together are indented one "
-"tab step inward from the 'if ...:' or similar phrase to which "
-"they belong. But the tabs here seem to be misaligned, and I can't "
-"determine the structure. The first phrase going awry in the "
-"definition seems to be %2, in case that helps. %PThis sometimes "
-"happens even when the code looks about right, to the eye, if rows "
+"The phrase or rule definition %1 is written using the 'colon and indentation' "
+"syntax for its 'if's, 'repeat's and 'while's, where blocks of phrases grouped "
+"together are indented one tab step inward from the 'if ...:' or similar phrase "
+"to which they belong. But the tabs here seem to be misaligned, and I can't "
+"determine the structure. The first phrase going awry in the definition seems "
+"to be %2, in case that helps. %P"
+"This sometimes happens even when the code looks about right, to the eye, if rows ""of spaces have been used to indent phrases instead of tabs.");Problems::Using::diagnose_further();Problems::issue_problem_end(); }
Issue problem message for an excess of indentation2.6.7 =
+
Issue problem message for an excess of indentation1.1.6.7 =
if (suppress_further_problems == FALSE) {
-current_sentence = routine_node;
+current_sentence = imperative_node;Problems::quote_source_eliding_begin(1, current_sentence);Problems::quote_source_eliding_begin(2, first_overindented_phrase);StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_TooMuchIndentation));Problems::issue_problem_segment(
-"The phrase or rule definition %1 is written using tab indentations "
-"to show how its phrases are to be grouped together. But the level "
-"of indentation goes far too deep, reaching more than 25 tab stops "
-"from the left margin.");
+"The phrase or rule definition %1 is written using tab indentations to show how "
+"its phrases are to be grouped together. But the level of indentation goes far "
+"too deep, reaching more than 25 tab stops from the left margin.");Problems::issue_problem_end(); }
§1.1.6.8. Issue problem message for run-ons within phrase definition1.1.6.8 =
if (suppress_further_problems == FALSE) {
-current_sentence = routine_node;
+current_sentence = imperative_node;Problems::quote_source_eliding_begin(1, current_sentence);Problems::quote_source_eliding_begin(2, run_on_at);
-StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_RunOnsInTabbedRoutine));
+StandardProblems::handmade_problem(Task::syntax_tree(),
+_p_(PM_RunOnsInTabbedRoutine));Problems::issue_problem_segment(
-"The phrase or rule definition %1 is written using the 'colon "
-"and indentation' syntax for its 'if's, 'repeat's and 'while's, "
-"but that's only allowed if each phrase in the definition "
-"occurs on its own line. So phrases like %2, which follow "
+"The phrase or rule definition %1 is written using the 'colon and indentation' "
+"syntax for its 'if's, 'repeat's and 'while's, but that's only allowed if each "
+"phrase in the definition occurs on its own line. So phrases like %2, which follow ""directly on from the previous phrase, aren't allowed.");Problems::issue_problem_end(); }
§1.1.6.5.2. It's a moot point whether the following should be incorrect syntax, but it
far more often happens as an accident than anything else, and it's hard to
think of a sensible use.
-
Issue problem for an empty block2.6.5.2 =
+
Issue problem for an empty block1.1.6.5.2 =
if (suppress_further_problems == FALSE) {
-LOG("$T\n", routine_node);
-current_sentence = routine_node;
+LOG("$T\n", imperative_node);
+current_sentence = imperative_node;Problems::quote_source_eliding_begin(1, current_sentence);Problems::quote_source_eliding_begin(2, prev);Problems::quote_source_eliding_begin(3, p);StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_EmptyIndentedBlock));Problems::issue_problem_segment(
-"The phrase or rule definition %1 is written using the 'colon "
-"and indentation' syntax for its 'if's, 'repeat's and 'while's, "
-"where blocks of phrases grouped together are indented one "
-"tab step inward from the 'if ...:' or similar phrase to which "
-"they belong. But the phrase %2, which ought to begin a block, "
-"is immediately followed by %3 at the same or a lower indentation, "
-"so the block seems to be empty - this must mean there has been "
-"a mistake in indenting the phrases.");
+"The phrase or rule definition %1 is written using the 'colon and indentation' "
+"syntax for its 'if's, 'repeat's and 'while's, where blocks of phrases grouped "
+"together are indented one tab step inward from the 'if ...:' or similar phrase "
+"to which they belong. But the phrase %2, which ought to begin a block, is "
+"immediately followed by %3 at the same or a lower indentation, so the block "
+"seems to be empty - this must mean there has been a mistake in indenting the "
+"phrases.");Problems::issue_problem_end(); }
§1.1.6.3.2.1. Issue problem for non-case in a switch1.1.6.3.2.1 =
if (suppress_further_problems == FALSE) {
-current_sentence = routine_node;
+current_sentence = imperative_node;Problems::quote_source_eliding_begin(1, current_sentence);Problems::quote_source_eliding_begin(2, p);StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NonCaseInIf));Problems::issue_problem_segment(
-"In the phrase or rule definition %1, the phrase %2 came as a "
-"surprise since it was not a case in an 'if X is...' but was "
-"instead some other miscellaneous instruction.");
+"In the phrase or rule definition %1, the phrase %2 came as a surprise since "
+"it was not a case in an 'if X is...' but was instead some other miscellaneous "
+"instruction.");Problems::issue_problem_end(); }
§1.1.6.3.1.1. Issue problem for an intermediate phrase not matching1.1.6.3.1.1 =
if ((indent_misalign == FALSE) && (suppress_further_problems == FALSE)) {current_sentence = p;if (csp->subordinate_to == if_CSP) {
-LOG("$T\n", routine_node);
+LOG("$T\n", imperative_node);StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedOtherwise),"this doesn't match a corresponding 'if'",
-"as it must. An 'otherwise' must be vertically underneath the "
-"'if' to which it corresponds, at the same indentation, and "
-"if the 'otherwise' uses a colon to begin a block then the "
-"'if' must do the same.");
+"as it must. An 'otherwise' must be vertically underneath the 'if' to which "
+"it corresponds, at the same indentation, and if the 'otherwise' uses a colon "
+"to begin a block then the 'if' must do the same."); }if (csp->subordinate_to == switch_CSP)StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisalignedCase),
-"this seems to be misplaced since it is not a case within an "
-"'if X is...'",
-"as it must be. Each case must be placed one tab stop in from "
-"the 'if X is...' to which it belongs, and the instructions "
-"for what to do in that case should be one tab stop further in "
-"still.");
+"this seems to be misplaced since it is not a case within an 'if X is...'",
+"as it must be. Each case must be placed one tab stop in from the 'if X "
+"is...' to which it belongs, and the instructions for what to do in that "
+"case should be one tab stop further in still."); }
§1.1.6.3.1.2. Issue problem for an intermediate phrase out of sequence1.1.6.3.1.2 =
@@ -861,35 +871,33 @@ think of a sensible use.
if ((csp == default_case_CSP) || (csp == case_CSP))StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DefaultCaseNotLast),"'otherwise' must be the last clause if an 'if ... is:'",
-"and in particular it has to come after all the '-- V:' "
-"case values supplied.");
+"and in particular it has to come after all the '-- V:' case values supplied.");elseStandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_MisarrangedOtherwise),"this seems to be misplaced since it is out of sequence within its 'if'",
-"with an 'otherwise if...' coming after the more general 'otherwise' "
-"rather than before. (Note that an 'otherwise' or 'otherwise if' must "
-"be vertically underneath the 'if' to which it corresponds, at the "
-"same indentation.");
+"with an 'otherwise if...' coming after the more general 'otherwise' rather "
+"than before. (Note that an 'otherwise' or 'otherwise if' must be vertically "
+"underneath the 'if' to which it corresponds, at the same indentation."); }
§1.1.7. And after all that work, the routine's parse tree still consists only of a
linked list of nodes; but at least it now contains the same pattern of nodes
whichever syntax is used. We finally make a meaningful tree out of it.
-
(e) Structure the parse tree to match the use of control structures2.7 =
+
(e) Structure the parse tree to match the use of control structures1.1.7 =
-parse_node *routine_list = routine_node->down;
+parse_node *routine_list = imperative_node->down;parse_node *top_level = Node::new(CODE_BLOCK_NT);
-routine_node->down = top_level;
+imperative_node->down = top_level;
-parse_node *attach_owners[MAX_BLOCK_NESTING+1];
-parse_node *attach_points[MAX_BLOCK_NESTING+1];
-control_structure_phrase *attach_csps[MAX_BLOCK_NESTING+1];
+parse_node *attach_owners[MAX_BLOCK_NESTING+1];
+parse_node *attach_points[MAX_BLOCK_NESTING+1];
+control_structure_phrase *attach_csps[MAX_BLOCK_NESTING+1];intattach_point_sp = 0; push the top level code block onto the stack
@@ -901,7 +909,7 @@ whichever syntax is used. We finally make a meaningful tree out of it.
for (parse_node *pn = routine_list, *pn_prev = NULL; pn; pn_prev = pn, pn = pn->next) { unstring this node from the old listif (pn_prev) pn_prev->next = NULL;
-Attach the node to the routine's growing parse tree2.7.1;
+Attach the node to the routine's growing parse tree1.1.7.1; }if (overflow_point) {current_sentence = overflow_point;
@@ -910,8 +918,8 @@ whichever syntax is used. We finally make a meaningful tree out of it.
"perhaps because many have begun but not been properly ended?"); }
@@ -951,8 +959,8 @@ whichever syntax is used. We finally make a meaningful tree out of it.
to = attach_owners[attach_point_sp-1];SyntaxTree::graft(Task::syntax_tree(), pn, to);
§1.1.7.1.3.1. An overflow, however, we must catch right here.
-
Push the CSP stack2.7.1.3.1 =
+
Push the CSP stack1.1.7.1.3.1 =
-if (attach_point_sp <= MAX_BLOCK_NESTING) {
+if (attach_point_sp <= MAX_BLOCK_NESTING) {attach_owners[attach_point_sp] = pn;attach_csps[attach_point_sp] = csp;attach_points[attach_point_sp++] = next_attach_point;
@@ -989,8 +997,8 @@ whichever syntax is used. We finally make a meaningful tree out of it.
if (overflow_point == NULL) overflow_point = pn; }
§3.1. These used to be much-seen problem messages, until Inform moved to Pythonesque
+
§2.1. These used to be much-seen problem messages, until Inform moved to Pythonesque
structure-by-indentation. Nowadays "end if", "end while" and such are
automatically inserted into the stream of commands, always in the right place,
and always passing these checks. But the problem messages are kept for the sake
of old-format source text, and for refuseniks.
-
Issue problem for end without begin3.1 =
+
Issue problem for end without begin2.1 =
StandardProblems::sentence_problem_with_note(Task::syntax_tree(), _p_(PM_EndWithoutBegin),"this is an 'end' with no matching 'begin'",
-"which should not happen: every phrase like 'if ... begin;' "
-"should eventually be followed by its bookend 'end if'. "
-"It makes no sense to have an 'end ...' on its own.",
-"Perhaps the problem is actually that you opened several "
-"such begin... end 'blocks' and accidentally closed them "
-"once too many? This is very easily done.");
+"which should not happen: every phrase like 'if ... begin;' should eventually be "
+"followed by its bookend 'end if'. It makes no sense to have an 'end ...' on its "
+"own.",
+"Perhaps the problem is actually that you opened several such begin... end "
+"'blocks' and accidentally closed them once too many? This is very easily done.");
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BeginWithoutEnd),
-"the definition of the phrase ended with no matching 'end' for "
-"this 'begin'",
-"bearing in mind that every begin must have a matching end, and "
-"that the one most recently begun must be the one first to end. For "
-"instance, 'if ... begin' must have a matching 'end if'.");
+"the definition of the phrase ended with no matching 'end' for this 'begin'",
+"bearing in mind that every begin must have a matching end, and that the one "
+"most recently begun must be the one first to end. For instance, 'if ... begin' "
+"must have a matching 'end if'.");
@@ -1103,19 +1109,18 @@ of old-format source text, and for refuseniks.
"which must be wrong.");elseif (csp == otherwise_if_CSP)StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfMisplaced),
-"the 'otherwise if' clause here seems not to be occurring inside "
-"a large 'if'",
-"and seems to be freestanding instead. (Though 'otherwise ...' can "
-"usually be used after simple one-line 'if's to provide an alternative "
-"course of action, 'otherwise if...' is a different matter, and is "
-"used to divide up larger-scale instructions.)");
+"the 'otherwise if' clause here seems not to be occurring inside a large 'if'",
+"and seems to be freestanding instead. (Though 'otherwise ...' can usually "
+"be used after simple one-line 'if's to provide an alternative course of action, "
+"'otherwise if...' is a different matter, and is used to divide up larger-scale "
+"instructions.)");elseStandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),"this clause can't occur outside of a control phrase","which suggests that the structure of this routine is wrong.");
@@ -1124,16 +1129,16 @@ of old-format source text, and for refuseniks.
Problems::quote_wide_text(2, context->keyword);StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_OtherwiseInNonIf));Problems::issue_problem_segment(
-"The %1 here did not make sense inside a "
-"'%2' structure: it's provided for 'if' (or 'unless').");
+"The %1 here did not make sense inside a '%2' structure: it's provided for 'if' "
+"(or 'unless').");Problems::issue_problem_end(); } elseStandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),"this clause is wrong for the phrase containing it","which suggests that the structure of this routine is wrong.");
§2.6. Choose a problem for otherwise not occurring last2.6 =
@@ -1148,27 +1153,26 @@ of old-format source text, and for refuseniks.
}if (doubled)StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_DoubleOtherwise),
-"that makes two unconditional 'otherwise' or 'else' clauses "
-"for this 'if'",
-"which is forbidden since 'otherwise' is meant to be a single "
-"(optional) catch-all clause at the end.");
+"that makes two unconditional 'otherwise' or 'else' clauses for this 'if'",
+"which is forbidden since 'otherwise' is meant to be a single (optional) "
+"catch-all clause at the end.");elseif (oi)StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_OtherwiseIfAfterOtherwise),"this seems to be misplaced since it is out of sequence within its 'if'",
-"with an 'otherwise if...' coming after the more general 'otherwise' "
-"rather than before. (If there's an 'otherwise' clause, it has to be "
-"the last clause of the 'if'.)");
+"with an 'otherwise if...' coming after the more general 'otherwise' rather "
+"than before. (If there's an 'otherwise' clause, it has to be the last clause "
+"of the 'if'.)");elseStandardProblems::sentence_problem(Task::syntax_tree(), _p_(BelievedImpossible),"'otherwise' must be the last clause","but it seems not to be.");
§2.7. This shouldn't happen because the switch construct requires Python syntax
and the structure of that was checked at indentation time, but just in case.
-
Issue a problem for the default case not occurring last3.7 =
+
Issue a problem for the default case not occurring last2.7 =
@@ -1176,30 +1180,30 @@ and the structure of that was checked at indentation time, but just in case.
"'otherwise' must be the last clause","which must be wrong.");
§1.1.9. The tree is now known to be correctly structured, and there are no possible
problem messages left to issue. It's therefore safe to begin rearranging it.
We'll first eliminate one whole construction: "otherwise if whatever: ..."
can now become "otherwise: if whatever: ...".
§1.1.10. We made a similar manoeuvre above, but for one-line "otherwise do something"
phrases following one-line "if", not for the wider case of "otherwise if". We
didn't handle this back then because to do so would have made it impossible
to issue good problem messages for failures to use "otherwise if" correctly.
-voidRuleSubtrees::purge_otherwise_if(parse_node *block) {
+voidImperativeSubtrees::purge_otherwise_if(parse_node *block) {for (parse_node *p = block->down, *prev_p = NULL; p; prev_p = p, p = p->next) {if (Node::get_control_structure_used(p) == otherwise_if_CSP) {parse_node *former_contents = p->down;
@@ -1226,59 +1230,59 @@ to issue good problem messages for failures to use "otherwise if" correctly.
any further "otherwise if" or "otherwise" nodes after p followp->down->next = former_successors; }
-if (p->down) RuleSubtrees::purge_otherwise_if(p);
+if (p->down) ImperativeSubtrees::purge_otherwise_if(p); }}
-
§2.11. End nodes are now redundant: maybe they got here as explicit "end if" phrases
+
§1.1.11. End nodes are now redundant: maybe they got here as explicit "end if" phrases
in the source text, or maybe they were auto-inserted by the indentation reader,
but now that the structure is known to be correct they serve no further purpose.
We remove them.
-
(h) Remove any end markers as no longer necessary2.11 =
+
(h) Remove any end markers as no longer necessary1.1.11 =
§2.15. This all makes a nice tree, but it has the defect that the statements heading
+
§1.1.15. This all makes a nice tree, but it has the defect that the statements heading
block-opening phrases (the ifs, whiles, repeats) have child nodes (the blocks
of code consequent on them). We want them to be leaves for now, so that we
can append statement-parsing data underneath them later. So we insert blank
@@ -1286,17 +1290,17 @@ code block nodes to mark these phrases, and transfer the control structure
annotations to them.
-
(j) Insert code block nodes so that nodes needing to be parsed are childless2.15 =
+
(j) Insert code block nodes so that nodes needing to be parsed are childless1.1.15 =
Issue problem message for comma in a substitution4.1.1.1 =
+
Issue problem message for comma in a substitution3.1.1.1 =
Strings::TextSubstitutions::it_is_not_worth_adding();StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TSWithComma),"a substitution contains a comma ','",
-"which is against the rules, because 'say' is a special phrase in "
-"which the comma divides items in a list of things to say, and so it "
-"loses its ordinary meanings. Because of this, no text substitution "
-"can contain a comma. "
+"which is against the rules, because 'say' is a special phrase in which the comma "
+"divides items in a list of things to say, and so it loses its ordinary meanings. "
+"Because of this, no text substitution can contain a comma. ""(If you're trying to use a value produced by a phrase with a phrase ""option - say 'the best route from A to B, using even locked doors' - ""you'll need to put this in a 'let' variable first and then say that, "
@@ -1459,8 +1464,8 @@ annotations to them.
Strings::TextSubstitutions::it_is_worth_adding();return;
§3.1.1.2. Issue problem message for nested substitution3.1.1.2 =
@@ -1469,22 +1474,21 @@ annotations to them.
(p[k+5] == 'o') && (p[k+6] == 'd') && (p[k+7] == 'e') && (p[k+8] == ' ')) {StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NestedUSubstitution),"the text here contains one substitution '[...]' inside another",
-"which is not allowed. Actually, it looks as if you might have got "
-"into this by typing an exotic character as part of the name of a "
-"text substitution - those get rewritten automatically as '[unicode N]' "
-"for the appropriate Unicode character code number N. Either way - "
-"this isn't allowed.");
+"which is not allowed. Actually, it looks as if you might have got into this "
+"by typing an exotic character as part of the name of a text substitution - "
+"those get rewritten automatically as '[unicode N]' for the appropriate Unicode "
+"character code number N. Either way - this isn't allowed."); } else {StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_NestedSubstitution),"the text here contains one substitution '[...]' inside another",
-"which is not allowed. (If you just wanted a literal open and closed "
-"square bracket, use '[bracket]' and '[close bracket]'.)");
+"which is not allowed. (If you just wanted a literal open and closed square "
+"bracket, use '[bracket]' and '[close bracket]'.)"); }Strings::TextSubstitutions::it_is_worth_adding();return;
§3.1.1.3. Issue problem message for unclosed substitution3.1.1.3 =
@@ -1492,61 +1496,60 @@ annotations to them.
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnclosedSubstitution),"the text here uses an open square bracket '[', which opens a substitution ""in the text, but doesn't close it again",
-"so that the result is malformed. (If you just wanted a literal open "
-"square bracket, use '[bracket]'.)");
+"so that the result is malformed. (If you just wanted a literal open square "
+"bracket, use '[bracket]'.)");Strings::TextSubstitutions::it_is_worth_adding();return;
§3.1.1.4. Issue problem message for unopened substitution3.1.1.4 =
Strings::TextSubstitutions::it_is_not_worth_adding();StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_UnopenedSubstitution),
-"the text here uses a close square bracket ']', which closes a substitution "
-"in the text, but never actually opened it",
-"with a matching '['. (If you just wanted a literal close square bracket, "
-"use '[close bracket]'.)");
+"the text here uses a close square bracket ']', which closes a substitution in the "
+"text, but never actually opened it",
+"with a matching '['. (If you just wanted a literal close square bracket, use "
+"'[close bracket]'.)");Strings::TextSubstitutions::it_is_worth_adding();return;
§4.1.1.5. Something devious happens when production (b) of <s-say-phrase> is matched.
-Double-quoted text is literal if it contains no square brackets, but is
-expanded if it includes text substitutions in squares. When (b) matches,
-Inform expands a text such as
+
§3.1.1.5. Something devious happens when text following a "say" is found. Double-quoted text
+is literal if it contains no square brackets, but is expanded if it includes text
+substitutions in squares. Thus:
"Look, [the noun] said."
-
into:
+
becomes:
"Look, ", the noun, " said."
-
and then re-parses the result with the following nonterminal; note that we
-make sure commas are used correctly before handing back to <s-say-phrase>
-to parse the list.
+
This is then re-parsed with the following nonterminal; note that we report any
+problem with misuse of commas — really, of square brackets — before handing back
+to <s-say-phrase> to parse the list.
@@ -1556,11 +1559,11 @@ to parse the list.
"which suggests that a close square bracket ']' may have gone astray.");Strings::TextSubstitutions::it_is_worth_adding();
@@ -1570,13 +1573,12 @@ to parse the list.
"which is not allowed. To say nothing - well, say nothing.");Strings::TextSubstitutions::it_is_worth_adding();
diff --git a/docs/assertions-module/2-ptmn.html b/docs/assertions-module/2-ptmn.html
index 00fceb8f4..c206b3620 100644
--- a/docs/assertions-module/2-ptmn.html
+++ b/docs/assertions-module/2-ptmn.html
@@ -208,7 +208,7 @@ organisation, and are not directly functional in themselves.
caseENDHERE_NT:Anaphora::new_discussion();global_pass_state.near_start_of_extension = 0; break;
-caseRULE_NT:Pass through a RULE node3.1.1; break;
+caseIMPERATIVE_NT:Pass through an IMPERATIVE node3.1.1; break;caseSENTENCE_NT:Pass through a SENTENCE node3.1.2; break;caseTRACE_NT:Pass through a TRACE node3.1.5; break;
@@ -234,19 +234,19 @@ organisation, and are not directly functional in themselves.
}
§3.1.1. This is a little convoluted. The linguistics module turns sentences in
-rule form into a RULE_NT node followed by subsequent INVOCATION_NT nodes,
-and the first call here makes them into a neat subtree. After that, we look
-out for adjectives defined by phrases, and for phrases with names, since
-both will affect how we read sentences in passes 1 and 2.
+
§3.1.1. This is a little convoluted: see Imperative Subtrees for how
+"acceptance" tidies up the nodes in the syntax tree corresponding to a block
+of imperative code. After that, we look out for adjectives defined by phrases,
+and for phrases with names, since both will affect how we read sentences in
+passes 1 and 2.
-
Pass through a RULE node3.1.1 =
+
Pass through an IMPERATIVE node3.1.1 =
if (global_pass_state.pass == 0) {
-SyntaxTree::traverse_run(p, RuleSubtrees::demote_command_nodes, RULE_NT);
+SyntaxTree::traverse_run(p, ImperativeSubtrees::accept, IMPERATIVE_NT);Phrases::Adjectives::look_for_headers(p);Phrases::Usage::predeclare_name_in(p); }
@@ -390,7 +390,7 @@ followed by double-quoted text is a note for the telemetry file.
}
diff --git a/docs/assertions-module/3-dlr.html b/docs/assertions-module/3-dlr.html
index 1279e1e4a..635c03131 100644
--- a/docs/assertions-module/3-dlr.html
+++ b/docs/assertions-module/3-dlr.html
@@ -184,7 +184,7 @@ modifiers and a pointer to a Preform nonterminal if one has been named.
}
diff --git a/docs/assertions-module/4-ass2.html b/docs/assertions-module/4-ass2.html
index f92700f6a..1af0738a3 100644
--- a/docs/assertions-module/4-ass2.html
+++ b/docs/assertions-module/4-ass2.html
@@ -128,7 +128,7 @@ generalisations which apply to it.
CLASS_DEFINITION} generalisation;
-
The structure generalisation is accessed in 2/ptmn, 2/cs, 2/ps, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/imp, 5/tbl, 5/eqt, 6/tcp, 6/cu and here.
+
The structure generalisation is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/imp, 5/tbl, 5/eqt, 6/tcp, 6/cu and here.
§3. For reasons to do with timing, each object needs to keep track of which
generalisations have and have not yet applied to it. In practice, this is
a list of pairs \((K, g)\) where \(K\) is a kind and \(g\) is the most recent one
@@ -142,7 +142,7 @@ applied from \(K\)'s list.
structapplication *next;} application;
-
The structure application is accessed in 2/ptmn, 2/cs, 2/ps, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/imp, 5/tbl, 5/eqt, 6/tcp, 6/cu and here.
+
The structure application is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/imp, 5/tbl, 5/eqt, 6/tcp, 6/cu and here.
§4. These structures are combined in the following packet of data attached to
each inference subject:
diff --git a/docs/assertions-module/5-eqt.html b/docs/assertions-module/5-eqt.html
index 26fd8db91..3358ff31e 100644
--- a/docs/assertions-module/5-eqt.html
+++ b/docs/assertions-module/5-eqt.html
@@ -135,7 +135,7 @@ instance has its own equation
CLASS_DEFINITION} equation_symbol;
-
The structure equation_symbol is accessed in 2/ptmn, 2/cs, 2/ps, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/ass2, 4/imp, 5/tc, 5/tbl, 6/tcp, 6/cu and here.
+
The structure equation_symbol is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/ass2, 4/imp, 5/tc, 5/tbl, 6/tcp, 6/cu and here.
§3. In addition, there are some standing symbols used by all equations: the
constant "pi", for example. They're stored in this linked list:
diff --git a/docs/assertions-module/5-tbl.html b/docs/assertions-module/5-tbl.html
index 84d17dcb6..e96b20044 100644
--- a/docs/assertions-module/5-tbl.html
+++ b/docs/assertions-module/5-tbl.html
@@ -120,7 +120,7 @@ column ID numbers: see structtable_contribution *next;} table_contribution;
-
-
+ To tidy up blocks of rule and phrase definition in the syntax tree.
+
diff --git a/docs/core-module/1-htc.html b/docs/core-module/1-htc.html
index 626df2246..de6f6b2de 100644
--- a/docs/core-module/1-htc.html
+++ b/docs/core-module/1-htc.html
@@ -271,11 +271,7 @@ so on. Those absolute basics are made here.
Task::advance_stage_to(PHRASES_CSEQ, I"Phrases and rules",3, debugging, sequence_timer);BENCH(LiteralPatterns::define_named_phrases)
-BENCH(Phrases::Manager::traverse)
-BENCH(Phrases::Manager::register_meanings)
-BENCH(Phrases::Manager::parse_rule_parameters)
-BENCH(Phrases::Manager::add_rules_to_rulebooks)
-BENCH(Phrases::Manager::parse_rule_placements)
+BENCH(ImperativeDefinitions::find_phrases_and_rules)BENCH(Equations::traverse_to_stock)BENCH(Tables::traverse_to_stock)BENCH(RTProperties::annotate_attributes)
@@ -313,14 +309,14 @@ so on. Those absolute basics are made here.
BENCH(Tables::complete)BENCH(RTTables::compile)BENCH(RTEquations::compile_identifiers)
-BENCH(Phrases::Manager::compile_first_block)
-BENCH(Phrases::Manager::compile_rulebooks)
-BENCH(Phrases::Manager::rulebooks_array)
+BENCH(ImperativeDefinitions::compile_first_block)
+BENCH(RTRules::compile_rulebooks)
+BENCH(RTRules::rulebooks_array_array)BENCH(RTRules::rulebook_var_creators)BENCH(RTActivities::activity_var_creators)BENCH(RTRelations::IterateRelations)
-BENCH(Phrases::Manager::RulebookNames_array)
-BENCH(Phrases::Manager::RulePrintingRule_routine)
+BENCH(RTRules::RulebookNames_array)
+BENCH(RTRules::RulePrintingRule_routine)BENCH(RTVerbs::ConjugateVerb)BENCH(RTAdjectives::agreements)if (debugging) {
@@ -337,12 +333,12 @@ so on. Those absolute basics are made here.
BENCH(Lists::check)BENCH(ConstantLists::compile)BENCH(Phrases::invoke_to_begin)
-BENCH(Phrases::Manager::compile_as_needed)
+BENCH(ImperativeDefinitions::compile_as_needed)BENCH(Strings::compile_responses)BENCH(Lists::check)BENCH(ConstantLists::compile)BENCH(RTRelations::compile_defined_relations)
-BENCH(Phrases::Manager::compile_as_needed)
+BENCH(ImperativeDefinitions::compile_as_needed)BENCH(Strings::TextSubstitutions::allow_no_further_text_subs)
diff --git a/docs/core-module/1-inaa.html b/docs/core-module/1-inaa.html
index 745d42b28..e81a977e6 100644
--- a/docs/core-module/1-inaa.html
+++ b/docs/core-module/1-inaa.html
@@ -104,7 +104,7 @@ declarations and assertion sentences.
● Code nodes, category CODE_NCAT, are defined only below. They occur only
inside imperative code (i.e. rules and phrase definitions), in subtrees headed
-by a level-2 RULE_NT node, and they organise what is to be compiled.
+by a level-2 IMPERATIVE_NT node, and they organise what is to be compiled.
● Specification nodes represent values or descriptions of values, and are
defined only below. These occur frequently in the parse tree as children of
code nodes, but can also be used in detached form as a way to represent, say,
@@ -268,7 +268,7 @@ also makes it easier for us to manipulate the results.
NodeType::new(TEST_VALUE_NT, I"TEST_VALUE_NT", 1, 1, COND_NCAT, 0);
diff --git a/docs/imperative-module/2-rb.html b/docs/imperative-module/2-rb.html
index b4c9626db..fac022264 100644
--- a/docs/imperative-module/2-rb.html
+++ b/docs/imperative-module/2-rb.html
@@ -167,7 +167,7 @@ the rulebook; instead, the booking is marked for automatic placement later on.
-voidRuleBookings::make_automatic_placements(void) {
+voidRuleBookings::make_automatic_placements(void) {booking *br;LOOP_OVER(br, booking)if (br->place_automatically) {
@@ -189,6 +189,7 @@ the rulebook; instead, the booking is marked for automatic placement later on.
internal_error("Inter-defined rules cannot be automatically placed"); } }
+RTRules::compile_NUMBER_RULEBOOKS_CREATED();}
§7. Specificity of bookings. This strcmp-like function is intended to be used in sorting algorithms,
diff --git a/docs/imperative-module/3-cs.html b/docs/imperative-module/3-cs.html
index 135c4038b..977c4744a 100644
--- a/docs/imperative-module/3-cs.html
+++ b/docs/imperative-module/3-cs.html
@@ -70,198 +70,22 @@ function togglePopup(material_id) {
§1. A day in the life. Suppose we compare the run of Inform to a single day. At dawn the program
-starts up. In the morning it finds out the names of all the constant values
-defined in the source text: names like "Mrs Blenkinsop", "hatstand", and
-so on. By noon it has also found out the wording used for phrases, such as
-"award prize (N - a number) to (gardener - a woman)". This means that in
-the afternoon it knows every name it ever will, and so it can work through
-the definitions of phrases like "award prize...". In the evening, it does
-some book-keeping, and at nightfall it shuts down.
-
-
-
We will use the story of our single day throughout this section on timing,
-because everything has to happen in just the right order.
-
-intphrase_time_now = DAWN_PHT;
-
-voidPhrases::Manager::advance_phrase_time_to(intadvance_to) {
-if (advance_to < phrase_time_now) {
-LOG("Advance from %d to %d\n", phrase_time_now, advance_to);
-internal_error(
-"The necessary phrase construction events are out of sequence");
- }
-phrase_time_now = advance_to;
-}
-
-
§2. Early morning. We run through the phrase preambles to look for named rules like this:
-
-
-
-
Instead of pushing the red button (this is the fire alarm rule): ...
-
-
-
This looking-for-names is done by parsing the preamble text to a PHUD in
-what is called "coarse mode", which can only get an approximate idea at
-best: at this stage the "Instead" rulebook and the "red button" don't
-exist, so most of the words here are meaningless. The PHUD which coarse
-mode parsing produces is far too sketchy to use, and is thrown away.
-But at least it does pick out the name "fire alarm rule", and Inform
-creates an empty "rule" structure called this, registering this as the
-name of a new constant.
-
-
-
§3. Mid-morning. This is when Inform is making its main traverses through assertions.
-Something very useful is happening, but it's happening somewhere else.
-Assertions such as
-
-
-
-
Instead is a rulebook.
-
-
-
are being read, and rulebooks are therefore being created.
-
-
-
§4. Late morning. With the assertions read, all the values have their names, and that means
-we can go back to phrases like:
-
-
-
-
Instead of pushing the red button (this is the fire alarm rule): ...
-
-
-
and read them properly. So Inform now runs through the preambles again and
-parses them for a second time to PHUDs, but this time in "fine mode" rather
-than "coarse mode", and this time the result is not thrown away. If the
-phrase is a "To..." phrase declaration, then the PHUD is pretty sketchy and
-we parse more substantial PHTD and PHOD structures to accompany it. But if
-it is a rule, the PHUD contains a great deal of useful information, and we
-accompany it with essentially blank PHTD and PHOD structures. Either way, we
-end up with a triplet of PHUD, PHTD and PHOD, and these are combined into a
-new phrase structure. The PHSF structure is initially created as a
-function of the PHTD: for example, if the phrase reads
-
-
-
-
To award (points - a number): ...
-
-
-
then the PHTD notes that "points" is the name of a parameter whose kind is
-to be "number". The stack frame, PHSF, deduces that "points" will be a
-local variable of kind "number" within the phrase when it's running.
-Lastly, a blank PHRCD structure is created, filling out the set of five
-substructures.
-
-
-
As they are created, the "To..." phrases are insertion-sorted into a list of
-phrases in logical precedence order. This can be done now because it relies
-only on the kinds listed in the PHTD, all of which have existed since
-mid-morning.
-
-
-
For reasons discussed below, rules are not yet sorted. But the names created
-in mid-morning, such as "fire alarm rule", are associated with their
-phrases, and they are marked for what's called "automatic placement". For
-example, the fire alarm rule will automatically be placed into the Instead
-rulebook, because its preamble begins "Instead". The reason rules are only
-marked to be placed later is that placement has to occur in logical
-precedence order, but rules are harder to sort than phrases. They have to be
-sorted by their PHRCDs, not their PHTDs, and a PHRCD cannot even be parsed
-until afternoon because the conditions for a rule often mention phrases —
-for instance, "Instead of waiting when in darkness", making use of an "in
-darkness" phrase. So for now we just make a mental note to do automatic
-placement later on.
-
§5. Just before noon. It is now nearly noon, and things appear to be a little untidy. Why
-are the "To..." phrases not yet registered with the excerpt parser?
-The answer is that we needed to wait until all of the "To..." phrases
-had been created as structures before we could safely proceed. The first
-phrase couldn't be registered until we knew the complete logical order
-of them all. Well: at last, we do know that, and can make the registration.
-Phrases are the very last things to get their names in Inform (well, not
-counting local variables, whose names only exist fleetingly).
-
§6. Noon. When the final phrase is registered, the hour chimes. From this point
-onwards, there's no longer any text which can't be parsed because some
-of the names don't exist yet: everything exists.
-
-
-
§7. Early afternoon. In the afternoon, we begin by binding up the rulebooks. First, we go through
-the phrases destined to be rules, and for each we translate the PHUD (which
-contains mainly textual representations of the usage information, e.g.
-"taking something (called the thingummy) which is in a lighted room during
-Scene Two when the marble slab is open") to a PHRCD (which contains fully
-parsed Inform data structures, e.g., an action pattern and a pointer to a
-scene structure). As noted above, this often means parsing conditions
-which involve phrases, and that's why we're doing it in the afternoon.
-
-
-
During this PHUD-to-PHRCD parsing process, we make sure that the relevant
-phrase's PHSF is the current stack frame, because it's here that the names
-of any callings (e.g. "thingummy") are created as local variables to be
-valid throughout the phrase.
-
-
-
Once we're done with this, the PHUD will never be used again.
-
-
-
Note that the PHRCDs have to be parsed in source text appearance order (the
-order which LOOP_OVER follows) so that the back reference "doing it" can
-correctly refer to the most recently mentioned action.
-
§8. We can finally make the automatic placements of rules into rulebooks: so
-our "fire alarm rule" will at last be placed in the "Instead" rulebook. The
-PHRCDs are used to make sure it appears in the right position.
-
§9. It might seem as if the rulebooks are now complete, but this is not true,
-because we still have to take care of manual placements like:
-
-
-
-
The fire alarm rule is listed in the safety procedures rulebook.
-
-
-
This is where we get on with that, traversing the parse tree for sentences
-of this general sort. Rules can also be unlisted, or constrained to happen
-only conditionally, or substituted by other rules.
-
§11. Mid-afternoon. It is now mid-afternoon, and the rulebooks are complete. It is time to
-compile the I6 routines which will provide the run-time definitions of all
-these phrases. This will be a long task, and much of it will be left until
-the evening. But we do get rid of some easy cases now: the rules and
-adjective definitions.
+
§3. The rulebooks are now complete and final. It is time to
+compile the Inter code which will provide the run-time definitions of all
+these phrases. This will be a long task, and we can only do most of it now,
+because more phrases will appear later.
§3.4. This doesn't compile all adjective definitions, only the ones which supply
a whole multi-step phrase to define them — a relatively little-used feature
of Inform.
-
Compile phrases which define adjectives11.4 =
+
Compile phrases which define adjectives3.4 =
@@ -391,8 +199,8 @@ of Inform.
total_phrases_to_compile, NULL, NULL, NULL);RTAdjectives::compile_support_code();
§3.5. As we'll see, it's legal in Inform to define "To..." phrases with vague
kinds: "To expose (X - a value)", for example. This can't be compiled as
vaguely as the definition implies, since there would be no way to know how
to store X. Instead, for each different kind of X which is actually needed,
@@ -406,7 +214,7 @@ request the boring ones with straightforward kinds ("To award (N - a number)
points", say). This is where we do it:
-
Mark To... phrases which have definite kinds for future compilation11.5 =
+
Mark To... phrases which have definite kinds for future compilation3.5 =
@@ -419,8 +227,8 @@ points", say). This is where we do it:
} }
§12. Late Afternoon. Rules are pretty well sorted out now, but we still need to compile some I6
-to show how they fit together. These miscellaneous function calls can happen
-in any order, so long as they all occur in the late afternoon.
-
-
-
First, rules set to go off at a particular time need to have their timings
-noted down:
-
§14. And finally, just as the sun slips below the horizon, we compile the code
-which prints out values of the kind "rule" at run-time — for example, taking
-the address of the routine which our example rule was compiled to and then
-printing out "fire alarm rule".
-
§4. The twilight gathers, but our work is far from done. Recall that we have
accumulated compilation requests for "To..." phrases, but haven't actually
acted on them yet.
@@ -567,13 +324,11 @@ phrases alone: we must compile phrases, then things arising from them, then
phrases arising from those, then things arising from the phrases arising
from those, and so on, until we're done. The process is therefore structured
as a set of "coroutines" which each carry out as much as they can and then
-hand over to the others to generate more work. (Indeed, the routine below
-can be called multiple times in the course of the evening.)
+hand over to the others to generate more work.
-voidPhrases::Manager::compile_as_needed(void) {
-Phrases::Manager::advance_phrase_time_to(EVENING_PHT);
+voidImperativeDefinitions::compile_as_needed(void) {rule *R;LOOP_OVER(R, rule)RTRules::compile_definition(R,
@@ -598,7 +353,7 @@ can be called multiple times in the course of the evening.)
}
diff --git a/docs/imperative-module/3-dptd.html b/docs/imperative-module/3-dptd.html
index dfd911c46..1171b492d 100644
--- a/docs/imperative-module/3-dptd.html
+++ b/docs/imperative-module/3-dptd.html
@@ -326,7 +326,7 @@ match is shown.
-voidPhrases::TypeData::Textual::write_index_representation(OUTPUT_STREAM, ph_type_data *phtd, phrase *ph) {
+voidPhrases::TypeData::Textual::write_index_representation(OUTPUT_STREAM, ph_type_data *phtd, phrase *ph) {if (phtd->manner_of_return == DECIDES_CONDITION_MOR)WRITE("<i>if</i> ");Phrases::write_HTML_representation(OUT, ph, INDEX_PHRASE_FORMAT);
@@ -350,7 +350,7 @@ This is the routine which prints those details.
-voidPhrases::TypeData::Textual::parse(ph_type_data *phtd, wordingXW, wording *OW) {
+voidPhrases::TypeData::Textual::parse(ph_type_data *phtd, wordingXW, wording *OW) {intsay_flag = FALSE; is this going to be a "say" phrase?if (Wordings::nonempty(XW)) XW = Phrases::TypeData::Textual::phtd_parse_return_data(phtd, XW); trim return data from the front
@@ -716,7 +716,7 @@ haven't yet been parsed, so that we don't yet know it will be meaningful.
intno_truth_state_returns = 0;
-wordingPhrases::TypeData::Textual::phtd_parse_return_data(ph_type_data *phtd, wordingXW) {
+wordingPhrases::TypeData::Textual::phtd_parse_return_data(ph_type_data *phtd, wordingXW) {phtd->return_kind = NULL;if (<to-return-data>(XW)) {XW = GET_RW(<to-return-data>, 1);
@@ -746,7 +746,7 @@ preamble word range backwards — it returns the current last word number.
-wordingPhrases::TypeData::Textual::phtd_parse_doodads(ph_type_data *phtd, wordingW, int *say_flag) {
+wordingPhrases::TypeData::Textual::phtd_parse_doodads(ph_type_data *phtd, wordingW, int *say_flag) {<<operation>> = -1; <<assignment>> = FALSE; <<deprecated>> = FALSE; <<run-on>> = FALSE;<phrase-preamble>(W); guaranteed to match any non-empty textif (<<r>> == SAY_ANN) W = GET_RW(<say-preamble>, 1);
@@ -976,7 +976,7 @@ form the word and token sequences:
-voidPhrases::TypeData::Textual::phtd_parse_word_sequence(ph_type_data *phtd, wordingW) {
+voidPhrases::TypeData::Textual::phtd_parse_word_sequence(ph_type_data *phtd, wordingW) {phtd->no_tokens = 0;phtd->no_words = 0;
@@ -1179,7 +1179,7 @@ such as "list of numbers", it returns 0.)
-intPhrases::TypeData::Textual::find_kind_variable_domains(kind *K, int *usages, kind **declarations) {
+intPhrases::TypeData::Textual::find_kind_variable_domains(kind *K, int *usages, kind **declarations) {intt = 0;if (K) {intN = Kinds::get_variable_number(K);
@@ -1231,7 +1231,7 @@ in exactly one place: for example,
typedefstructphrase {
-structparse_node *declaration_node; RULE_NT node where declared
+structparse_node *declaration_node; IMPERATIVE_NT node where declaredintinline_wn; word number of inline I6 definition, or -1 if not inlinestructinter_schema *inter_head_defn; inline definition translated to inter, if possiblestructinter_schema *inter_tail_defn; inline definition translated to inter, if possible
@@ -126,7 +126,6 @@ code below.
structwordingph_documentation_symbol; cross-reference with documentationstructcompilation_unit *owning_module;structpackage_request *requests_package;
- struct package_request *rule_package;structph_type_datatype_data;structph_usage_datausage_data;
@@ -146,7 +145,7 @@ code below.
CLASS_DEFINITION} phrase;
-
The structure phrase is accessed in 2/rls, 2/rb, 3/cs, 3/pu, 3/prcd, 3/ptd, 3/dptd, 3/po, 3/pav, 3/tph, 3/tp, 3/pi, 6/inv, 6/pi, 6/ci, 6/cii, 6/cp, 6/cste and here.
+
The structure phrase is accessed in 2/rls, 2/rb, 3/cs, 3/pu, 3/prcd, 3/ptd, 3/dptd, 3/po, 3/pav, 3/tph, 3/tp, 6/inv, 6/pi, 6/ci, 6/cii, 6/cp, 6/cste and here.
§4. "To..." phrases, though no others, are listed in logical precedence order:
@@ -162,9 +161,9 @@ invocation which is given as verbatim I6.
-voidPhrases::create_from_preamble(parse_node *p) {
-if ((p == NULL) || (Node::get_type(p) != RULE_NT))
-internal_error("a phrase preamble should be at a RULE_NT node");
+voidPhrases::create_from_preamble(parse_node *p) {
+if ((p == NULL) || (Node::get_type(p) != IMPERATIVE_NT))
+internal_error("a phrase preamble should be at a IMPERATIVE_NT node");intinline_wn = -1; the word number of an inline I6 definition if anyintmor = DONT_KNOW_MOR; and its manner of returnwordingOW = EMPTY_WORDING; the text of the phrase options, if any
@@ -506,7 +505,7 @@ what number is...", for instance.
returnph->ph_iname;}
-parse_node *Phrases::declaration_node(phrase *ph) {
+parse_node *Phrases::declaration_node(phrase *ph) {returnph->declaration_node;}
@@ -521,7 +520,7 @@ response to "requests". All other phrases are compiled just once.
ph->imported = TRUE;}
-voidPhrases::compile(phrase *ph, int *i, intmax_i,
+voidPhrases::compile(phrase *ph, int *i, intmax_i,stacked_variable_owner_list *legible, to_phrase_request *req, rule *R) {if (ph->imported) return;inteffect = Phrases::Usage::get_effect(&(ph->usage_data));
@@ -593,7 +592,7 @@ response to "requests". All other phrases are compiled just once.
}
diff --git a/docs/imperative-module/3-po.html b/docs/imperative-module/3-po.html
index 3c6764bc9..18973c813 100644
--- a/docs/imperative-module/3-po.html
+++ b/docs/imperative-module/3-po.html
@@ -407,7 +407,7 @@ by "and":
diff --git a/docs/imperative-module/3-prcd.html b/docs/imperative-module/3-prcd.html
index 2eb040b1e..470a5c9b7 100644
--- a/docs/imperative-module/3-prcd.html
+++ b/docs/imperative-module/3-prcd.html
@@ -734,7 +734,7 @@ with the default outcome return (see above).
returnn;}
-
The structure activity_list is accessed in 2/rlb, 2/act, 3/rs, 3/phr, 3/tph, 3/tp, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
+
The structure activity_list is accessed in 2/rlb, 2/act, 3/phr, 3/tph, 3/tp, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
§11. Run-time contexts are seen in the "while" clauses at the end of rules.
For example:
@@ -901,7 +901,7 @@ values, of the kind to which the activity applies.
}
diff --git a/docs/imperative-module/3-ptd.html b/docs/imperative-module/3-ptd.html
index f529a95e5..0d85e3047 100644
--- a/docs/imperative-module/3-ptd.html
+++ b/docs/imperative-module/3-ptd.html
@@ -326,7 +326,7 @@ whistles and doodads which regular phrases don't.
returnphtd->manner_of_return;}
-kind *Phrases::TypeData::get_return_kind(ph_type_data *phtd) {
+kind *Phrases::TypeData::get_return_kind(ph_type_data *phtd) {if (phtd->manner_of_return == DECIDES_CONDITION_MOR) returnK_truth_state;returnphtd->return_kind;}
@@ -403,7 +403,7 @@ logic, since one argument is in effect a kind rather than a value.)
-kind *Phrases::TypeData::kind(ph_type_data *phtd) {
+kind *Phrases::TypeData::kind(ph_type_data *phtd) {kind *argument_kinds[MAX_TOKENS_PER_PHRASE];inti, j = 0;for (i=0; i<phtd->no_tokens; i++)
@@ -427,7 +427,7 @@ logic, since one argument is in effect a kind rather than a value.)
-intPhrases::TypeData::tokens_contain_variable(ph_type_data *phtd, intv) {
+intPhrases::TypeData::tokens_contain_variable(ph_type_data *phtd, intv) {for (inti=0; i<phtd->no_tokens; i++)if (Kinds::Behaviour::involves_var(phtd->token_sequence[i].token_kind, v))returnTRUE;
@@ -477,7 +477,7 @@ in the next.
diff --git a/docs/imperative-module/3-pu.html b/docs/imperative-module/3-pu.html
index 73831dd0f..311775efb 100644
--- a/docs/imperative-module/3-pu.html
+++ b/docs/imperative-module/3-pu.html
@@ -697,7 +697,7 @@ of the stem, so we have to be very careful:
-intPhrases::Usage::get_effect(ph_usage_data *phud) {
+intPhrases::Usage::get_effect(ph_usage_data *phud) {returnphud->phrase_effect;}
@@ -718,7 +718,7 @@ of the stem, so we have to be very careful:
returnphud->timing_of_event;}
-intPhrases::Usage::has_name_as_constant(ph_usage_data *phud) {
+intPhrases::Usage::has_name_as_constant(ph_usage_data *phud) {if ((phud->constant_phrase_holder) && (phud->explicit_name_used_in_maths == FALSE) && (Wordings::nonempty(Nouns::nominative_singular(phud->constant_phrase_holder->name)))) returnTRUE;
@@ -836,7 +836,7 @@ seen problems in Inform. A couple of variables are needed just for that:
diff --git a/docs/imperative-module/3-tp.html b/docs/imperative-module/3-tp.html
index 423213229..81c246f9f 100644
--- a/docs/imperative-module/3-tp.html
+++ b/docs/imperative-module/3-tp.html
@@ -92,12 +92,12 @@ defined as "At 9:00 AM: ..." But two values are special:
CLASS_DEFINITION} use_as_event;
-
The structure use_as_event is accessed in 2/rlb, 2/act, 3/rs, 3/phr, 3/prcd, 3/tph, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
+
The structure use_as_event is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 3/tph, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
§3. Timed events are stored in two simple arrays, processed by run-time code.
-voidPhrases::Timed::TimedEventsTable(void) {
+voidPhrases::Timed::TimedEventsTable(void) {inter_name *iname = Hierarchy::find(TIMEDEVENTSTABLE_HL);packaging_statesave = Emit::named_table_array_begin(iname, K_value);intwhen_count = 0;
@@ -117,7 +117,7 @@ defined as "At 9:00 AM: ..." But two values are special:
Hierarchy::make_available(Emit::tree(), iname);}
-voidPhrases::Timed::TimedEventTimesTable(void) {
+voidPhrases::Timed::TimedEventTimesTable(void) {inter_name *iname = Hierarchy::find(TIMEDEVENTTIMESTABLE_HL);packaging_statesave = Emit::named_table_array_begin(iname, K_number);intwhen_count = 0;
@@ -141,7 +141,7 @@ defined as "At 9:00 AM: ..." But two values are special:
diff --git a/docs/imperative-module/3-tph.html b/docs/imperative-module/3-tph.html
index 000342ebb..76117cb24 100644
--- a/docs/imperative-module/3-tph.html
+++ b/docs/imperative-module/3-tph.html
@@ -189,7 +189,7 @@ reasons, that is, to make the compiled code more legible.
-voidRoutines::ToPhrases::register_all(void) {
+voidRoutines::ToPhrases::register_all(void) {phrase *ph;intc = 0;for (ph = first_in_logical_order; ph; ph = ph->next_in_logical_order) {
@@ -234,7 +234,7 @@ values in force, so that there is no possible ambiguity in how we read K.
-to_phrase_request *Routines::ToPhrases::make_request(phrase *ph, kind *K,
+to_phrase_request *Routines::ToPhrases::make_request(phrase *ph, kind *K,kind_variable_declaration *kvd, wordingW) {if ((ph == NULL) || (K == NULL)) internal_error("bad request");
@@ -338,7 +338,7 @@ since the last time it was called.
to_phrase_request *latest_request_granted = NULL;
-intRoutines::ToPhrases::compilation_coroutine(int *i, intmax_i) {
+intRoutines::ToPhrases::compilation_coroutine(int *i, intmax_i) {intN = 0;while (TRUE) {to_phrase_request *req;
@@ -403,7 +403,7 @@ is confined to the current Chapter.
}
diff --git a/docs/imperative-module/4-lv.html b/docs/imperative-module/4-lv.html
index 328ef39c2..1ec7d6fd6 100644
--- a/docs/imperative-module/4-lv.html
+++ b/docs/imperative-module/4-lv.html
@@ -148,7 +148,7 @@ marks it as deallocated.
CLASS_DEFINITION} local_variable;
-
The structure local_variable is accessed in 2/rlb, 2/act, 3/rs, 3/phr, 3/prcd, 3/tph, 3/tp, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
+
The structure local_variable is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 3/tph, 3/tp, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
§3. A local variable needs to be stored somewhere at run-time. The obvious
correspondence is to put these into I6 local variables, which are, in effect,
CPU registers. We won't need to do much in the way of register-allocation,
@@ -1368,7 +1368,7 @@ need in the compilation of any given routine:
}
diff --git a/docs/imperative-module/4-sf.html b/docs/imperative-module/4-sf.html
index 8b53ae596..61e57a9f9 100644
--- a/docs/imperative-module/4-sf.html
+++ b/docs/imperative-module/4-sf.html
@@ -191,12 +191,12 @@ if that's active, and otherwise must be set as needed.
returncurrent_frame;}
-voidFrames::make_current(ph_stack_frame *phsf) {
+voidFrames::make_current(ph_stack_frame *phsf) {if (phsf == NULL) internal_error("can't select null stack frame");current_frame = phsf;}
-voidFrames::remove_current(void) {
+voidFrames::remove_current(void) {current_frame = NULL;}
diff --git a/docs/imperative-module/4-sv.html b/docs/imperative-module/4-sv.html
index 5f348be60..86f9551a4 100644
--- a/docs/imperative-module/4-sv.html
+++ b/docs/imperative-module/4-sv.html
@@ -107,7 +107,7 @@ function togglePopup(material_id) {
CLASS_DEFINITION} stacked_variable_owner_list;
-
The structure stacked_variable is accessed in 2/rls, 2/fao, 2/act, 3/pu, 3/dptd, 3/po, 3/pav, 6/cii, 6/cste and here.
The structure stacked_variable_list is accessed in 2/rlb, 2/act, 3/rs, 3/phr, 3/prcd, 3/tph, 3/tp, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
The structure stacked_variable_owner is private to this section.
The structure stacked_variable_owner_list is accessed in 2/rlb, 2/act, 3/rs, 3/phr, 3/prcd, 3/tph, 3/tp, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
+
The structure stacked_variable is accessed in 2/rls, 2/fao, 2/act, 3/pu, 3/dptd, 3/po, 3/pav, 6/cii, 6/cste and here.
The structure stacked_variable_list is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 3/tph, 3/tp, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
The structure stacked_variable_owner is private to this section.
The structure stacked_variable_owner_list is accessed in 2/rlb, 2/act, 3/phr, 3/prcd, 3/tph, 3/tp, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.
§2.
diff --git a/docs/imperative-module/5-cdp.html b/docs/imperative-module/5-cdp.html
index 73e7675bf..9f4b185e0 100644
--- a/docs/imperative-module/5-cdp.html
+++ b/docs/imperative-module/5-cdp.html
@@ -129,7 +129,7 @@ which create routines which... and so on.
}pcalc_prop_deferral *latest_pcd = NULL;
-intPropositions::Deferred::compilation_coroutine(void) {
+intPropositions::Deferred::compilation_coroutine(void) {intN = 0;while (TRUE) {pcalc_prop_deferral *pdef;
diff --git a/docs/imperative-module/6-cp.html b/docs/imperative-module/6-cp.html
index 844535134..5e897b366 100644
--- a/docs/imperative-module/6-cp.html
+++ b/docs/imperative-module/6-cp.html
@@ -104,7 +104,7 @@ should always be supplied for "To..." phrases, but left null for rules.
rule *R) {if ((ph->declaration_node == NULL) ||
- (Node::get_type(ph->declaration_node) != RULE_NT) ||
+ (Node::get_type(ph->declaration_node) != IMPERATIVE_NT) || (Wordings::empty(Node::get_text(ph->declaration_node))))internal_error("tried to compile phrase with bad ROUTINE node");LOGIF(PHRASE_COMPILATION, "Compiling phrase:\n$T", ph->declaration_node);
diff --git a/docs/imperative-module/index.html b/docs/imperative-module/index.html
index b5254af74..3afde2269 100644
--- a/docs/imperative-module/index.html
+++ b/docs/imperative-module/index.html
@@ -131,15 +131,10 @@
Introduction to Phrases
-
An exposition of the data structures used inside Inform to hold phrases, rules and rulebooks.
-
-
- Rule Subtrees -
- To tidy up invocation nodes into a list of children under the relevant rule node, and so turn each rule definition into a single subtree.
-
Construction Sequence -
- To deal with all the |.i6t| interpreted commands which bring about the compilation of phrases, and to ensure that they are used in the correct order.
+ Managing the timing of dealing with defined phrases and rules.
@@ -186,11 +181,6 @@
Timed Phrases -
Another way phrases can be invoked is as timed events, which need no special Inform data structure and are simply compiled into a pair of timetable I6 arrays to be processed at run-time.
-
-
- Phrasebook Index -
- To compile most of the HTML page for the Phrasebook index.
-
diff --git a/docs/index-module/2-act.html b/docs/index-module/2-act.html
index 4652a40e2..010f86500 100644
--- a/docs/index-module/2-act.html
+++ b/docs/index-module/2-act.html
@@ -161,7 +161,7 @@ function togglePopup(material_id) {
}
diff --git a/docs/index-module/2-adj.html b/docs/index-module/2-adj.html
index bf77fba4e..31705835d 100644
--- a/docs/index-module/2-adj.html
+++ b/docs/index-module/2-adj.html
@@ -104,7 +104,7 @@ prefaced "(of a rulebook)", "(of an activity)", and so on.
diff --git a/docs/index-module/2-dr.html b/docs/index-module/2-dr.html
index a6dc66f24..c47da743a 100644
--- a/docs/index-module/2-dr.html
+++ b/docs/index-module/2-dr.html
@@ -472,7 +472,7 @@ and we need to search fairly seldom:
diff --git a/docs/index-module/2-ih.html b/docs/index-module/2-ih.html
index 53864541d..8b6b9ce09 100644
--- a/docs/index-module/2-ih.html
+++ b/docs/index-module/2-ih.html
@@ -350,7 +350,7 @@ but should this arise then the best recourse is to ignore the heading.
diff --git a/docs/index-module/2-li.html b/docs/index-module/2-li.html
index 1a30099aa..3c38a2e9a 100644
--- a/docs/index-module/2-li.html
+++ b/docs/index-module/2-li.html
@@ -654,7 +654,7 @@ be able to print out a table of just those verbs created in that extension.
}
diff --git a/docs/imperative-module/3-pi.html b/docs/index-module/2-pi.html
similarity index 80%
rename from docs/imperative-module/3-pi.html
rename to docs/index-module/2-pi.html
index 6e5263432..0ca95966a 100644
--- a/docs/imperative-module/3-pi.html
+++ b/docs/index-module/2-pi.html
@@ -58,11 +58,11 @@ function togglePopup(material_id) {
To compile most of the HTML page for the Phrasebook index.
§1. The Phrasebook is produced in two passes. On pass 1, we show just the
@@ -106,21 +106,21 @@ suppress indexing of their definitions.
-voidPhrases::Index::index_page_Phrasebook(OUTPUT_STREAM) {
+voidPhrases::Index::index_page_Phrasebook(OUTPUT_STREAM) {for (intpass=1; pass<=2; pass++) {inform_extension *last_extension_named = NULL;for (intdivision = 0, N = NUMBER_CREATED(inform_extension); division <= N; division++) {heading *last_heading_named = NULL;intno_subdivision_yet = TRUE;wordingCLW = EMPTY_WORDING;
-phrase *ph, *run_begin = NULL;
-LOOP_OVER(ph, phrase) {
+phrase *ph, *run_begin = NULL;
+LOOP_OVER(ph, phrase) { include only if this is a To... phrase
-if (Phrases::Usage::get_effect(&(ph->usage_data)) != TO_PHRASE_EFF)
+if (Phrases::Usage::get_effect(&(ph->usage_data)) != TO_PHRASE_EFF)continue; and only if it is under an indexed headingheading *this_heading =
-Headings::of_wording(Node::get_text(Phrases::declaration_node(ph)));
+Headings::of_wording(Node::get_text(Phrases::declaration_node(ph)));if (Headings::indexed(this_heading) == FALSE) continue; and only if that heading lies in the piece of source for this divisioninform_extension *this_extension =
@@ -131,12 +131,12 @@ suppress indexing of their definitions.
if ((this_extension == NULL) || (this_extension->allocation_id != division)) continue; }
-if (last_extension_named != this_extension) Mark a division in the Phrasebook1.1;
-if (this_heading != last_heading_named) Mark a subdivision in the Phrasebook1.2;
+if (last_extension_named != this_extension) Mark a division in the Phrasebook1.1;
+if (this_heading != last_heading_named) Mark a subdivision in the Phrasebook1.2;last_heading_named = this_heading;last_extension_named = this_extension;
-if (pass == 2) Actually index the phrase1.3;
+if (pass == 2) Actually index the phrase1.3; } } }
@@ -168,7 +168,7 @@ the extension's name as a major subheading in our index.
}no_subdivision_yet = TRUE;
§1.2.2. The Standard Rules contain such a profusion of phrase definitions that,
without making use of subheadings, the Phrasebook Index would be a shapeless
list in which it was impossible to find things.
@@ -267,7 +267,7 @@ and the second and third pieces used as headings and subheadings respectively.
HW = GET_RW(<heading-name-hyphenated>, 1); }
-
§1.3. We see where ph is in a run of phrases which share a common documentation
symbol; only the first in the run has a plus-sign link to reveal the box of
documentation in question, and only the last in the run is followed by the
@@ -278,40 +278,40 @@ code for the box.
§2. Where the following detects if two phrases have the same documentation
symbol, i.e., are essentially rewordings of the same phrase, and will have
a single shared reveal-box:
-intPhrases::Index::ph_same_doc(phrase *p1, phrase *p2) {
+intPhrases::Index::ph_same_doc(phrase *p1, phrase *p2) {if ((p1 == NULL) || (p2 == NULL) ||
- (Wordings::empty(p1->ph_documentation_symbol)) ||
+ (Wordings::empty(p1->ph_documentation_symbol)) || (Wordings::empty(p2->ph_documentation_symbol)))returnFALSE;
-if (Wordings::match(p1->ph_documentation_symbol, p2->ph_documentation_symbol))
+if (Wordings::match(p1->ph_documentation_symbol, p2->ph_documentation_symbol))returnTRUE;returnFALSE;}
@@ -321,7 +321,7 @@ above, it may as well go here.
-voidPhrases::Index::index_definition_area(OUTPUT_STREAM, wordingW, intshow_if_unhyphenated) {
+voidPhrases::Index::index_definition_area(OUTPUT_STREAM, wordingW, intshow_if_unhyphenated) {<heading-name-hyphenated>(W);if ((<<r>> == 1) && (show_if_unhyphenated == FALSE)) return;HTML_OPEN("b");
@@ -343,7 +343,7 @@ above, it may as well go here.
}
diff --git a/docs/index-module/2-prp.html b/docs/index-module/2-prp.html
index 293d20c41..30a3af8b4 100644
--- a/docs/index-module/2-prp.html
+++ b/docs/index-module/2-prp.html
@@ -143,7 +143,7 @@ function togglePopup(material_id) {
}
diff --git a/docs/index-module/2-rls.html b/docs/index-module/2-rls.html
index a143a1bc4..6ab194e70 100644
--- a/docs/index-module/2-rls.html
+++ b/docs/index-module/2-rls.html
@@ -801,7 +801,7 @@ have affected it in this way:
The structure rulebook_indexing_data is private to this section.
The structure placement_affecting is accessed in 2/ins, 2/act, 3/scn, 4/em and here.
diff --git a/docs/index-module/2-vrb.html b/docs/index-module/2-vrb.html
index abf994f95..55d0ffeb0 100644
--- a/docs/index-module/2-vrb.html
+++ b/docs/index-module/2-vrb.html
@@ -127,7 +127,7 @@ the following:
wordingW = Headings::get_text(definition_area);HTML_CLOSE("p");HTML_OPEN("p");
-if (Wordings::nonempty(W)) Phrases::Index::index_definition_area(OUT, W, FALSE);
+if (Wordings::nonempty(W)) Phrases::Index::index_definition_area(OUT, W, FALSE); }current_area = definition_area;IXVariables::index_one(OUT, nlv);
@@ -152,7 +152,7 @@ the following:
}
diff --git a/docs/index-module/3-act.html b/docs/index-module/3-act.html
index 51d45fb4a..208367c2d 100644
--- a/docs/index-module/3-act.html
+++ b/docs/index-module/3-act.html
@@ -131,7 +131,7 @@ function togglePopup(material_id) {
HTML_OPEN("p");wordingW = Headings::get_text(definition_area);if (Wordings::nonempty(W)) {
-Phrases::Index::index_definition_area(OUT, W, TRUE);
+Phrases::Index::index_definition_area(OUT, W, TRUE); } elseif (*ext == NULL) {WRITE("<b>");WRITE("New actions");
diff --git a/docs/index-module/3-fgr.html b/docs/index-module/3-fgr.html
index 69b1a1c94..0bf289076 100644
--- a/docs/index-module/3-fgr.html
+++ b/docs/index-module/3-fgr.html
@@ -165,7 +165,7 @@ to match this width, preserving the aspect ratio.
}
diff --git a/docs/index-module/index.html b/docs/index-module/index.html
index 3f4c2ac65..d42c45c91 100644
--- a/docs/index-module/index.html
+++ b/docs/index-module/index.html
@@ -148,6 +148,11 @@
Activities -
To index activities.
+
+
+ Phrasebook Index -
+ To compile most of the HTML page for the Phrasebook index.
§3. Memory consumption. The following gives some idea of which classes of object have the most
instances, and also of how Inform's memory tends to be used in practice.
@@ -126,39 +124,39 @@ represent less than 1/1000th of the total.
§4. Preform grammar. The full annotated description of the Preform grammar (see About Preform (in words)),
with optimisation details and hit/miss statistics added, is also long: it's
@@ -381,31 +384,31 @@ sample, showing the nonterminal used to parse literals in Inform 7 source text:
@@ -415,7 +418,7 @@ sample, showing the nonterminal used to parse literals in Inform 7 source text:
@@ -426,7 +429,7 @@ sample, showing the nonterminal used to parse literals in Inform 7 source text:
is a roughly 20,000-line text file, and again is too long to quote in full.
This is a summary, showing just the portion of tree from the main source text,
that is, with the content of extensions excluded, and with the content of
-RULE_NT also cut. It still makes for a lengthy read:
+IMPERATIVE_NT also cut. It still makes for a lengthy read:
@@ -460,8 +463,8 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action} UNPARSED_NOUN_NT'asking for information' UNPARSED_NOUN_NT'out of world'
- RULE_NT'carry out asking for information' {unit: 4}
- RULE_NT'when play begins' {unit: 4}
+ IMPERATIVE_NT'carry out asking for information' {unit: 4}
+ IMPERATIVE_NT'when play begins' {unit: 4} HEADING_NT'section 1 - errands' {heading 5} {under: H5'section 1 - errands'} {unit: 4} SENTENCE_NT'the current actor is a person which varies' {unit: 4} {classified} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve}
@@ -471,8 +474,8 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'current owner' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: NONLOCAL_VARIABLE_NT'current owner' {nonlocal: 'current owner'(var)person}} {created here} COMMON_NOUN_NT'person which varies' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values variable-pointer'-k} {creation: << kind=people variable-pointer(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'every turn' {unit: 4}
- RULE_NT'every turn' {unit: 4}
+ IMPERATIVE_NT'every turn' {unit: 4}
+ IMPERATIVE_NT'every turn' {unit: 4} SENTENCE_NT'a person can be active or passive' {unit: 4} {classified} VERB_NT'can be' {verb 'be able to be' s/p 3p act IS_TENSE +ve} {special meaning: can-be} COMMON_NOUN_NT'a person' {refined} {refers: infs'person'} {creation: << kind=person(x) >>} {eval: TEST_VALUE_NT}
@@ -488,34 +491,34 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'are' {verb 'be' 3p p act IS_TENSE +ve} PROPER_NOUN_NT'character movement rules' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT {kind: rulebook} {rulebook: character movement}} {created here} COMMON_NOUN_NT'rulebook' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values based rulebook producing values'-k} {creation: << kind=rulebook(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'the first character movement rule' {unit: 4}
- RULE_NT'a character movement rule' {unit: 4}
- RULE_NT'a character movement rule' {unit: 4}
- RULE_NT'to decide whether movement has not yet occurred' {unit: 4}
- RULE_NT'definition' {unit: 4}
- RULE_NT'definition' {unit: 4}
+ IMPERATIVE_NT'the first character movement rule' {unit: 4}
+ IMPERATIVE_NT'a character movement rule' {unit: 4}
+ IMPERATIVE_NT'a character movement rule' {unit: 4}
+ IMPERATIVE_NT'to decide whether movement has not yet occurred' {unit: 4}
+ IMPERATIVE_NT'definition' {unit: 4}
+ IMPERATIVE_NT'definition' {unit: 4} SENTENCE_NT'the shopowner rules is a rulebook' {unit: 4} {classified} {clears pronouns} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'shopowner rules' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT {kind: rulebook} {rulebook: shopowner}} {created here} COMMON_NOUN_NT'rulebook' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values based rulebook producing values'-k} {creation: << kind=rulebook(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'a shopowner rule' {unit: 4}
- RULE_NT'report someone closing a door when the person asked owns the' {unit: 4}
- RULE_NT'report vanessa closing the metal door when the metal door is' {unit: 4}
- RULE_NT'a shopowner rule' {unit: 4}
+ IMPERATIVE_NT'a shopowner rule' {unit: 4}
+ IMPERATIVE_NT'report someone closing a door when the person asked owns the' {unit: 4}
+ IMPERATIVE_NT'report vanessa closing the metal door when the metal door is' {unit: 4}
+ IMPERATIVE_NT'a shopowner rule' {unit: 4} SENTENCE_NT'filing is an action applying to one thing' {unit: 4} {classified} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action} UNPARSED_NOUN_NT'filing' UNPARSED_NOUN_NT'applying to one thing'
- RULE_NT'before someone filing something which is not carried by the ' {unit: 4}
- RULE_NT'carry out someone filing' {unit: 4}
- RULE_NT'report someone filing' {unit: 4}
+ IMPERATIVE_NT'before someone filing something which is not carried by the ' {unit: 4}
+ IMPERATIVE_NT'carry out someone filing' {unit: 4}
+ IMPERATIVE_NT'report someone filing' {unit: 4} SENTENCE_NT'the shopper rules is a rulebook' {unit: 4} {classified} {clears pronouns} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'shopper rules' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT {kind: rulebook} {rulebook: shopper}} {created here} COMMON_NOUN_NT'rulebook' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values based rulebook producing values'-k} {creation: << kind=rulebook(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'a shopper rule' {unit: 4}
- RULE_NT'a shopper rule' {unit: 4}
- RULE_NT'definition' {unit: 4}
+ IMPERATIVE_NT'a shopper rule' {unit: 4}
+ IMPERATIVE_NT'a shopper rule' {unit: 4}
+ IMPERATIVE_NT'definition' {unit: 4} SENTENCE_NT'protection relates a door ( called x ) to a room ( called y ' {unit: 4} {classified} VERB_NT'relates' {verb 'relate' 3p s act IS_TENSE +ve} {special meaning: new-relation} UNPARSED_NOUN_NT'protection' {new relation: protection}
@@ -543,8 +546,8 @@ that is, with the content of extensions excluded, and with the content of
COMMON_NOUN_NT'artwork' {indefinite 'an' n/m/f nom/acc s} {refined} {creation: << kind=artwork(x) >>} {refers: infs'artwork'} {eval: TEST_VALUE_NT} {created here} KIND_NT'kind of thing' {refined} {refers: infs'thing'} COMMON_NOUN_NT'thing' {refined} {refers: infs'thing'} {creation: << kind=thing(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'before printing the name of an artwork' {unit: 4}
- RULE_NT'after printing the name of an artwork' {unit: 4}
+ IMPERATIVE_NT'before printing the name of an artwork' {unit: 4}
+ IMPERATIVE_NT'after printing the name of an artwork' {unit: 4} SENTENCE_NT'an artwork can be submitted or reserved' {unit: 4} {classified} VERB_NT'can be' {verb 'be able to be' s/p 3p act IS_TENSE +ve} {special meaning: can-be} COMMON_NOUN_NT'an artwork' {refined} {refers: infs'artwork'} {creation: << kind=artwork(x) >>} {eval: TEST_VALUE_NT}
@@ -557,49 +560,49 @@ that is, with the content of extensions excluded, and with the content of
COMMON_NOUN_NT'book' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: << kind=book(x) >>} {refers: infs'book'} {eval: TEST_VALUE_NT} {created here} KIND_NT'kind of artwork' {refined} {refers: infs'artwork'} COMMON_NOUN_NT'artwork' {refined} {refers: infs'artwork'} {creation: << kind=artwork(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'before someone resolving a book when the person asked is not' {unit: 4}
- RULE_NT'carry out someone resolving a book' {unit: 4}
- RULE_NT'report someone resolving a book' {unit: 4}
- RULE_NT'before listing contents' {unit: 4}
- RULE_NT'before grouping together books' {unit: 4}
+ IMPERATIVE_NT'before someone resolving a book when the person asked is not' {unit: 4}
+ IMPERATIVE_NT'carry out someone resolving a book' {unit: 4}
+ IMPERATIVE_NT'report someone resolving a book' {unit: 4}
+ IMPERATIVE_NT'before listing contents' {unit: 4}
+ IMPERATIVE_NT'before grouping together books' {unit: 4} SENTENCE_NT'a stamped envelope is a kind of thing' {unit: 4} {classified} {interpretation of subject: infs'book'} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} COMMON_NOUN_NT'stamped envelope' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: << kind=stamped envelope(x) >>} {refers: infs'stamped envelope'} {eval: TEST_VALUE_NT} {created here} KIND_NT'kind of thing' {refined} {refers: infs'thing'} COMMON_NOUN_NT'thing' {refined} {refers: infs'thing'} {creation: << kind=thing(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'before someone resolving a stamped envelope when the person ' {unit: 4}
- RULE_NT'carry out someone resolving a stamped envelope' {unit: 4}
- RULE_NT'report someone resolving a stamped envelope' {unit: 4}
- RULE_NT'instead of someone resolving a stamped envelope when the per' {unit: 4}
+ IMPERATIVE_NT'before someone resolving a stamped envelope when the person ' {unit: 4}
+ IMPERATIVE_NT'carry out someone resolving a stamped envelope' {unit: 4}
+ IMPERATIVE_NT'report someone resolving a stamped envelope' {unit: 4}
+ IMPERATIVE_NT'instead of someone resolving a stamped envelope when the per' {unit: 4} SENTENCE_NT'a dvd is a kind of artwork' {unit: 4} {classified} {interpretation of subject: infs'stamped envelope'} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} COMMON_NOUN_NT'dvd' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: << kind=dvd(x) >>} {refers: infs'dvd'} {eval: TEST_VALUE_NT} {created here} KIND_NT'kind of artwork' {refined} {refers: infs'artwork'} COMMON_NOUN_NT'artwork' {refined} {refers: infs'artwork'} {creation: << kind=artwork(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'before someone resolving a dvd when the person asked is not ' {unit: 4}
- RULE_NT'carry out someone resolving a dvd' {unit: 4}
- RULE_NT'report someone resolving a dvd' {unit: 4}
- RULE_NT'instead of someone resolving a dvd when the person asked car' {unit: 4}
- RULE_NT'before listing contents' {unit: 4}
- RULE_NT'before grouping together dvds' {unit: 4}
+ IMPERATIVE_NT'before someone resolving a dvd when the person asked is not ' {unit: 4}
+ IMPERATIVE_NT'carry out someone resolving a dvd' {unit: 4}
+ IMPERATIVE_NT'report someone resolving a dvd' {unit: 4}
+ IMPERATIVE_NT'instead of someone resolving a dvd when the person asked car' {unit: 4}
+ IMPERATIVE_NT'before listing contents' {unit: 4}
+ IMPERATIVE_NT'before grouping together dvds' {unit: 4} SENTENCE_NT'approaching is an action applying to one thing' {unit: 4} {classified} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action} UNPARSED_NOUN_NT'approaching' UNPARSED_NOUN_NT'applying to one thing'
- RULE_NT'carry out someone approaching' {unit: 4}
+ IMPERATIVE_NT'carry out someone approaching' {unit: 4} SENTENCE_NT'a coupon is a kind of thing' {unit: 4} {classified} {interpretation of subject: infs'dvd'} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} COMMON_NOUN_NT'coupon' {indefinite 'a' n/m/f nom/acc s} {refined} {creation: << kind=coupon(x) >>} {refers: infs'coupon'} {eval: TEST_VALUE_NT} {created here} KIND_NT'kind of thing' {refined} {refers: infs'thing'} COMMON_NOUN_NT'thing' {refined} {refers: infs'thing'} {creation: << kind=thing(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'carry out someone resolving a coupon' {unit: 4}
+ IMPERATIVE_NT'carry out someone resolving a coupon' {unit: 4} SENTENCE_NT'the block giving rule is not listed in any rulebook' {unit: 4} {classified} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {rule placement sense: negative} {special meaning: rule-listed-in} UNPARSED_NOUN_NT'the block giving rule' UNPARSED_NOUN_NT'in any rulebook'
- RULE_NT'check giving something to someone ( this is the block player' {unit: 4}
- RULE_NT'before someone resolving a coupon when the person asked is n' {unit: 4}
- RULE_NT'after someone giving a coupon to vanessa' {unit: 4}
+ IMPERATIVE_NT'check giving something to someone ( this is the block player' {unit: 4}
+ IMPERATIVE_NT'before someone resolving a coupon when the person asked is n' {unit: 4}
+ IMPERATIVE_NT'after someone giving a coupon to vanessa' {unit: 4} SENTENCE_NT'infection color is a kind of value' {unit: 4} {classified} {interpretation of subject: infs'coupon'} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} COMMON_NOUN_NT'infection color' {refined} {creation: << kind=infection color(x) >>} {refers: infs'object'-k} {eval: TEST_VALUE_NT} {created here}
@@ -659,7 +662,7 @@ that is, with the content of extensions excluded, and with the content of
AND_NT',' {refined} PROPER_NOUN_NT'saffron silk' {refined} {refers: infs'saffron silk'} {eval: CONSTANT_NT'saffron silk' {kind: infection color} {instance: I86'saffron silk'[infection color]} {enumeration: 25}} {created here} PROPER_NOUN_NT'cookie dough cream' {refined} {refers: infs'cookie dough cream'} {eval: CONSTANT_NT'cookie dough cream' {kind: infection color} {instance: I87'cookie dough cream'[infection color]} {enumeration: 26}} {created here}
- RULE_NT'to say list of flavors' {unit: 4}
+ IMPERATIVE_NT'to say list of flavors' {unit: 4} SENTENCE_NT'understand "ask vanessa for [flavored ice cream]" as buying ' {unit: 4} {classified} VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as} UNPARSED_NOUN_NT'"ask vanessa for [flavored ice cream]"'
@@ -672,8 +675,8 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action} UNPARSED_NOUN_NT'buying the flavor' UNPARSED_NOUN_NT'applying to one infection color'
- RULE_NT'check buying the flavor' {unit: 4}
- RULE_NT'carry out buying the flavor' {unit: 4}
+ IMPERATIVE_NT'check buying the flavor' {unit: 4}
+ IMPERATIVE_NT'carry out buying the flavor' {unit: 4} SENTENCE_NT'understand "ice cream" or "cream" or "ice" or "sherbet" or "' {unit: 4} {classified} VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as} UNPARSED_NOUN_NT'"ice cream" or "cream" or "ice" or "sherbet" or "sorbet"'
@@ -707,12 +710,12 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as} UNPARSED_NOUN_NT'the infection color property' UNPARSED_NOUN_NT'referring to an ice cream cone'
- RULE_NT'carry out someone resolving an ice cream cone' {unit: 4}
- RULE_NT'instead of someone eating a fresh ice cream cone' {unit: 4}
- RULE_NT'report someone eating an ice cream cone' {unit: 4}
- RULE_NT'before printing the name of an ice cream cone' {unit: 4}
+ IMPERATIVE_NT'carry out someone resolving an ice cream cone' {unit: 4}
+ IMPERATIVE_NT'instead of someone eating a fresh ice cream cone' {unit: 4}
+ IMPERATIVE_NT'report someone eating an ice cream cone' {unit: 4}
+ IMPERATIVE_NT'before printing the name of an ice cream cone' {unit: 4} HEADING_NT'section 2 - infection rules' {heading 5} {under: H5'section 2 - infection rules'} {unit: 4}
- RULE_NT'this is the infection rule' {unit: 4}
+ IMPERATIVE_NT'this is the infection rule' {unit: 4} SENTENCE_NT'a person can be infected or clean' {unit: 4} {classified} VERB_NT'can be' {verb 'be able to be' s/p 3p act IS_TENSE +ve} {special meaning: can-be} COMMON_NOUN_NT'a person' {refined} {refers: infs'person'} {creation: << kind=person(x) >>} {eval: TEST_VALUE_NT}
@@ -725,11 +728,11 @@ that is, with the content of extensions excluded, and with the content of
COMMON_NOUN_NT'person' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'person'} {creation: << kind=person(x) >>} {eval: TEST_VALUE_NT} ALLOWED_NT'has' {refined} UNPARSED_NOUN_NT'infection color' {indefinite 'an' n/m/f nom/acc s} {refined}
- RULE_NT'every turn' {unit: 4}
- RULE_NT'definition' {unit: 4}
- RULE_NT'definition' {unit: 4}
- RULE_NT'when play begins' {unit: 4}
- RULE_NT'every turn' {unit: 4}
+ IMPERATIVE_NT'every turn' {unit: 4}
+ IMPERATIVE_NT'definition' {unit: 4}
+ IMPERATIVE_NT'definition' {unit: 4}
+ IMPERATIVE_NT'when play begins' {unit: 4}
+ IMPERATIVE_NT'every turn' {unit: 4} SENTENCE_NT'understand "sneeze on [something]" as sneezing on' {unit: 4} {classified} VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as} UNPARSED_NOUN_NT'"sneeze on [something]"'
@@ -738,11 +741,11 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action} UNPARSED_NOUN_NT'sneezing on' UNPARSED_NOUN_NT'applying to one thing'
- RULE_NT'check sneezing on' {unit: 4}
- RULE_NT'carry out sneezing on' {unit: 4}
- RULE_NT'carry out someone sneezing on' {unit: 4}
- RULE_NT'report sneezing on' {unit: 4}
- RULE_NT'report someone sneezing on' {unit: 4}
+ IMPERATIVE_NT'check sneezing on' {unit: 4}
+ IMPERATIVE_NT'carry out sneezing on' {unit: 4}
+ IMPERATIVE_NT'carry out someone sneezing on' {unit: 4}
+ IMPERATIVE_NT'report sneezing on' {unit: 4}
+ IMPERATIVE_NT'report someone sneezing on' {unit: 4} SENTENCE_NT'understand "inject [someone] with [something]" as injecting ' {unit: 4} {classified} VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as} UNPARSED_NOUN_NT'"inject [someone] with [something]"'
@@ -763,10 +766,10 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action} UNPARSED_NOUN_NT'injecting it with' UNPARSED_NOUN_NT'applying to two things'
- RULE_NT'check injecting it with' {unit: 4}
- RULE_NT'carry out injecting it with' {unit: 4}
- RULE_NT'after injecting the player with something' {unit: 4}
- RULE_NT'report injecting it with' {unit: 4}
+ IMPERATIVE_NT'check injecting it with' {unit: 4}
+ IMPERATIVE_NT'carry out injecting it with' {unit: 4}
+ IMPERATIVE_NT'after injecting the player with something' {unit: 4}
+ IMPERATIVE_NT'report injecting it with' {unit: 4} HEADING_NT'section 3 - geography' {heading 5} {under: H5'section 3 - geography'} {unit: 4} INCLUSION_NT'include locksmith by emily short' {unit: 4} HEADING_NT'version 12 of locksmith by emily short begins here' {heading 0} {under: H0'version 12 of locksmith by emily short begins here'} {includes: Locksmith by Emily Short v12 } {unit: 4}
@@ -791,9 +794,9 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action} UNPARSED_NOUN_NT'going toward' UNPARSED_NOUN_NT'applying to one thing'
- RULE_NT'check going toward' {unit: 4}
- RULE_NT'carry out going toward' {unit: 4}
- RULE_NT'instead of waiting when the destination of the player is not' {unit: 4}
+ IMPERATIVE_NT'check going toward' {unit: 4}
+ IMPERATIVE_NT'carry out going toward' {unit: 4}
+ IMPERATIVE_NT'instead of waiting when the destination of the player is not' {unit: 4} SENTENCE_NT'understand "stop" or "cease" as stopping' {unit: 4} {classified} VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as} UNPARSED_NOUN_NT'"stop" or "cease"'
@@ -802,11 +805,11 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action} UNPARSED_NOUN_NT'stopping' UNPARSED_NOUN_NT'applying to nothing'
- RULE_NT'carry out stopping' {unit: 4}
- RULE_NT'report stopping' {unit: 4}
- RULE_NT'after going to an air-conditioned room' {unit: 4}
- RULE_NT'after going from an air-conditioned room' {unit: 4}
- RULE_NT'instead of listening to an air-conditioned room' {unit: 4}
+ IMPERATIVE_NT'carry out stopping' {unit: 4}
+ IMPERATIVE_NT'report stopping' {unit: 4}
+ IMPERATIVE_NT'after going to an air-conditioned room' {unit: 4}
+ IMPERATIVE_NT'after going from an air-conditioned room' {unit: 4}
+ IMPERATIVE_NT'instead of listening to an air-conditioned room' {unit: 4} SENTENCE_NT'the alfred cralle pool hall is a room' {unit: 4} {classified} {interpretation of subject: infs'person'} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'alfred cralle pool hall' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'alfred cralle pool hall'} {eval: CONSTANT_NT'alfred cralle pool hall' {kind: object} {instance: I88'alfred cralle pool hall'} {enumeration: 0}} {created here}
@@ -848,7 +851,7 @@ that is, with the content of extensions excluded, and with the content of
PROPER_NOUN_NT'felt door' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'felt door'} {eval: CONSTANT_NT'felt door' {kind: door} {instance: I90'felt door'} {enumeration: 0}} PROPER_NOUN_NT'description' {refined} {eval: CONSTANT_NT {kind: texts valued property} {property: 'description'=text}} PROPER_NOUN_NT'"It has a prominent lock, designed for an old-fashioned key.' {refined} {eval: CONSTANT_NT'"It has a prominent lock, designed for an old-fashioned key.' {kind: text}}
- RULE_NT'after locking a door with something in the presence of an ot' {unit: 4}
+ IMPERATIVE_NT'after locking a door with something in the presence of an ot' {unit: 4} SENTENCE_NT'nancy johnson memorial square is west of the felt door' {unit: 4} {classified} {interpretation of subject: infs'key to the city'} VERB_NT'is west of' {verb 'be' 3p s act IS_TENSE +ve} {prep1: west of} PROPER_NOUN_NT'nancy johnson memorial square' {refined} {refers: infs'nancy johnson memorial square'} {eval: CONSTANT_NT'nancy johnson memorial square' {kind: object} {instance: I92'nancy johnson memorial square'} {enumeration: 0}} {created here}
@@ -910,8 +913,8 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'slot' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'slot'} {eval: CONSTANT_NT'slot' {kind: object} {instance: I97'slot'} {enumeration: 0}} COMMON_NOUN_NT'container' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'container'} {creation: << kind=container(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'carry out inserting something into the slot' {unit: 4}
- RULE_NT'report inserting something into the slot' {unit: 4}
+ IMPERATIVE_NT'carry out inserting something into the slot' {unit: 4}
+ IMPERATIVE_NT'report inserting something into the slot' {unit: 4} SENTENCE_NT'hamwi street is northeast of an iron gate' {unit: 4} {classified} {interpretation of subject: infs'slot'} VERB_NT'is northeast of' {verb 'be' 3p s act IS_TENSE +ve} {prep1: northeast of} PROPER_NOUN_NT'hamwi street' {refined} {refers: infs'hamwi street'} {eval: CONSTANT_NT'hamwi street' {kind: object} {instance: I98'hamwi street'} {enumeration: 0}} {created here}
@@ -935,7 +938,7 @@ that is, with the content of extensions excluded, and with the content of
AND_NT'and' {refined} ADJECTIVE_NT'lockable' {refined} {predicate: lockable} {creation: << lockable(x) ^ lockable(x) >>} ADJECTIVE_NT'unlocked' {refined} {predicate: unlocked} {creation: << unlocked(x) ^ unlocked(x) >>}
- RULE_NT'before printing the name of the iron gate while not opening ' {unit: 4}
+ IMPERATIVE_NT'before printing the name of the iron gate while not opening ' {unit: 4} SENTENCE_NT'cold comfort ice cream is north of a metal door' {unit: 4} {classified} {interpretation of subject: infs'iron gate'} VERB_NT'is north of' {verb 'be' 3p s act IS_TENSE +ve} {prep1: north of} PROPER_NOUN_NT'cold comfort ice cream' {refined} {refers: infs'cold comfort ice cream'} {eval: CONSTANT_NT'cold comfort ice cream' {kind: object} {instance: I100'cold comfort ice cream'} {enumeration: 0}} {created here}
@@ -1041,8 +1044,8 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as} UNPARSED_NOUN_NT'"glass"' UNPARSED_NOUN_NT'the box'
- RULE_NT'instead of attacking the closed emergency box' {unit: 4}
- RULE_NT'instead of attacking the open emergency box' {unit: 4}
+ IMPERATIVE_NT'instead of attacking the closed emergency box' {unit: 4}
+ IMPERATIVE_NT'instead of attacking the open emergency box' {unit: 4} SENTENCE_NT'the syringe is in the emergency box' {unit: 4} {classified} {interpretation of subject: infs'emergency box'} VERB_NT'is in' {verb 'be' 3p s act IS_TENSE +ve} {prep1: in} PROPER_NOUN_NT'syringe' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'syringe'} {eval: CONSTANT_NT'syringe' {kind: object} {instance: I109'syringe'} {enumeration: 0}} {created here}
@@ -1145,9 +1148,9 @@ that is, with the content of extensions excluded, and with the content of
SENTENCE_NT'use full-length room descriptions' {unit: 4} {classified} VERB_NT'use' {verb 'use' 3p p act IS_TENSE +ve} {special meaning: use} UNPARSED_NOUN_NT'full-length room descriptions'
- RULE_NT'after looking in an outdoors room' {unit: 4}
- RULE_NT'definition' {unit: 4}
- RULE_NT'before exiting when the player is in an indoors room' {unit: 4}
+ IMPERATIVE_NT'after looking in an outdoors room' {unit: 4}
+ IMPERATIVE_NT'definition' {unit: 4}
+ IMPERATIVE_NT'before exiting when the player is in an indoors room' {unit: 4} SENTENCE_NT'blank is a room' {unit: 4} {classified} {interpretation of subject: infs'key to the city'} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'blank' {refined} {refers: infs'blank'} {eval: CONSTANT_NT'blank' {kind: object} {instance: I113'blank'} {enumeration: 0}} {created here}
@@ -1373,15 +1376,15 @@ that is, with the content of extensions excluded, and with the content of
PROPER_NOUN_NT'ned' {refined} {refers: infs'ned'} {eval: CONSTANT_NT'ned' {kind: man} {instance: I166'ned'} {enumeration: 0}} RELATIONSHIP_NT'owns' {meaning: ownership-r} {refined} PROPER_NOUN_NT'movie rental' {definite 'the' n/m/f s/p nom/acc} {refined} {refers: infs'movie rental store'} {eval: CONSTANT_NT'movie rental store' {kind: object} {instance: I104'movie rental store'} {enumeration: 0}}
- RULE_NT'after printing the name of someone ( called target ) while l' {unit: 4}
+ IMPERATIVE_NT'after printing the name of someone ( called target ) while l' {unit: 4} SENTENCE_NT'the description of a person is usually "[The noun] [if the n' {unit: 4} {classified} {interpretation of subject: infs'ned'} VERB_NT'is usually' {certainty:likely} {verb 'be' 3p s act IS_TENSE +ve} X_OF_Y_NT'description of a person' {definite 'the' n/m/f s/p nom/acc} {refined} COMMON_NOUN_NT'person' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'person'} {creation: << kind=person(x) >>} {eval: TEST_VALUE_NT} PROPER_NOUN_NT'description' {refined} {eval: CONSTANT_NT {kind: texts valued property} {property: 'description'=text}} PROPER_NOUN_NT'"[The noun] [if the noun is clean]looks healthy[otherwise]is' {refined} {eval: CONSTANT_NT'"[The noun] [if the noun is clean]looks healthy[otherwise]is' {kind: text}}
- RULE_NT'after examining another person who is carrying something' {unit: 4}
- RULE_NT'when play begins' {unit: 4}
+ IMPERATIVE_NT'after examining another person who is carrying something' {unit: 4}
+ IMPERATIVE_NT'when play begins' {unit: 4} HEADING_NT'section 5 - conversation' {heading 5} {under: H5'section 5 - conversation'} {unit: 4} SENTENCE_NT'a person has a table name called conversation' {unit: 4} {classified} VERB_NT'has' {verb 'have' 3p s act IS_TENSE +ve}
@@ -1390,8 +1393,8 @@ that is, with the content of extensions excluded, and with the content of
PROPERTYCALLED_NT'called' UNPARSED_NOUN_NT'table name' {indefinite 'a' n/m/f nom/acc s} UNPARSED_NOUN_NT'conversation'
- RULE_NT'instead of asking someone about something' {unit: 4}
- RULE_NT'instead of telling someone about something' {unit: 4}
+ IMPERATIVE_NT'instead of asking someone about something' {unit: 4}
+ IMPERATIVE_NT'instead of telling someone about something' {unit: 4} SENTENCE_NT'understand "recap" or "recall" or "review" as recalling conv' {unit: 4} {classified} VERB_NT'understand' {verb 'understand' 3p p act IS_TENSE +ve} {prep2: as} {special meaning: understand-as} UNPARSED_NOUN_NT'"recap" or "recall" or "review"'
@@ -1400,7 +1403,7 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} {special meaning: new-action} UNPARSED_NOUN_NT'recalling conversations' UNPARSED_NOUN_NT'applying to nothing'
- RULE_NT'carry out recalling conversations' {unit: 4}
+ IMPERATIVE_NT'carry out recalling conversations' {unit: 4} SENTENCE_NT'the conversation of a person is usually table of general chi' {unit: 4} {classified} {interpretation of subject: infs'person'} VERB_NT'is usually' {certainty:likely} {verb 'be' 3p s act IS_TENSE +ve} X_OF_Y_NT'conversation of a person' {definite 'the' n/m/f s/p nom/acc} {refined}
@@ -1415,7 +1418,7 @@ that is, with the content of extensions excluded, and with the content of
PROPER_NOUN_NT'conversation' {refined} {eval: CONSTANT_NT {kind: table names valued property} {property: 'conversation'=table name}} PROPER_NOUN_NT'table of vanessa chatter' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: CONSTANT_NT'table of vanessa chatter' {kind: table name} {table: table_data}{meaning: {table of vanessa chatter = TABLE_MC}}} TABLE_NT'table of vanessa chatter topic reply summary turn stamp char' {unit: 4}
- RULE_NT'after reading a command' {unit: 4}
+ IMPERATIVE_NT'after reading a command' {unit: 4} HEADING_NT'section 6 - movement description' {heading 5} {under: H5'section 6 - movement description'} {unit: 4} SENTENCE_NT'a person has some text called walk style' {unit: 4} {classified} VERB_NT'has' {verb 'have' 3p s act IS_TENSE +ve}
@@ -1462,8 +1465,8 @@ that is, with the content of extensions excluded, and with the content of
PROPER_NOUN_NT'"sashay"' {refined} {eval: CONSTANT_NT'"sashay"' {kind: text}} TABLE_NT'table of visible exits character second third heading chosen' {unit: 4} TABLE_NT'table of visible entrances character second third heading ch' {unit: 4}
- RULE_NT'to clear ( current table - a table name )' {unit: 4}
- RULE_NT'to tidy departures of ( current table - a table name )' {unit: 4}
+ IMPERATIVE_NT'to clear ( current table - a table name )' {unit: 4}
+ IMPERATIVE_NT'to tidy departures of ( current table - a table name )' {unit: 4} SENTENCE_NT'a door has a person called last opener' {unit: 4} {classified} {interpretation of subject: infs'person'} VERB_NT'has' {verb 'have' 3p s act IS_TENSE +ve} COMMON_NOUN_NT'door' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'door'} {creation: << kind=door(x) >>} {eval: TEST_VALUE_NT}
@@ -1471,21 +1474,21 @@ that is, with the content of extensions excluded, and with the content of
PROPERTYCALLED_NT'called' UNPARSED_NOUN_NT'person' {indefinite 'a' n/m/f nom/acc s} UNPARSED_NOUN_NT'last opener'
- RULE_NT'report someone opening a door' {unit: 4}
- RULE_NT'report someone going through a door ( called route )' {unit: 4}
+ IMPERATIVE_NT'report someone opening a door' {unit: 4}
+ IMPERATIVE_NT'report someone going through a door ( called route )' {unit: 4} SENTENCE_NT'the last thing named is a thing that varies' {unit: 4} {classified} {interpretation of subject: infs'door'} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'last thing named' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: NONLOCAL_VARIABLE_NT'last thing named' {nonlocal: 'last thing named'(var)thing}} {created here} COMMON_NOUN_NT'thing that varies' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values variable-pointer'-k} {creation: << kind=things variable-pointer(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'before printing the name of something ( called target ) whic' {unit: 4}
- RULE_NT'report someone going a direction' {unit: 4}
- RULE_NT'this is the movement reporting rule' {unit: 4}
- RULE_NT'to generate descriptions from ( current table - a table name' {unit: 4}
+ IMPERATIVE_NT'before printing the name of something ( called target ) whic' {unit: 4}
+ IMPERATIVE_NT'report someone going a direction' {unit: 4}
+ IMPERATIVE_NT'this is the movement reporting rule' {unit: 4}
+ IMPERATIVE_NT'to generate descriptions from ( current table - a table name' {unit: 4} SENTENCE_NT'the last person named is a person that varies' {unit: 4} {classified} {interpretation of subject: infs'door'} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'last person named' {definite 'the' n/m/f s/p nom/acc} {refined} {eval: NONLOCAL_VARIABLE_NT'last person named' {nonlocal: 'last person named'(var)person}} {created here} COMMON_NOUN_NT'person that varies' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'values variable-pointer'-k} {creation: << kind=people variable-pointer(x) >>} {eval: TEST_VALUE_NT}
- RULE_NT'before printing the name of a person ( called target )' {unit: 4}
+ IMPERATIVE_NT'before printing the name of a person ( called target )' {unit: 4} SENTENCE_NT'group size is a number that varies' {unit: 4} {classified} {interpretation of subject: infs'door'} VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'group size' {refined} {eval: NONLOCAL_VARIABLE_NT'group size' {nonlocal: 'group size'(var)number}} {created here}
@@ -1494,19 +1497,19 @@ that is, with the content of extensions excluded, and with the content of
VERB_NT'is' {verb 'be' 3p s act IS_TENSE +ve} PROPER_NOUN_NT'group size' {refined} {eval: NONLOCAL_VARIABLE_NT'group size' {nonlocal: 'group size'(var)number}{meaning: {group size = VARIABLE_MC}}} PROPER_NOUN_NT'1' {refined} {eval: CONSTANT_NT'1' {kind: number} {explicit literal} {number: 1}}
- RULE_NT'to clear marked people' {unit: 4}
- RULE_NT'before listing nondescript items' {unit: 4}
- RULE_NT'to describe patients' {unit: 4}
- RULE_NT'to say ( named character - a man ) as pronoun' {unit: 4}
- RULE_NT'to say ( named character - a woman ) as pronoun' {unit: 4}
- RULE_NT'to say looks as though dipped in for ( index - a number )' {unit: 4}
+ IMPERATIVE_NT'to clear marked people' {unit: 4}
+ IMPERATIVE_NT'before listing nondescript items' {unit: 4}
+ IMPERATIVE_NT'to describe patients' {unit: 4}
+ IMPERATIVE_NT'to say ( named character - a man ) as pronoun' {unit: 4}
+ IMPERATIVE_NT'to say ( named character - a woman ) as pronoun' {unit: 4}
+ IMPERATIVE_NT'to say looks as though dipped in for ( index - a number )' {unit: 4} TABLE_NT'table of dipping phrases dipping "looks as though dipped in"' {unit: 4} SENTENCE_NT'a door is usually scenery' {unit: 4} {classified} {interpretation of subject: infs'door'} VERB_NT'is usually' {certainty:likely} {verb 'be' 3p s act IS_TENSE +ve} COMMON_NOUN_NT'door' {indefinite 'a' n/m/f nom/acc s} {refined} {refers: infs'door'} {creation: << kind=door(x) >>} {eval: TEST_VALUE_NT} ADJECTIVE_NT'scenery' {refined} {predicate: scenery} {creation: << scenery(x) ^ scenery(x) >>}
- RULE_NT'to make delimiter ( index - a number ) of ( count - a number' {unit: 4}
- RULE_NT'to say optional comma' {unit: 4}
+ IMPERATIVE_NT'to make delimiter ( index - a number ) of ( count - a number' {unit: 4}
+ IMPERATIVE_NT'to say optional comma' {unit: 4} SENTENCE_NT'test me with go to cold comfort / z / z / z / z / ask vaness' {unit: 4} {classified} VERB_NT'test' {verb 'test' 3p p act IS_TENSE +ve} {prep2: with} {special meaning: test-with} UNPARSED_NOUN_NT'me'
@@ -1584,7 +1587,7 @@ that is, with the content of extensions excluded, and with the content of
diff --git a/docs/inform7/preform-diagnostics.txt b/docs/inform7/preform-diagnostics.txt
index 4b393e80b..af3c0c96e 100644
--- a/docs/inform7/preform-diagnostics.txt
+++ b/docs/inform7/preform-diagnostics.txt
@@ -1,10 +1,10 @@
- internal nti 18 constraint (none) extremes [1, 1]
+ internal nti 24 constraint (none) extremes [1, 1]
- internal hits 1152/6782 nti 19 constraint (none) extremes [0, 0]
+ internal hits 1145/6214 nti 25 constraint (none) extremes [0, 0]
- internal hits 3873/7958 nti 20 constraint (none) extremes [0, 0]
+ internal hits 3873/7958 nti 26 constraint (none) extremes [0, 0]
- hits 746/1492 nti 21 constraint (none) extremes [1, infinity)
+ hits 746/1492 nti 27 constraint (none) extremes [1, infinity)
English:
{......}
(hits 746/746) (matched long text) constraint (none) extremes [1, infinity)
@@ -14,24 +14,24 @@
{......} , {......}
(hits 6/13) (matched long text) constraint DS = {15} extremes [3, infinity)
- internal nti 22 constraint (none) extremes [1, 1]
+ internal nti 28 constraint (none) extremes [1, 1]
- internal hits 2894/22582 nti 23 constraint (none) extremes [1, 1]
+ internal hits 1933/20050 nti 29 constraint (none) extremes [1, 1]
- internal nti 24 constraint (none) extremes [1, 1]
+ internal nti 30 constraint (none) extremes [1, 1]
- internal hits 25/50 nti 25 constraint (none) extremes [1, 1]
+ internal hits 25/50 nti 31 constraint (none) extremes [1, 1]
- internal nti 26 constraint (none) extremes [1, 1]
+ internal nti 6 constraint (none) extremes [1, 1]
- internal hits 2/12958 nti 27 constraint (none) extremes [0, 0]
+ internal hits 2/12958 nti 7 constraint (none) extremes [0, 0]
hits 0/18 nti 16 constraint DS = {16} extremes [3, infinity)
English:
{......} , _or {......}
- (hits 0/7) constraint DS = {16} extremes [4, infinity)
+ (hits 0/5) constraint DS = {16} extremes [4, infinity)
{......} _or {......}
- (hits 0/7) constraint DS = {16} extremes [3, infinity)
+ (hits 0/5) constraint DS = {16} extremes [3, infinity)
nti 17 constraint DS = {17} extremes [3, infinity)
English:
@@ -73,11 +73,11 @@
{...} than
constraint DS = {22} extremes [2, infinity)
- internal nti 28 constraint (none) extremes [1, infinity)
+ internal nti 8 constraint (none) extremes [1, infinity)
- internal nti 29 constraint (none) extremes [1, infinity)
+ internal nti 9 constraint (none) extremes [1, infinity)
- nti 30 constraint CW = {23, 24, 25} extremes [2, 2]
+ nti 10 constraint CW = {23, 24, 25} extremes [2, 2]
English:
constraint CS = {23} extremes [2, 2]
@@ -339,7 +339,7 @@
yw* an
constraint CS = {25} extremes [2, 2]
- nti 31 constraint DW = {6, 7, 26, 27, 28, 29, 30, 31} extremes [3, infinity)
+ nti 11 constraint DW = {6, 7, 26, 27, 28, 29, 30, 31} extremes [3, infinity)
English:
{...}
constraint DS = {26} extremes [3, infinity)
@@ -1499,7 +1499,7 @@
shouldn't shouldn't
constraint CS = {25} extremes [2, 2]
- nti 6 constraint DW = {12, 13, 14, 15, 16} extremes [3, infinity)
+ nti 12 constraint DW = {12, 13, 14, 15, 16} extremes [3, infinity)
English:
{...}
constraint DS = {12} extremes [3, infinity)
@@ -2025,7 +2025,7 @@
* 0ing
constraint CS = {16} extremes [2, 2]
- nti 7 constraint DW = {17, 18, 19, 20, 21, 22} extremes [2, infinity)
+ nti 13 constraint DW = {17, 18, 19, 20, 21, 22} extremes [2, infinity)
English:
constraint CS = {17} extremes [2, 2]
@@ -2337,7 +2337,7 @@
write written
constraint CS = {17} extremes [2, 2]
- nti 8 constraint DW = {6, 7, 26, 27, 28, 29, 30, 31} extremes [2, infinity)
+ nti 14 constraint DW = {6, 7, 26, 27, 28, 29, 30, 31} extremes [2, infinity)
English:
constraint CS = {30} extremes [2, 2]
@@ -2353,7 +2353,7 @@
do does
constraint CS = {30} extremes [2, 2]
- nti 9 constraint DW = {18, 19, 20, 21, 22} extremes [3, infinity)
+ nti 15 constraint DW = {18, 19, 20, 21, 22} extremes [3, infinity)
English:
{...}
constraint DS = {18} extremes [3, infinity)
@@ -3595,7 +3595,7 @@
* 0ed
constraint CS = {22} extremes [2, 2]
- nti 10 constraint DW = {9, 10, 11} extremes [2, infinity)
+ nti 16 constraint DW = {9, 10, 11} extremes [2, infinity)
English:
constraint CS = {9} extremes [2, 2]
@@ -4642,7 +4642,7 @@
* 1
constraint CS = {21} extremes [2, 2]
- nti 11 constraint CS = {22} extremes [1, 1]
+ nti 17 constraint CS = {22} extremes [1, 1]
English:
constraint CS = {22} extremes [1, 1]
@@ -4728,45 +4728,45 @@
twelfth
constraint CS = {27} extremes [1, 1]
- internal hits 200/24854 nti r0 constraint CS = {r0} extremes [1, 1]
+ internal hits 198/21968 nti r0 constraint CS = {r0} extremes [1, 1]
internal nti r1 constraint CS = {r1} extremes [1, 1]
- internal hits 36/72 nti 12 constraint (none) extremes [1, 1]
+ internal hits 36/72 nti 18 constraint (none) extremes [1, 1]
- internal hits 0/258 nti 17 constraint (none) extremes [1, infinity)
+ internal hits 0/258 nti 23 constraint (none) extremes [1, infinity)
- hits 36149/72298 nti 13 constraint (none) extremes [1, infinity)
+ hits 34190/68380 nti 19 constraint (none) extremes [1, infinity)
English:
{...}
- (hits 7696/36149) (matched long text) constraint (none) extremes [2, infinity)
+ (hits 7079/34190) (matched long text) constraint (none) extremes [2, infinity)
{...}
- (hits 28453/28453) (matched long text) constraint (none) extremes [1, infinity)
+ (hits 27111/27111) (matched long text) constraint (none) extremes [1, infinity)
- nti 14 constraint (none) extremes [1, infinity)
+ nti 20 constraint (none) extremes [1, infinity)
English:
{...}
constraint (none) extremes [2, infinity)
{...}
constraint (none) extremes [1, infinity)
- hits 81310/162620 nti 15 constraint (none) extremes [1, infinity)
+ hits 76560/153120 nti 21 constraint (none) extremes [1, infinity)
English:
{...}
- (hits 15777/46498) (matched long text) constraint (none) extremes [2, infinity)
+ (hits 15802/46215) (matched long text) constraint (none) extremes [2, infinity)
{...}
- (hits 65533/65533) (matched long text) constraint (none) extremes [1, infinity)
+ (hits 60758/60758) (matched long text) constraint (none) extremes [1, infinity)
- nti 16 constraint (none) extremes [2, infinity)
+ nti 22 constraint (none) extremes [2, infinity)
English:
{...}
constraint (none) extremes [2, infinity)
- internal hits 16200/96518 nti r2 constraint (none) extremes [1, 1]
+ internal hits 16248/95970 nti r2 constraint (none) extremes [1, 1]
- internal hits 21513/254408 nti r2 constraint (none) extremes [1, 1]
+ internal hits 19358/219802 nti r2 constraint (none) extremes [1, 1]
- internal hits 2243/40622 nti r2 constraint (none) extremes [1, 1]
+ internal hits 2043/39656 nti r2 constraint (none) extremes [1, 1]
nti r2 constraint CS = {r2} extremes [6, 6]
English:
@@ -4827,40 +4827,40 @@
other than
constraint CS = {28} extremes [2, 2]
- hits 16/21706 nti 29 constraint DS = {29} extremes [2, infinity)
+ hits 16/21170 nti 29 constraint DS = {29} extremes [2, infinity)
English:
not {...}
- (hits 16/5426) (matched long text) constraint DS = {29} extremes [2, infinity)
+ (hits 16/6280) (matched long text) constraint DS = {29} extremes [2, infinity)
hits 79/158 nti 30 constraint (none) extremes [1, infinity)
English:
of the {...}
- (hits 0/16) constraint DS = {30} extremes [3, infinity)
+ (hits 0/8) constraint DS = {30} extremes [3, infinity)
of {...}
- (hits 0/24) constraint DS = {30} extremes [2, infinity)
+ (hits 0/12) constraint DS = {30} extremes [2, infinity)
{...}
(hits 79/79) (matched: 'dvd carried by the person asked') constraint (none) extremes [1, infinity)
- hits 0/21422 nti 31 constraint DS = {31} extremes [2, infinity)
+ hits 0/20886 nti 31 constraint DS = {31} extremes [2, infinity)
English:
no one {***}
- (hits 0/5390) constraint DS = {31} extremes [2, infinity)
+ (hits 0/5244) constraint DS = {31} extremes [2, infinity)
- internal hits 92/1190 nti 17 constraint (none) extremes [1, 1]
+ internal hits 92/1206 nti 23 constraint (none) extremes [1, 1]
- internal hits 7/56 nti 18 constraint (none) extremes [1, 1]
+ internal hits 7/56 nti 24 constraint (none) extremes [1, 1]
- internal hits 490/20500 nti 19 constraint (none) extremes [1, 1]
+ internal hits 239/18292 nti 25 constraint (none) extremes [1, 1]
- internal nti 20 constraint (none) extremes [1, 1]
+ internal nti 26 constraint (none) extremes [1, 1]
- internal nti 21 constraint (none) extremes [1, 1]
+ internal nti 27 constraint (none) extremes [1, 1]
- internal hits 0/444 nti 22 constraint (none) extremes [1, 1]
+ internal hits 0/444 nti 28 constraint (none) extremes [1, 1]
- internal hits 0/172 nti 23 constraint (none) extremes [1, 1]
+ internal hits 0/176 nti 29 constraint (none) extremes [1, 1]
- internal hits 0/690 nti 24 constraint (none) extremes [1, 1]
+ internal hits 0/690 nti 30 constraint (none) extremes [1, 1]
nti 6 constraint CS = {6} extremes [6, 6]
English:
@@ -4911,51 +4911,51 @@
here here here here here here
constraint CS = {12} extremes [6, 6]
- internal hits 3986/8900 nti 6 constraint FS = {6} extremes [1, infinity)
+ internal hits 4044/8936 nti 6 constraint FS = {6} extremes [1, infinity)
internal hits 16/128 nti 7 constraint FS = {7} extremes [1, infinity)
- internal hits 1/8616 nti 8 constraint FS = {8} extremes [1, infinity)
+ internal hits 1/6966 nti 8 constraint FS = {8} extremes [1, infinity)
- internal hits 0/1480 nti 9 constraint FS = {9} extremes [1, infinity)
+ internal hits 0/1584 nti 9 constraint FS = {9} extremes [1, infinity)
internal nti 10 constraint FS = {10} extremes [1, infinity)
internal nti 11 constraint FS = {11} extremes [1, infinity)
- internal hits 210/5162 nti 25 constraint (none) extremes [1, infinity)
+ internal hits 6/1516 nti 31 constraint (none) extremes [1, infinity)
- internal hits 59/4030 nti 26 constraint (none) extremes [1, infinity)
+ internal hits 1/2334 nti 6 constraint (none) extremes [1, infinity)
- internal hits 1/2 nti 27 constraint (none) extremes [1, infinity)
+ internal nti 7 constraint (none) extremes [1, infinity)
- internal nti 28 constraint (none) extremes [1, infinity)
+ internal nti 8 constraint (none) extremes [1, infinity)
- internal hits 58/118 nti 29 constraint (none) extremes [1, infinity)
+ internal hits 0/2 nti 9 constraint (none) extremes [1, infinity)
internal nti 12 constraint DS = {12} extremes [1, infinity)
- internal hits 635/17878 nti 13 constraint DS = {13} extremes [1, infinity)
+ internal hits 627/16490 nti 13 constraint DS = {13} extremes [1, infinity)
- internal hits 258/8202 nti 14 constraint DS = {14} extremes [1, infinity)
+ internal hits 258/8416 nti 14 constraint DS = {14} extremes [1, infinity)
- hits 67/4430 nti 13 constraint CS = {13} extremes [1, 1]
+ hits 67/4406 nti 13 constraint CS = {13} extremes [1, 1]
English:
always/certainly
- (hits 10/1136) (matched: 'always') constraint CS = {13} extremes [1, 1]
+ (hits 10/1066) (matched: 'always') constraint CS = {13} extremes [1, 1]
usually/normally
- (hits 53/1126) (matched: 'usually') constraint CS = {13} extremes [1, 1]
+ (hits 53/1056) (matched: 'usually') constraint CS = {13} extremes [1, 1]
rarely/seldom
- (hits 0/1073) constraint CS = {13} extremes [1, 1]
+ (hits 0/1003) constraint CS = {13} extremes [1, 1]
never
- (hits 4/1073) (matched: 'never') constraint CS = {13} extremes [1, 1]
+ (hits 4/1003) (matched: 'never') constraint CS = {13} extremes [1, 1]
initially
- (hits 0/1069) constraint CS = {13} extremes [1, 1]
+ (hits 0/999) constraint CS = {13} extremes [1, 1]
- hits 0/4304 nti 14 constraint DS = {14} extremes [1, infinity)
+ hits 0/4226 nti 14 constraint DS = {14} extremes [1, infinity)
English:
{***} once/twice/thrice/turn/turns/time/times
- (hits 0/1589) constraint DS = {14} extremes [1, infinity)
+ (hits 0/1761) constraint DS = {14} extremes [1, infinity)
nti 18 constraint DW = {15, 16, 17, 18} extremes [1, 9]
English:
@@ -4983,7 +4983,7 @@
constraint DW = {15, 16} extremes [1, 6]
- nti 30 constraint DW = {15, 16} extremes [1, 6]
+ nti 10 constraint DW = {15, 16} extremes [1, 6]
English:
constraint DS = {15} extremes [1, 6]
@@ -5010,7 +5010,7 @@
turn/turns
constraint DS = {16} extremes [2, 3]
- nti 31 constraint (none) extremes [1, 2]
+ nti 11 constraint (none) extremes [1, 2]
English:
constraint (none) extremes [2, 2]
@@ -5019,24 +5019,24 @@
constraint CS = {r0} extremes [1, 1]
- hits 3152/6304 nti 6 constraint (none) extremes [1, infinity)
+ hits 3152/6304 nti 12 constraint (none) extremes [1, infinity)
English:
{...}
(hits 3152/3152) (matched long text) constraint (none) extremes [1, infinity)
- hits 60/120 nti 7 constraint (none) extremes [0, infinity)
+ hits 60/120 nti 13 constraint (none) extremes [0, infinity)
English:
^
(hits 0/60) constraint (none) extremes [0, infinity)
(hits 60/60) (matched: 'fixed in place') constraint (none) extremes [1, infinity)
- hits 33/109970 nti 19 constraint CS = {19} extremes [1, 1]
+ hits 33/109544 nti 19 constraint CS = {19} extremes [1, 1]
English:
there
- (hits 33/317) (matched: 'there') constraint CS = {19} extremes [1, 1]
+ (hits 33/271) (matched: 'there') constraint CS = {19} extremes [1, 1]
- hits 2081/4162 nti 8 constraint (none) extremes [1, infinity)
+ hits 2081/4162 nti 14 constraint (none) extremes [1, infinity)
English:
{...}
(hits 99/2081) (matched: '"(considering the first sixteen objects only)[command clarification break]" ( a )') constraint (none) extremes [1, infinity)
@@ -5047,30 +5047,30 @@
(hits 999/999) (matched long text) constraint (none) extremes [1, infinity)
- hits 255/510 nti 9 constraint (none) extremes [0, infinity)
+ hits 255/510 nti 15 constraint (none) extremes [0, infinity)
English:
^
(hits 0/255) constraint (none) extremes [0, infinity)
(hits 255/255) (matched long text) constraint (none) extremes [1, infinity)
- hits 279/558 nti 10 constraint (none) extremes [1, infinity)
+ hits 279/558 nti 16 constraint (none) extremes [1, infinity)
English:
{...}
(hits 99/279) (matched long text) constraint (none) extremes [1, infinity)
- (hits 99/135) (matched long text) constraint DS = {20} extremes [2, infinity)
+ (hits 99/151) (matched long text) constraint DS = {20} extremes [2, infinity)
(hits 81/81) (matched long text) constraint (none) extremes [1, infinity)
- hits 198/1204 nti 20 constraint DS = {20} extremes [2, infinity)
+ hits 198/1288 nti 20 constraint DS = {20} extremes [2, infinity)
English:
, _{and}
- (hits 0/530) constraint DS = {20} extremes [3, infinity)
+ (hits 0/538) constraint DS = {20} extremes [3, infinity)
_{,/and}
- (hits 198/566) (matched long text) constraint DS = {20} extremes [2, infinity)
+ (hits 198/588) (matched long text) constraint DS = {20} extremes [2, infinity)
- hits 103/206 nti 11 constraint (none) extremes [1, infinity)
+ hits 103/206 nti 17 constraint (none) extremes [1, infinity)
English:
{...}
(hits 30/103) (matched: 'unmarked for listing') constraint (none) extremes [1, infinity)
@@ -5086,7 +5086,7 @@
_{,/or}
(hits 60/69) (matched: 'or unmarked for listing') constraint DS = {21} extremes [2, infinity)
- hits 460/920 nti 12 constraint (none) extremes [1, infinity)
+ hits 460/920 nti 18 constraint (none) extremes [1, infinity)
English:
constraint CS = {19} extremes [1, 1]
@@ -5095,66 +5095,66 @@
(hits 460/460) (matched long text) constraint (none) extremes [1, infinity)
- hits 576/1152 nti 13 constraint (none) extremes [1, infinity)
+ hits 576/1152 nti 19 constraint (none) extremes [1, infinity)
English:
(hits 0/576) constraint (none) extremes [1, infinity)
(hits 576/576) (matched long text) constraint (none) extremes [1, infinity)
- hits 0/920 nti 14 constraint (none) extremes [1, infinity)
+ hits 0/920 nti 20 constraint (none) extremes [1, infinity)
English:
- (hits 0/1) constraint CS = {22} extremes [1, 2]
+ constraint CS = {22} extremes [1, 2]
{***}
(hits 0/453) constraint (none) extremes [1, infinity)
- (hits 0/381) constraint DS = {14} extremes [2, infinity)
+ (hits 0/375) constraint DS = {14} extremes [2, infinity)
- hits 0/1962 nti 15 constraint (none) extremes [1, infinity)
+ hits 0/1962 nti 21 constraint (none) extremes [1, infinity)
English:
- (hits 0/3) constraint CS = {22} extremes [1, 2]
+ constraint CS = {22} extremes [1, 2]
(hits 0/981) constraint (none) extremes [1, infinity)
- hits 61/898 nti 29 constraint CS = {29} extremes [1, 1]
+ hits 83/1116 nti 29 constraint CS = {29} extremes [1, 1]
English:
thing/something
- (hits 61/61) (matched: 'thing') constraint CS = {29} extremes [1, 1]
+ (hits 83/85) (matched: 'thing') constraint CS = {29} extremes [1, 1]
- internal hits 388/16686 nti 16 constraint (none) extremes [1, 1]
+ internal hits 475/23344 nti 22 constraint (none) extremes [1, 1]
- hits 0/8 nti 22 constraint CS = {22} extremes [1, 2]
+ nti 22 constraint CS = {22} extremes [1, 2]
English:
worn
- (hits 0/4) constraint CS = {22} extremes [1, 1]
+ constraint CS = {22} extremes [1, 1]
carried
- (hits 0/4) constraint CS = {22} extremes [1, 1]
+ constraint CS = {22} extremes [1, 1]
initially carried
constraint CS = {22} extremes [2, 2]
- hits 0/2724 nti 28 constraint DS = {14} extremes [2, infinity)
+ hits 0/2712 nti 28 constraint DS = {14} extremes [2, infinity)
English:
_,/and {...}
- (hits 0/561) constraint DS = {14, 28} extremes [3, infinity)
+ (hits 0/534) constraint DS = {14, 28} extremes [3, infinity)
_,/and
- (hits 0/674) constraint DS = {14, 28} extremes [2, infinity)
+ (hits 0/610) constraint DS = {14, 28} extremes [2, infinity)
- (hits 0/940) constraint DS = {14} extremes [2, infinity)
+ (hits 0/927) constraint DS = {14} extremes [2, infinity)
hits 1467/2934 nti 27 constraint (none) extremes [1, infinity)
English:
{...}
(hits 174/1467) (matched long text) constraint (none) extremes [1, infinity)
{called}
- (hits 57/725) (matched long text) constraint DS = {27} extremes [1, infinity)
+ (hits 57/566) (matched long text) constraint DS = {27} extremes [1, infinity)
- (hits 0/751) constraint DS = {24} extremes [2, infinity)
+ (hits 0/764) constraint DS = {24} extremes [2, infinity)
- (hits 87/381) (matched long text) constraint DS = {25} extremes [1, infinity)
+ (hits 87/337) (matched long text) constraint DS = {25} extremes [1, infinity)
- (hits 30/266) (matched: 'a kind of supporter that is portable') constraint DS = {26} extremes [1, infinity)
+ (hits 30/221) (matched: 'a kind of supporter that is portable') constraint DS = {26} extremes [1, infinity)
(hits 4/349) (matched: 'it') constraint (none) extremes [1, 1]
@@ -5162,7 +5162,7 @@
(hits 1115/1115) (matched long text) constraint (none) extremes [1, infinity)
- hits 431/862 nti 17 constraint (none) extremes [0, infinity)
+ hits 431/862 nti 23 constraint (none) extremes [0, infinity)
English:
(hits 0/431) constraint (none) extremes [1, infinity)
@@ -5171,18 +5171,18 @@
(hits 431/431) (matched long text) constraint (none) extremes [1, infinity)
- hits 0/10898 nti 24 constraint DS = {24} extremes [2, infinity)
+ hits 0/10968 nti 24 constraint DS = {24} extremes [2, infinity)
English:
it with action {***}
- (hits 0/3893) constraint DS = {24} extremes [3, infinity)
+ (hits 0/3907) constraint DS = {24} extremes [3, infinity)
{with/having} (/) {***}
- (hits 0/4092) constraint DS = {24} extremes [2, infinity)
+ (hits 0/4111) constraint DS = {24} extremes [2, infinity)
{with/having} {...} ( )
- (hits 0/3503) constraint DS = {24} extremes [5, infinity)
+ (hits 0/3508) constraint DS = {24} extremes [5, infinity)
{with/having}
- (hits 0/4092) constraint DS = {24} extremes [2, infinity)
+ (hits 0/4111) constraint DS = {24} extremes [2, infinity)
- nti 18 constraint (none) extremes [1, infinity)
+ nti 24 constraint (none) extremes [1, infinity)
English:
{...}
constraint (none) extremes [1, infinity)
@@ -5198,55 +5198,55 @@
_{,/and}
constraint DS = {23} extremes [2, infinity)
- nti 19 constraint (none) extremes [1, infinity)
+ nti 25 constraint (none) extremes [1, infinity)
English:
{...}
constraint (none) extremes [1, infinity)
- hits 174/2936 nti 25 constraint DS = {25} extremes [1, infinity)
+ hits 174/2742 nti 25 constraint DS = {25} extremes [1, infinity)
English:
, _{and}
- (hits 8/855) (matched: ', and didn't understand addressee's last name error') constraint DS = {25} extremes [2, infinity)
+ (hits 8/818) (matched: ', and didn't understand addressee's last name error') constraint DS = {25} extremes [2, infinity)
_{,/and}
- (hits 166/906) (matched long text) constraint DS = {25} extremes [1, infinity)
+ (hits 166/827) (matched long text) constraint DS = {25} extremes [1, infinity)
- hits 30/532 nti 20 constraint DS = {26} extremes [1, infinity)
+ hits 30/442 nti 26 constraint DS = {26} extremes [1, infinity)
English:
- (hits 30/266) (matched: 'a kind of supporter that is portable') constraint DS = {26} extremes [2, infinity)
+ (hits 30/217) (matched: 'a kind of supporter that is portable') constraint DS = {26} extremes [2, infinity)
- (hits 0/236) constraint DS = {26} extremes [1, infinity)
+ (hits 0/191) constraint DS = {26} extremes [1, infinity)
- hits 30/636 nti 26 constraint DS = {26} extremes [1, infinity)
+ hits 30/470 nti 26 constraint DS = {26} extremes [1, infinity)
English:
kind/kinds
- (hits 4/38) (matched: 'kind') constraint CS = {26} extremes [1, 1]
+ (hits 4/8) (matched: 'kind') constraint CS = {26} extremes [1, 1]
kind/kinds of
- (hits 26/280) (matched: 'kind of supporter that is portable') constraint DS = {26} extremes [2, infinity)
+ (hits 26/227) (matched: 'kind of supporter that is portable') constraint DS = {26} extremes [2, infinity)
- internal nti 21 constraint (none) extremes [1, infinity)
+ internal nti 27 constraint (none) extremes [1, infinity)
- internal hits 1357/2714 nti 22 constraint (none) extremes [1, infinity)
+ internal hits 1357/2714 nti 28 constraint (none) extremes [1, infinity)
- hits 0/2764 nti 23 constraint DS = {13} extremes [2, infinity)
+ hits 0/2764 nti 29 constraint DS = {13} extremes [2, infinity)
English:
{...}
- (hits 0/1029) constraint DS = {13} extremes [2, infinity)
+ (hits 0/1024) constraint DS = {13} extremes [2, infinity)
- hits 67/2764 nti 24 constraint DS = {13} extremes [2, infinity)
+ hits 67/2764 nti 30 constraint DS = {13} extremes [2, infinity)
English:
{...}
- (hits 67/1186) (matched: 'usually table of general chitchat') constraint DS = {13} extremes [2, infinity)
+ (hits 67/1179) (matched: 'usually table of general chitchat') constraint DS = {13} extremes [2, infinity)
- hits 667/25436 nti 30 constraint CS = {30} extremes [1, 1]
+ hits 691/24790 nti 30 constraint CS = {30} extremes [1, 1]
English:
which/who/that
- (hits 667/6132) (matched: 'which') constraint CS = {30} extremes [1, 1]
+ (hits 691/5564) (matched: 'which') constraint CS = {30} extremes [1, 1]
- hits 2/2742 nti 25 constraint DS = {30} extremes [2, infinity)
+ hits 2/2742 nti 31 constraint DS = {30} extremes [2, infinity)
English:
{...}
- (hits 2/803) (matched: 'answering it that') constraint DS = {30} extremes [2, infinity)
+ (hits 2/820) (matched: 'answering it that') constraint DS = {30} extremes [2, infinity)
nti 31 constraint DS = {31} extremes [3, infinity)
English:
@@ -5256,7 +5256,7 @@
hits 196/9062 nti 6 constraint DS = {6} extremes [2, infinity)
English:
of {...}
- (hits 196/2364) (matched: 'of day -- documented at var_time --') constraint DS = {6} extremes [2, infinity)
+ (hits 196/2261) (matched: 'of day -- documented at var_time --') constraint DS = {6} extremes [2, infinity)
hits 5/60 nti 7 constraint CS = {7} extremes [2, 2]
English:
@@ -5271,9 +5271,9 @@
grammatical case
(hits 1/1) (matched: 'grammatical case') constraint CS = {7} extremes [2, 2]
- internal hits 2474/40954 nti 26 constraint (none) extremes [0, 0]
+ internal hits 2474/39362 nti 6 constraint (none) extremes [0, 0]
- internal hits 164/328 nti 27 constraint (none) extremes [1, infinity)
+