1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/supervisor-module/6-st.html
2020-05-05 23:52:20 +01:00

369 lines
58 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Source Text</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/ConsoleText-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="index.html"><span class="selectedlink">supervisor</span></a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Source Text' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>Source Text</b></li></ul></div>
<p class="purpose">Code for reading Inform 7 source text, which Inbuild uses for both extensions and projects.</p>
<ul class="toc"><li><a href="6-st.html#SP10">&#167;10. Sentence division</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b>This short function is a bridge to the lexer, and is used for reading
text files of source into either projects or extensions. Note that it
doesn't attach the fed text to the copy: the copy may need to contain text
from multiple files and indeed from elsewhere.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">currently_lexing_into</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">source_file</span><span class="plain-syntax"> *</span><span class="function-syntax">SourceText::read_file</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">SourceText::read_file</span></span>:<br/>Extension Services - <a href="5-es.html#SP6">&#167;6</a><br/>Project Services - <a href="5-ps2.html#SP27_2">&#167;27.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">documentation_only</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">primary</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">currently_lexing_into</span><span class="plain-syntax"> = </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">general_pointer</span><span class="plain-syntax"> </span><span class="identifier-syntax">ref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">STORE_POINTER_inbuild_copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">handle</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Filenames::fopen</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="string-syntax">"r"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">source_file</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">handle</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">leaf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Filenames::get_leafname</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">primary</span><span class="plain-syntax">) </span><span class="identifier-syntax">leaf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"main source text"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sf</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TextFromFiles::feed_open_file_into_lexer</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">handle</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">leaf</span><span class="plain-syntax">, </span><span class="identifier-syntax">documentation_only</span><span class="plain-syntax">, </span><span class="identifier-syntax">ref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><a href="2-ce.html#SP2" class="function-link"><span class="function-syntax">CopyErrors::new_F</span></a><span class="plain-syntax">(</span><span class="constant-syntax">OPEN_FAILED_CE</span><span class="plain-syntax">, -1, </span><span class="identifier-syntax">F</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fclose</span><span class="plain-syntax">(</span><span class="identifier-syntax">handle</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">documentation_only</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="6-st.html#SP1_1" class="named-paragraph-link"><span class="named-paragraph">Tell console output about the file</span><span class="named-paragraph-number">1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">currently_lexing_into</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">sf</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP1_1"></a><b>&#167;1.1. </b>This is where messages like
</p>
<pre class="ConsoleText-displayed-code all-displayed-code code-font">
<span class="ConsoleText-plain-syntax"> I've also read Standard Rules by Graham Nelson, which is 27204 words long.</span>
</pre>
<p class="commentary">are printed to <span class="extract"><span class="ConsoleText-extract-syntax">stdout</span></span> (not <span class="extract"><span class="ConsoleText-extract-syntax">stderr</span></span>), in something of an affectionate nod
to TeX's traditional console output, though occasionally I think silence is
golden and that these messages could go. It's a moot point for almost all users,
though, because the console output is concealed from them by the Inform
application.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Tell console output about the file</span><span class="named-paragraph-number">1.1</span></span><span class="ConsoleText-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">wc</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">message</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">primary</span><span class="plain-syntax">) </span><span class="identifier-syntax">message</span><span class="plain-syntax"> = </span><span class="string-syntax">"I've now read %S, which is %d words long.\n"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">message</span><span class="plain-syntax"> = </span><span class="string-syntax">"I've also read %S, which is %d words long.\n"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TextFromFiles::total_word_count</span><span class="plain-syntax">(</span><span class="identifier-syntax">sf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDOUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">, </span><span class="identifier-syntax">wc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STREAM_FLUSH</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDOUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">, </span><span class="identifier-syntax">wc</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP1">&#167;1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">LEXER_PROBLEM_HANDLER</span><span class="plain-syntax"> </span><a href="6-st.html#SP2" class="function-link"><span class="function-syntax">SourceText::lexer_problem_handler</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::lexer_problem_handler</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">word</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">err</span><span class="plain-syntax"> == </span><span class="identifier-syntax">MEMORY_OUT_LEXERERROR</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::fatal</span><span class="plain-syntax">(</span><span class="string-syntax">"Out of memory: unable to create lexer workspace"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">currently_lexing_into</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax"> = </span><a href="2-ce.html#SP2" class="function-link"><span class="function-syntax">CopyErrors::new_WT</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LEXER_CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="identifier-syntax">word</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">currently_lexing_into</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">COPY_FILE_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_copy</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SYNTAX_PROBLEM_HANDLER</span><span class="plain-syntax"> </span><a href="6-st.html#SP4" class="function-link"><span class="function-syntax">SourceText::syntax_problem_handler</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::syntax_problem_handler</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ref</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">k</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">ref</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax"> = </span><a href="2-ce.html#SP2" class="function-link"><span class="function-syntax">CopyErrors::new_N</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SYNTAX_CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ce.html#SP3" class="function-link"><span class="function-syntax">CopyErrors::supply_wording</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>Sentences in the source text are of five categories: dividing sentences,
which divide up the source into segments; structural sentences, which split
the source into different forms (standard text, tables, equations, I6 matter,
and so on); nonstructural sentences, which make grammatical definitions and
give Inform other more or less direct instructions; rule declarations; and
regular sentences, those which use the standard verbs. Examples:
</p>
<blockquote>
<p>Volume II [dividing]</p>
</blockquote>
<blockquote>
<p>Include Locksmith by Emily Short [structural]</p>
</blockquote>
<blockquote>
<p>Release along with a website [nonstructural]</p>
</blockquote>
<blockquote>
<p>Instead of looking [rule]</p>
</blockquote>
<blockquote>
<p>The cushion is on the wooden chair [regular]</p>
</blockquote>
<p class="commentary">Dividing sentences are always read, whereas the others may be skipped in
sections of source not being included for one reason or another. Dividing
sentences must match the following. Note that the extension end markers are
only read in extensions, so they can never accidentally match in the main
source text.
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">ExtMultipleBeginsHere_SYNERROR</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">ExtBeginsAfterEndsHere_SYNERROR</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">ExtEndsWithoutBegins_SYNERROR</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">ExtMultipleEndsHere_SYNERROR</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">&lt;</span><span class="identifier-syntax">dividing</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt; ::=</span>
<span class="plain-syntax"> &lt;</span><span class="reserved-syntax">if</span><span class="plain-syntax">-</span><span class="identifier-syntax">start</span><span class="plain-syntax">-</span><span class="identifier-syntax">of</span><span class="plain-syntax">-</span><span class="identifier-syntax">paragraph</span><span class="plain-syntax">&gt; &lt;</span><span class="reserved-syntax">heading</span><span class="plain-syntax">&gt; | ==&gt; </span><span class="identifier-syntax">R</span><span class="plain-syntax">[2]</span>
<span class="plain-syntax"> &lt;</span><span class="identifier-syntax">extension</span><span class="plain-syntax">-</span><span class="identifier-syntax">end</span><span class="plain-syntax">-</span><span class="identifier-syntax">marker</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt; ==&gt; </span><span class="identifier-syntax">R</span><span class="plain-syntax">[1]</span>
<span class="plain-syntax">&lt;</span><span class="reserved-syntax">heading</span><span class="plain-syntax">&gt; ::=</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">volume</span><span class="plain-syntax"> ... | ==&gt; </span><span class="constant-syntax">1</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">book</span><span class="plain-syntax"> ... | ==&gt; </span><span class="constant-syntax">2</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">part</span><span class="plain-syntax"> ... | ==&gt; </span><span class="constant-syntax">3</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">chapter</span><span class="plain-syntax"> ... | ==&gt; </span><span class="constant-syntax">4</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">section</span><span class="plain-syntax"> ... ==&gt; </span><span class="constant-syntax">5</span>
<span class="plain-syntax">&lt;</span><span class="identifier-syntax">extension</span><span class="plain-syntax">-</span><span class="identifier-syntax">end</span><span class="plain-syntax">-</span><span class="identifier-syntax">marker</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt; ::=</span>
<span class="plain-syntax"> ... </span><span class="identifier-syntax">begin</span><span class="plain-syntax">/</span><span class="identifier-syntax">begins</span><span class="plain-syntax"> </span><span class="identifier-syntax">here</span><span class="plain-syntax"> | ==&gt; -1; </span><span class="named-paragraph-container code-font"><a href="6-st.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Check we can begin an extension here</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ... </span><span class="identifier-syntax">end</span><span class="plain-syntax">/</span><span class="identifier-syntax">ends</span><span class="plain-syntax"> </span><span class="identifier-syntax">here</span><span class="plain-syntax"> ==&gt; -2; </span><span class="named-paragraph-container code-font"><a href="6-st.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Check we can end an extension here</span><span class="named-paragraph-number">5.2</span></a></span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5_1"></a><b>&#167;5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check we can begin an extension here</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm_extension_position</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="identifier-syntax">sfsm_extension_position</span><span class="plain-syntax">++; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="constant-syntax">SYNTAX_PROBLEM_HANDLER</span><span class="plain-syntax">(</span><span class="constant-syntax">ExtMultipleBeginsHere_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm_copy</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax">: </span><span class="constant-syntax">SYNTAX_PROBLEM_HANDLER</span><span class="plain-syntax">(</span><span class="constant-syntax">ExtBeginsAfterEndsHere_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm_copy</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5_2"></a><b>&#167;5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check we can end an extension here</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm_extension_position</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="constant-syntax">SYNTAX_PROBLEM_HANDLER</span><span class="plain-syntax">(</span><span class="constant-syntax">ExtEndsWithoutBegins_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm_copy</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="identifier-syntax">sfsm_extension_position</span><span class="plain-syntax">++; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax">: </span><span class="constant-syntax">SYNTAX_PROBLEM_HANDLER</span><span class="plain-syntax">(</span><span class="constant-syntax">ExtMultipleEndsHere_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm_copy</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP_1"></a><b>&#167;.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Detect a dividing sentence</span><span class="named-paragraph-number">.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (&lt;</span><span class="identifier-syntax">dividing</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt;(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (&lt;&lt;</span><span class="identifier-syntax">r</span><span class="plain-syntax">&gt;&gt;) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> -1: </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm_extension_position</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> -2:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm_extension_position</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">heading_level</span><span class="plain-syntax"> = &lt;&lt;</span><span class="identifier-syntax">r</span><span class="plain-syntax">&gt;&gt;;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is never used.</li></ul>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>Structural sentences are defined as follows. (The asterisk notation isn't
known to most Inform users: it increases output to the debugging log.)
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> For the initial title sentence</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">ROUTINE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Instead of taking something, ..."</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Include (- ... -)</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">TABLE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Table 1 - Counties of England"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">EQUATION_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Equation 2 - Newton's Second Law"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRACE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> A sentence consisting of an asterisk and optional quoted text</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">INVOCATION_LIST_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> Single invocation of a (possibly compound) phrase</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">list_node_type</span><span class="plain-syntax"> </span><span class="constant-syntax">ROUTINE_NT</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">list_entry_node_type</span><span class="plain-syntax"> </span><span class="constant-syntax">INVOCATION_LIST_NT</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::node_metadata</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"BIBLIOGRAPHIC_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">ROUTINE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"ROUTINE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INFORM6CODE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">TABLE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TABLE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">TABBED_CONTENT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">EQUATION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"EQUATION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">TRACE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TRACE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">INVOCATION_LIST_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INVOCATION_LIST_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">&lt;</span><span class="identifier-syntax">structural</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt; ::=</span>
<span class="plain-syntax"> &lt;</span><span class="reserved-syntax">if</span><span class="plain-syntax">-</span><span class="identifier-syntax">start</span><span class="plain-syntax">-</span><span class="identifier-syntax">of</span><span class="plain-syntax">-</span><span class="identifier-syntax">source</span><span class="plain-syntax">-</span><span class="identifier-syntax">text</span><span class="plain-syntax">&gt; &lt;</span><span class="identifier-syntax">quoted</span><span class="plain-syntax">-</span><span class="identifier-syntax">text</span><span class="plain-syntax">&gt; | ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> &lt;</span><span class="reserved-syntax">if</span><span class="plain-syntax">-</span><span class="identifier-syntax">start</span><span class="plain-syntax">-</span><span class="identifier-syntax">of</span><span class="plain-syntax">-</span><span class="identifier-syntax">source</span><span class="plain-syntax">-</span><span class="identifier-syntax">text</span><span class="plain-syntax">&gt; &lt;</span><span class="identifier-syntax">quoted</span><span class="plain-syntax">-</span><span class="identifier-syntax">text</span><span class="plain-syntax">&gt; ... | ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> &lt;</span><span class="identifier-syntax">language</span><span class="plain-syntax">-</span><span class="identifier-syntax">modifying</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt; | ==&gt; </span><span class="identifier-syntax">R</span><span class="plain-syntax">[1]</span>
<span class="plain-syntax"> * | ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRACE_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> * &lt;</span><span class="identifier-syntax">quoted</span><span class="plain-syntax">-</span><span class="identifier-syntax">text</span><span class="plain-syntax">-</span><span class="identifier-syntax">without</span><span class="plain-syntax">-</span><span class="identifier-syntax">subs</span><span class="plain-syntax">&gt; | ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRACE_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> &lt;</span><span class="reserved-syntax">if</span><span class="plain-syntax">-</span><span class="identifier-syntax">start</span><span class="plain-syntax">-</span><span class="identifier-syntax">of</span><span class="plain-syntax">-</span><span class="identifier-syntax">paragraph</span><span class="plain-syntax">&gt; </span><span class="identifier-syntax">table</span><span class="plain-syntax"> ... | ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">TABLE_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> &lt;</span><span class="reserved-syntax">if</span><span class="plain-syntax">-</span><span class="identifier-syntax">start</span><span class="plain-syntax">-</span><span class="identifier-syntax">of</span><span class="plain-syntax">-</span><span class="identifier-syntax">paragraph</span><span class="plain-syntax">&gt; </span><span class="identifier-syntax">equation</span><span class="plain-syntax"> ... | ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">EQUATION_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> ... </span><span class="identifier-syntax">by</span><span class="plain-syntax"> ... | ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">INCLUDE_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">include</span><span class="plain-syntax"> ... </span><span class="identifier-syntax">by</span><span class="plain-syntax"> ... | ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">INCLUDE_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">include</span><span class="plain-syntax"> (- ... ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b>Properly speaking, despite the definition above, language modifying sentences
are nonstructural. So what are they doing here? The answer is that we need to
read them early on, because they affect the way that they parse all other
sentences. Whereas other nonstructural sentences can wait, these can't.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">&lt;</span><span class="identifier-syntax">language</span><span class="plain-syntax">-</span><span class="identifier-syntax">modifying</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt; ::=</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">include</span><span class="plain-syntax"> (- ### </span><span class="identifier-syntax">in</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">preform</span><span class="plain-syntax"> </span><span class="identifier-syntax">grammar</span><span class="plain-syntax"> | ==&gt; -2; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">use</span><span class="plain-syntax"> ... </span><span class="identifier-syntax">language</span><span class="plain-syntax"> </span><span class="identifier-syntax">element</span><span class="plain-syntax">/</span><span class="identifier-syntax">elements</span><span class="plain-syntax"> ==&gt; -1</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. Sentence division. </b>Sentence division can happen either early in Inform's run, when the vast bulk
of the source text is read, or at intermittent periods later when fresh text
is generated internally. New sentences need to be parsed as they arise, not
saved up to be parsed later, so we will use the following:
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SENTENCE_ANNOTATION_FUNCTION</span><span class="plain-syntax"> </span><a href="6-st.html#SP10" class="function-link"><span class="function-syntax">SourceText::annotate_new_sentence</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_loaded_from_source</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::declare_source_loaded</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_loaded_from_source</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::annotate_new_sentence</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">text_loaded_from_source</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::annotate_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">sentence_unparsed_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sentences::VPs::seek</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NEW_BEGINEND_HANDLER</span><span class="plain-syntax"> </span><a href="6-st.html#SP11" class="function-link"><span class="function-syntax">SourceText::new_beginend</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::new_beginend</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><a href="4-em.html#SP4" class="function-link"><span class="function-syntax">ExtensionManager::from_copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ParseTree::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">) == </span><span class="identifier-syntax">BEGINHERE_NT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="6-inc.html#SP10" class="function-link"><span class="function-syntax">Inclusions::check_begins_here</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ParseTree::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">) == </span><span class="identifier-syntax">ENDHERE_NT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="6-inc.html#SP11" class="function-link"><span class="function-syntax">Inclusions::check_ends_here</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NEW_LANGUAGE_HANDLER</span><span class="plain-syntax"> </span><a href="6-st.html#SP12" class="function-link"><span class="function-syntax">SourceText::new_language</span></a>
<span class="definition-keyword">enum</span> <span class="constant-syntax">UseElementWithdrawn_SYNERROR</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::new_language</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax"> = </span><a href="2-ce.html#SP2" class="function-link"><span class="function-syntax">CopyErrors::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SYNTAX_CE</span><span class="plain-syntax">, </span><span class="constant-syntax">UseElementWithdrawn_SYNERROR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ce.html#SP3" class="function-link"><span class="function-syntax">CopyErrors::supply_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sfsm_copy</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-ts.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-sm.html">1</a></li><li class="progresschapter"><a href="2-gnr.html">2</a></li><li class="progresschapter"><a href="3-bg.html">3</a></li><li class="progresschapter"><a href="4-em.html">4</a></li><li class="progresschapter"><a href="5-es.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresscurrent">st</li><li class="progresssection"><a href="6-hdn.html">hdn</a></li><li class="progresssection"><a href="6-tbs.html">tbs</a></li><li class="progresssection"><a href="6-tof.html">tof</a></li><li class="progresssection"><a href="6-inc.html">inc</a></li><li class="progresssection"><a href="6-cs.html">cs</a></li><li class="progresssection"><a href="6-vmg.html">vmg</a></li><li class="progresschapter"><a href="7-ed.html">7</a></li><li class="progressnext"><a href="6-hdn.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>