1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-04-29 15:49:36 +03:00

Further work on language bundle reforms

This commit is contained in:
Graham Nelson 2023-02-05 13:45:38 +00:00
parent b3b5d52426
commit cfc27e3071
37 changed files with 241 additions and 303 deletions

View file

@ -1,6 +1,6 @@
# Inform 7 # Inform 7
[Version](notes/versioning.md): 10.2.0-beta+6W21 'Krypton' (4 February 2023) [Version](notes/versioning.md): 10.2.0-beta+6W22 'Krypton' (5 February 2023)
## About Inform ## About Inform

View file

@ -1,3 +1,3 @@
Prerelease: beta Prerelease: beta
Build Date: 4 February 2023 Build Date: 5 February 2023
Build Number: 6W21 Build Number: 6W22

View file

@ -93,7 +93,7 @@ to be part of a released version.
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::declare_aspect</span><span class="plain-syntax">(</span><span class="constant-syntax">INFORM_INTER_DA</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"inform inter"</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">Log::declare_aspect</span><span class="plain-syntax">(</span><span class="constant-syntax">INFORM_INTER_DA</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"inform inter"</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">Writers::register_writer_I</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">, &amp;</span><a href="1-cm.html#SP3" class="function-link"><span class="function-syntax">CoreModule::writer</span></a><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_writer_I</span><span class="plain-syntax">(</span><span class="character-syntax">'B'</span><span class="plain-syntax">, &amp;</span><a href="1-cm.html#SP3" class="function-link"><span class="function-syntax">CoreModule::writer</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-cp2.html#SP3" class="function-link"><span class="function-syntax">CorePreform::set_core_internal_NTIs</span></a><span class="plain-syntax">();</span> <span class="plain-syntax"> </span><a href="1-cp2.html#SP4" class="function-link"><span class="function-syntax">CorePreform::set_core_internal_NTIs</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="1-inaa.html#SP8" class="function-link"><span class="function-syntax">CoreSyntax::declare_annotations</span></a><span class="plain-syntax">();</span> <span class="plain-syntax"> </span><a href="1-inaa.html#SP8" class="function-link"><span class="function-syntax">CoreSyntax::declare_annotations</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="1-itc.html#SP8" class="function-link"><span class="function-syntax">InternalTests::begin</span></a><span class="plain-syntax">();</span> <span class="plain-syntax"> </span><a href="1-itc.html#SP8" class="function-link"><span class="function-syntax">InternalTests::begin</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span> <span class="plain-syntax">}</span>

View file

@ -59,7 +59,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../inform7n.html">Inform7</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Control</a></li><li><b>Core Preform</b></li></ul></div> <ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../inform7n.html">Inform7</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Control</a></li><li><b>Core Preform</b></li></ul></div>
<p class="purpose">To load, optimise and throw problem messages related to Preform syntax.</p> <p class="purpose">To load, optimise and throw problem messages related to Preform syntax.</p>
<ul class="toc"><li><a href="1-cp2.html#SP1">&#167;1. Reading Preform declarations from Syntax files</a></li><li><a href="1-cp2.html#SP2">&#167;2. Converting Preform errors to problems</a></li><li><a href="1-cp2.html#SP3">&#167;3. Optimisation</a></li></ul><hr class="tocbar"> <ul class="toc"><li><a href="1-cp2.html#SP1">&#167;1. Reading Preform declarations from Syntax files</a></li><li><a href="1-cp2.html#SP2">&#167;2. Converting Preform errors to problems</a></li><li><a href="1-cp2.html#SP4">&#167;4. Optimisation</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Reading Preform declarations from Syntax files. </b>At present we do this only when <span class="extract"><span class="extract-syntax">L</span></span> is English, but the infrastructure is general. <p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Reading Preform declarations from Syntax files. </b>At present we do this only when <span class="extract"><span class="extract-syntax">L</span></span> is English, but the infrastructure is general.
</p> </p>
@ -87,10 +87,7 @@ Providing the following allows us to give the Inform user a fuller message:
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"The production at fault is:\n"</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"The production at fault is:\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Instrumentation::log_production</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">); </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n"</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">Instrumentation::log_production</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">); </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</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">nt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span> <span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_nonterminal</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(1, </span><span class="string-syntax">"(no nonterminal)"</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">Problems::quote_wide_text</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nonterminal_id</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">Problems::quote_text</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">Untestable</span><span class="plain-syntax">));</span> <span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">Untestable</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">WordAssemblages::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</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">WordAssemblages::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">)) {</span>
@ -122,7 +119,38 @@ Providing the following allows us to give the Inform user a fuller message:
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">)</span> <span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span> <span class="plain-syntax">}</span>
</pre> </pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Optimisation. </b>The following is fine-tuning for speed: if it weren't here, the compiler would <p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>And similarly for inflections.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PREFORM_ERROR_INFLECTIONS_CALLBACK</span><span class="plain-syntax"> </span><a href="1-cp2.html#SP3" class="function-link"><span class="function-syntax">CorePreform::inflections_problem</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">CorePreform::inflections_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">inform_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</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">err</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">nl</span><span class="plain-syntax">) </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">instance_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">err</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_nonterminal</span><span class="plain-syntax">(3, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">Untestable</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"An error occurred with the Preform syntax used to specify the grammar "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"of source text. If this occurs with English, that's a bug in the compiler, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and should be reported. But if it occurs with languages other than English, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"there's an issue with the language definition, which should be reported "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"to its maintainer. At any rate, this compilation can't go further. "</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">nt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"%PThe nonterminal causing problems is %3. "</span><span class="plain-syntax">);</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">nl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"%PThe natural language affected is '%1'. "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"%PThe problem as reported by Preform is: %2."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Optimisation. </b>The following is fine-tuning for speed: if it weren't here, the compiler would
still function, but would be slower. With that said, it's possible to break still function, but would be slower. With that said, it's possible to break
things by making the wrong settings here, so be wary of making changes. things by making the wrong settings here, so be wary of making changes.
</p> </p>
@ -139,24 +167,24 @@ to be marked with NT incidence bits. (See <a href="../words-module/4-ni.html" cl
<span class="plain-syntax"> </span><span class="identifier-syntax">NTI::give_nt_reserved_incidence_bit</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;s-object-instance&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">PROPER_NOUN_RES_NT_BIT</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">NTI::give_nt_reserved_incidence_bit</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;s-object-instance&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">PROPER_NOUN_RES_NT_BIT</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span> <span class="plain-syntax">}</span>
</pre> </pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Later on, the <a href="../words-module/index.html" class="internal">words</a> module calls the following function to mark that a <p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Later on, the <a href="../words-module/index.html" class="internal">words</a> module calls the following function to mark that a
match to the given nonterminal must contain only words with certain NTI bits: match to the given nonterminal must contain only words with certain NTI bits:
for example, a match to &lt;k-kind&gt; has to contain words with either the &lt;article&gt; for example, a match to &lt;k-kind&gt; has to contain words with either the &lt;article&gt;
bit or the &lt;k-kind&gt; bit set, which as we see above is <span class="extract"><span class="extract-syntax">COMMON_NOUN_RES_NT_BIT</span></span>. bit or the &lt;k-kind&gt; bit set, which as we see above is <span class="extract"><span class="extract-syntax">COMMON_NOUN_RES_NT_BIT</span></span>.
</p> </p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MORE_PREFORM_OPTIMISER_WORDS_CALLBACK</span><span class="plain-syntax"> </span><a href="1-cp2.html#SP4" class="function-link"><span class="function-syntax">CorePreform::set_core_internal_requirements</span></a> <pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MORE_PREFORM_OPTIMISER_WORDS_CALLBACK</span><span class="plain-syntax"> </span><a href="1-cp2.html#SP5" class="function-link"><span class="function-syntax">CorePreform::set_core_internal_requirements</span></a>
</pre> </pre>
<pre class="displayed-code all-displayed-code code-font"> <pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CorePreform::set_core_internal_requirements</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span> <span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CorePreform::set_core_internal_requirements</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">NTI::every_word_in_match_must_have_my_NTI_bit</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;s-adjective&gt;</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">NTI::every_word_in_match_must_have_my_NTI_bit</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;s-adjective&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-cp2.html#SP4" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;s-object-instance&gt;</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="1-cp2.html#SP5" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;s-object-instance&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-cp2.html#SP4" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-kind-variable&gt;</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="1-cp2.html#SP5" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-kind-variable&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-cp2.html#SP4" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-formal-variable&gt;</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="1-cp2.html#SP5" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-formal-variable&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-cp2.html#SP4" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-base-kind&gt;</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="1-cp2.html#SP5" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-base-kind&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-cp2.html#SP4" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-kind-construction&gt;</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="1-cp2.html#SP5" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-kind-construction&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-cp2.html#SP4" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-kind&gt;</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="1-cp2.html#SP5" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-kind&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="1-cp2.html#SP4" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-kind-of-kind&gt;</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="1-cp2.html#SP5" class="function-link"><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;k-kind-of-kind&gt;</span><span class="plain-syntax">);</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">CorePreform::mark_nt_as_requiring_itself_articled</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) {</span> <span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CorePreform::mark_nt_as_requiring_itself_articled</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) {</span>

View file

@ -246,7 +246,7 @@ rough stages. Twenty is plenty.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">inform7_task</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">project</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_copy</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">edition</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">inform7_task</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">project</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_copy</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">edition</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span> <span class="plain-syntax">}</span>
<span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="function-syntax">Task::syntax_tree</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Task::syntax_tree</span></span>:<br/><a href="1-wtc.html#SP14">&#167;14</a><br/>Core Preform - <a href="1-cp2.html#SP2">&#167;2</a><br/>Using Problems - <a href="2-up.html#SP3">&#167;3</a>, <a href="2-up.html#SP3_3">&#167;3.3</a><br/>Supplementary Issues - <a href="2-si.html#SP1">&#167;1</a>, <a href="2-si.html#SP2">&#167;2</a>, <a href="2-si.html#SP3">&#167;3</a>, <a href="2-si.html#SP4">&#167;4</a>, <a href="2-si.html#SP5">&#167;5</a>, <a href="2-si.html#SP6">&#167;6</a>, <a href="2-si.html#SP7">&#167;7</a>, <a href="2-si.html#SP8">&#167;8</a>, <a href="2-si.html#SP9">&#167;9</a>, <a href="2-si.html#SP10">&#167;10</a>, <a href="2-si.html#SP11">&#167;11</a>, <a href="2-si.html#SP12">&#167;12</a>, <a href="2-si.html#SP13">&#167;13</a><br/>Problems With Source Text - <a href="2-pwst.html#SP1">&#167;1</a><br/>Calculus Problems - <a href="2-cp.html#SP1">&#167;1</a><br/>Kinds Problems - <a href="2-kp.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span> <span class="identifier-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="function-syntax">Task::syntax_tree</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Task::syntax_tree</span></span>:<br/><a href="1-wtc.html#SP14">&#167;14</a><br/>Core Preform - <a href="1-cp2.html#SP2">&#167;2</a>, <a href="1-cp2.html#SP3">&#167;3</a><br/>Using Problems - <a href="2-up.html#SP3">&#167;3</a>, <a href="2-up.html#SP3_3">&#167;3.3</a><br/>Supplementary Issues - <a href="2-si.html#SP1">&#167;1</a>, <a href="2-si.html#SP2">&#167;2</a>, <a href="2-si.html#SP3">&#167;3</a>, <a href="2-si.html#SP4">&#167;4</a>, <a href="2-si.html#SP5">&#167;5</a>, <a href="2-si.html#SP6">&#167;6</a>, <a href="2-si.html#SP7">&#167;7</a>, <a href="2-si.html#SP8">&#167;8</a>, <a href="2-si.html#SP9">&#167;9</a>, <a href="2-si.html#SP10">&#167;10</a>, <a href="2-si.html#SP11">&#167;11</a>, <a href="2-si.html#SP12">&#167;12</a>, <a href="2-si.html#SP13">&#167;13</a><br/>Problems With Source Text - <a href="2-pwst.html#SP1">&#167;1</a><br/>Calculus Problems - <a href="2-cp.html#SP1">&#167;1</a><br/>Kinds Problems - <a href="2-kp.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">latest_syntax_tree</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">latest_syntax_tree</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span> <span class="plain-syntax">}</span>

View file

@ -385,42 +385,6 @@ a message which diagnoses the problem rather better.
<span class="plain-syntax"> </span><span class="string-syntax">"in the Penalty Zone, say \"An alarm sounds.\")"</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="string-syntax">"in the Penalty Zone, say \"An alarm sounds.\")"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span> <span class="plain-syntax">}</span>
</pre> </pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PREFORM_ERROR_INFLECTIONS_CALLBACK</span><span class="plain-syntax"> </span><a href="2-up.html#SP7" class="function-link"><span class="function-syntax">UsingProblems::inflections_problem</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">UsingProblems::inflections_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">inform_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</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">nl</span><span class="plain-syntax">) </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">instance_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">err</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">NT</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::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">nt</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">NT</span><span class="plain-syntax">, </span><span class="string-syntax">"%V"</span><span class="plain-syntax">, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nonterminal_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">NT</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">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">) == </span><span class="character-syntax">'&lt;'</span><span class="plain-syntax">) </span><span class="identifier-syntax">Str::put</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="character-syntax">'\''</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">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">) == </span><span class="character-syntax">'&gt;'</span><span class="plain-syntax">) </span><span class="identifier-syntax">Str::put</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="character-syntax">'\''</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(3, </span><span class="identifier-syntax">NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="string-syntax">"preform-problem"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"An error occurred with the Preform syntax used to specify the grammar "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"of source text. If this occurs with English, that's a bug in the compiler, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and should be reported. But if it occurs with languages other than English, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"there's an issue with the language definition, which should be reported "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"to its maintainer. At any rate, this compilation can't go further. "</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">nt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"%PThe nonterminal causing problems is %3. "</span><span class="plain-syntax">);</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">nl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"%PThe natural language affected is '%1'. "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"%PThe problem as reported by Preform is: %2."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer"> <nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="1-gtg.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-cm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">up</li><li class="progresssection"><a href="2-sq.html">sq</a></li><li class="progresssection"><a href="2-si.html">si</a></li><li class="progresssection"><a href="2-pwst.html">pwst</a></li><li class="progresssection"><a href="2-cp.html">cp</a></li><li class="progresssection"><a href="2-kp.html">kp</a></li><li class="progresschapter"><a href="3-pc.html">3</a></li><li class="progressnext"><a href="2-sq.html">&#10095;</a></li></ul></div> <ul class="progressbar"><li class="progressprev"><a href="1-gtg.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-cm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">up</li><li class="progresssection"><a href="2-sq.html">sq</a></li><li class="progresssection"><a href="2-si.html">si</a></li><li class="progresssection"><a href="2-pwst.html">pwst</a></li><li class="progresssection"><a href="2-cp.html">cp</a></li><li class="progresssection"><a href="2-kp.html">kp</a></li><li class="progresschapter"><a href="3-pc.html">3</a></li><li class="progressnext"><a href="2-sq.html">&#10095;</a></li></ul></div>
</nav><!--End of weave--> </nav><!--End of weave-->

View file

@ -311,11 +311,11 @@ we will say that so does any inflected form of it:
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</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">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) ||</span> <span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span> <span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"noun declension nonterminal malformed"</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="3-dcl.html#SP11" class="function-link"><span class="function-syntax">Declensions::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"noun declension nonterminal malformed"</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">group</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</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">group</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-dcl.html#SP9" class="function-link"><span class="function-syntax">Declensions::decline_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-dcl.html#SP9" class="function-link"><span class="function-syntax">Declensions::decline_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span> <span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"noun declension nonterminal has too few groups"</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="3-dcl.html#SP11" class="function-link"><span class="function-syntax">Declensions::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"noun declension nonterminal has too few groups"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</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">D</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">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span> <span class="plain-syntax">}</span>
@ -326,13 +326,14 @@ we will say that so does any inflected form of it:
<pre class="displayed-code all-displayed-code code-font"> <pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">group</span><span class="plain-syntax"> = </span><span class="identifier-syntax">result</span><span class="plain-syntax">[0] - </span><span class="character-syntax">'0'</span><span class="plain-syntax">;</span> <span class="plain-syntax"> </span><span class="identifier-syntax">group</span><span class="plain-syntax"> = </span><span class="identifier-syntax">result</span><span class="plain-syntax">[0] - </span><span class="character-syntax">'0'</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">group</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">group</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">9</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">group</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">group</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">9</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"noun declension grouper result not a group number"</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="3-dcl.html#SP11" class="function-link"><span class="function-syntax">Declensions::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"noun declension grouper result not a group number"</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">result</span><span class="plain-syntax">[1]) {</span> <span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">result</span><span class="plain-syntax">[1]) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">u</span><span class="plain-syntax"> = </span><span class="identifier-syntax">result</span><span class="plain-syntax">[1] - </span><span class="character-syntax">'0'</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">u</span><span class="plain-syntax"> = </span><span class="identifier-syntax">result</span><span class="plain-syntax">[1] - </span><span class="character-syntax">'0'</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">u</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">u</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">9</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">u</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">u</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">9</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"noun declension grouper result not a group number"</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="3-dcl.html#SP11" class="function-link"><span class="function-syntax">Declensions::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"noun declension grouper result not a group number"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">group</span><span class="plain-syntax"> = </span><span class="identifier-syntax">group</span><span class="plain-syntax">*10 + </span><span class="identifier-syntax">u</span><span class="plain-syntax">;</span> <span class="plain-syntax"> </span><span class="identifier-syntax">group</span><span class="plain-syntax"> = </span><span class="identifier-syntax">group</span><span class="plain-syntax">*10 + </span><span class="identifier-syntax">u</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">result</span><span class="plain-syntax">[2]) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"noun declension grouper result too high"</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">result</span><span class="plain-syntax">[2])</span>
<span class="plain-syntax"> </span><a href="3-dcl.html#SP11" class="function-link"><span class="function-syntax">Declensions::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"noun declension grouper result too high"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span> <span class="plain-syntax"> }</span>
</pre> </pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-dcl.html#SP8">&#167;8</a>.</li></ul> <ul class="endnotetexts"><li>This code is used in <a href="3-dcl.html#SP8">&#167;8</a>.</li></ul>
@ -353,7 +354,7 @@ consists of a single word giving the rewriting instruction to use.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</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">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) ||</span> <span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span> <span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;noun-declension&gt; too complex"</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="3-dcl.html#SP11" class="function-link"><span class="function-syntax">Declensions::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"declension too complex"</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">c</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">nc</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">num</span><span class="plain-syntax"> == </span><span class="constant-syntax">SINGULAR_NUMBER</span><span class="plain-syntax">)) || ((</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">nc</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">num</span><span class="plain-syntax"> == </span><span class="constant-syntax">PLURAL_NUMBER</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">c</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">nc</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">num</span><span class="plain-syntax"> == </span><span class="constant-syntax">SINGULAR_NUMBER</span><span class="plain-syntax">)) || ((</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">nc</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">num</span><span class="plain-syntax"> == </span><span class="constant-syntax">PLURAL_NUMBER</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">stem</span><span class="plain-syntax">)</span> <span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">stem</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">result</span><span class="plain-syntax">)</span> <span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">result</span><span class="plain-syntax">)</span>
@ -367,12 +368,12 @@ consists of a single word giving the rewriting instruction to use.
<span class="plain-syntax"> }</span> <span class="plain-syntax"> }</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">c</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</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">c</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">2</span><span class="plain-syntax">*</span><span class="identifier-syntax">nc</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"too few cases in declension"</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">c</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">2</span><span class="plain-syntax">*</span><span class="identifier-syntax">nc</span><span class="plain-syntax">) </span><a href="3-dcl.html#SP11" class="function-link"><span class="function-syntax">Declensions::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"too few cases in declension"</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">c</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">2</span><span class="plain-syntax">*</span><span class="identifier-syntax">nc</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"too many cases in declension"</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">c</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">2</span><span class="plain-syntax">*</span><span class="identifier-syntax">nc</span><span class="plain-syntax">) </span><a href="3-dcl.html#SP11" class="function-link"><span class="function-syntax">Declensions::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"too many cases in declension"</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">D</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">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span> <span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span> <span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"declination unavailable"</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="3-dcl.html#SP11" class="function-link"><span class="function-syntax">Declensions::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"declension unavailable"</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">D</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">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span> <span class="plain-syntax">}</span>
</pre> </pre>
@ -391,7 +392,7 @@ consists of a single word giving the rewriting instruction to use.
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b></p> <p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b></p>
<pre class="displayed-code all-displayed-code code-font"> <pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::error</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Declensions::error</span></span>:<br/><a href="3-dcl.html#SP2">&#167;2</a>, <a href="3-dcl.html#SP3">&#167;3</a>, <a href="3-dcl.html#SP6">&#167;6</a>, <a href="3-dcl.html#SP6_1">&#167;6.1</a>, <a href="3-dcl.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</span><span class="plain-syntax">) {</span> <span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::error</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Declensions::error</span></span>:<br/><a href="3-dcl.html#SP2">&#167;2</a>, <a href="3-dcl.html#SP3">&#167;3</a>, <a href="3-dcl.html#SP6">&#167;6</a>, <a href="3-dcl.html#SP6_1">&#167;6.1</a>, <a href="3-dcl.html#SP7">&#167;7</a>, <a href="3-dcl.html#SP8">&#167;8</a>, <a href="3-dcl.html#SP8_1">&#167;8.1</a>, <a href="3-dcl.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</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">PREFORM_ERROR_INFLECTIONS_CALLBACK</span> <span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">PREFORM_ERROR_INFLECTIONS_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PREFORM_ERROR_INFLECTIONS_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">PREFORM_ERROR_INFLECTIONS_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span> <span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>

View file

@ -289,6 +289,21 @@ in the parse tree, or with a literal word range.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Problems::expand_wide_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span> <span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Problems::expand_wide_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%w"</span><span class="plain-syntax">, (</span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%w"</span><span class="plain-syntax">, (</span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</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">Problems::quote_nonterminal</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pl2.html#SP5" class="function-link"><span class="function-syntax">Problems::problem_quote</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><a href="2-pl2.html#SP6" class="function-link"><span class="function-syntax">Problems::expand_nonterminal</span></a><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">Problems::expand_nonterminal</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">p</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">nt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"(no nonterminal)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">name</span><span class="plain-syntax">, </span><span class="string-syntax">"%w"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nonterminal_id</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">LOOP_THROUGH_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</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">c</span><span class="plain-syntax"> == </span><span class="character-syntax">'&lt;'</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="character-syntax">'&gt;'</span><span class="plain-syntax">)) </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="character-syntax">'\''</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</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">Problems::quote_stream</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Problems::quote_stream</span></span>:<br/>Problems, Level 3 - <a href="2-pl3.html#SP5">&#167;5</a>, <a href="2-pl3.html#SP12">&#167;12</a>, <a href="2-pl3.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span> <span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Problems::quote_stream</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Problems::quote_stream</span></span>:<br/>Problems, Level 3 - <a href="2-pl3.html#SP5">&#167;5</a>, <a href="2-pl3.html#SP12">&#167;12</a>, <a href="2-pl3.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pl2.html#SP5" class="function-link"><span class="function-syntax">Problems::problem_quote</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><a href="2-pl2.html#SP6" class="function-link"><span class="function-syntax">Problems::expand_stream</span></a><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="2-pl2.html#SP5" class="function-link"><span class="function-syntax">Problems::problem_quote</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><a href="2-pl2.html#SP6" class="function-link"><span class="function-syntax">Problems::expand_stream</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span> <span class="plain-syntax">}</span>

View file

@ -19,6 +19,7 @@ fields are blank.
@e EXT_TITLE_TOO_LONG_CE @e EXT_TITLE_TOO_LONG_CE
@e EXT_AUTHOR_TOO_LONG_CE @e EXT_AUTHOR_TOO_LONG_CE
@e LANGUAGE_UNAVAILABLE_CE @e LANGUAGE_UNAVAILABLE_CE
@e LANGUAGE_DEFICIENT_CE
@e LEXER_CE /* an error generated by the |words| module */ @e LEXER_CE /* an error generated by the |words| module */
@e SYNTAX_CE /* an error generated by the |syntax| module, or by our reading of the tree */ @e SYNTAX_CE /* an error generated by the |syntax| module, or by our reading of the tree */
@ -138,6 +139,8 @@ void CopyErrors::write(OUTPUT_STREAM, copy_error *CE) {
CE->details_N, MAX_EXTENSION_AUTHOR_LENGTH); break; CE->details_N, MAX_EXTENSION_AUTHOR_LENGTH); break;
case LANGUAGE_UNAVAILABLE_CE: WRITE("%S refers to an unavailable language: %S", case LANGUAGE_UNAVAILABLE_CE: WRITE("%S refers to an unavailable language: %S",
CE->copy->edition->work->genre->genre_name, CE->details); break; CE->copy->edition->work->genre->genre_name, CE->details); break;
case LANGUAGE_DEFICIENT_CE: WRITE("%S: %S",
CE->copy->edition->work->genre->genre_name, CE->details); break;
case LEXER_CE: @<Write a lexer error@>; break; case LEXER_CE: @<Write a lexer error@>; break;
case SYNTAX_CE: @<Write a syntax error@>; break; case SYNTAX_CE: @<Write a syntax error@>; break;
default: internal_error("an unknown error occurred"); default: internal_error("an unknown error occurred");

View file

@ -8,6 +8,13 @@ Inform can read and write text in multiple natural languages, though it
needs help to do so: each natural language known to Inform comes from a needs help to do so: each natural language known to Inform comes from a
small resource folder called its "bundle". (This includes English.) small resource folder called its "bundle". (This includes English.)
@e PLAY_LSUPPORT from 1
@e SYNTAX_LSUPPORT
@e INDEXING_LSUPPORT
@e PROBLEMS_LSUPPORT
@d MAX_LSUPPORTS 5
= =
typedef struct inform_language { typedef struct inform_language {
struct inbuild_copy *as_copy; struct inbuild_copy *as_copy;
@ -19,6 +26,7 @@ typedef struct inform_language {
struct inform_extension *belongs_to; /* if it does belong to an extension */ struct inform_extension *belongs_to; /* if it does belong to an extension */
int adaptive_person; /* which person text substitutions are written from */ int adaptive_person; /* which person text substitutions are written from */
int Preform_loaded; /* has a Preform syntax definition been read for this? */ int Preform_loaded; /* has a Preform syntax definition been read for this? */
int supports[MAX_LSUPPORTS];
CLASS_DEFINITION CLASS_DEFINITION
} inform_language; } inform_language;
@ -43,6 +51,7 @@ void Languages::scan(inbuild_copy *C) {
/* but not this one */ /* but not this one */
L->native_cue = NULL; L->native_cue = NULL;
L->belongs_to = NULL; L->belongs_to = NULL;
for (int i=0; i<MAX_LSUPPORTS; i++) L->supports[i] = FALSE;
filename *about_file = Filenames::in(Languages::path_to_bundle(L), I"about.txt"); filename *about_file = Filenames::in(Languages::path_to_bundle(L), I"about.txt");
if (TextFiles::exists(about_file)) { if (TextFiles::exists(about_file)) {
@ -67,22 +76,8 @@ void Languages::scan(inbuild_copy *C) {
} }
JSON_value *needs = JSON::look_up_object(C->metadata_record, I"needs"); JSON_value *needs = JSON::look_up_object(C->metadata_record, I"needs");
if (needs) { if (needs) {
TEMPORARY_TEXT(expected)
WRITE_TO(expected, "%SLanguageKit", C->edition->work->title);
int found_expected = FALSE;
JSON_value *E;
LOOP_OVER_LINKED_LIST(E, JSON_value, needs->if_list)
@<Extract this requirement@>;
if (found_expected == FALSE) {
TEMPORARY_TEXT(err)
WRITE_TO(err, "language bundle must have dependency on '%S'", expected);
Copies::attach_error(C, CopyErrors::new_T(METADATA_MALFORMED_CE, -1, err));
DISCARD_TEXT(err)
}
DISCARD_TEXT(expected)
} else {
TEMPORARY_TEXT(err) TEMPORARY_TEXT(err)
WRITE_TO(err, "'language_metadata.json' must contain a \"needs\" field"); WRITE_TO(err, "language bundle is not allowed to have 'needs'");
Copies::attach_error(C, CopyErrors::new_T(METADATA_MALFORMED_CE, -1, err)); Copies::attach_error(C, CopyErrors::new_T(METADATA_MALFORMED_CE, -1, err));
DISCARD_TEXT(err) DISCARD_TEXT(err)
} }
@ -104,34 +99,16 @@ void Languages::scan(inbuild_copy *C) {
JSON_value *translated_syntax_cue = JSON::look_up_object(language_details, I"translated-syntax-cue"); JSON_value *translated_syntax_cue = JSON::look_up_object(language_details, I"translated-syntax-cue");
if (translated_syntax_cue) L->native_cue = Str::duplicate(translated_syntax_cue->if_string); if (translated_syntax_cue) L->native_cue = Str::duplicate(translated_syntax_cue->if_string);
@<Extract this requirement@> = JSON_value *supports = JSON::look_up_object(language_details, I"supports");
JSON_value *if_clause = JSON::look_up_object(E, I"if"); if (supports) {
JSON_value *unless_clause = JSON::look_up_object(E, I"unless"); JSON_value *E;
if ((if_clause) || (unless_clause)) { LOOP_OVER_LINKED_LIST(E, JSON_value, supports->if_list) {
TEMPORARY_TEXT(err) text_stream *key = E->if_string;
WRITE_TO(err, "a language bundle's needs must be unconditional"); if (Str::eq(key, I"play")) L->supports[PLAY_LSUPPORT] = TRUE;
Copies::attach_error(C, CopyErrors::new_T(METADATA_MALFORMED_CE, -1, err)); if (Str::eq(key, I"syntax")) L->supports[SYNTAX_LSUPPORT] = TRUE;
DISCARD_TEXT(err) if (Str::eq(key, I"indexing")) L->supports[INDEXING_LSUPPORT] = TRUE;
} if (Str::eq(key, I"problems")) L->supports[PROBLEMS_LSUPPORT] = TRUE;
JSON_value *need_clause = JSON::look_up_object(E, I"need");
if (need_clause) {
JSON_value *need_type = JSON::look_up_object(need_clause, I"type");
JSON_value *need_title = JSON::look_up_object(need_clause, I"title");
JSON_value *need_version_range = JSON::look_up_object(need_clause, I"version-range");
if (Str::eq(need_type->if_string, I"kit")) {
if (Str::eq(expected, need_title->if_string)) found_expected = TRUE;
if (need_version_range) {
TEMPORARY_TEXT(err)
WRITE_TO(err, "version ranges on kit dependencies are not yet implemented");
Copies::attach_error(C, CopyErrors::new_T(METADATA_MALFORMED_CE, -1, err));
DISCARD_TEXT(err)
}
} else {
TEMPORARY_TEXT(err)
WRITE_TO(err, "a language can only have kits as dependencies");
Copies::attach_error(C, CopyErrors::new_T(METADATA_MALFORMED_CE, -1, err));
DISCARD_TEXT(err)
} }
} }
@ -162,33 +139,30 @@ void Languages::write_ISO_code(OUTPUT_STREAM, inform_language *L) {
WRITE("%S", L->iso_code); WRITE("%S", L->iso_code);
} }
@h Support.
Different languages support different levels of translation.
=
int Languages::supports(inform_language *L, int S) {
if ((S<1) || (S>=MAX_LSUPPORTS)) internal_error("support out of range");
if (L == NULL) return FALSE;
return L->supports[S];
}
@h Kit. @h Kit.
Each language needs its own kit(s) of Inter code, given in the dependencies: Each language needs its own kit of Inter code, if it is going to be used as
a language of play. The following is called only when `L` is the language of
play for `project`:
= =
void Languages::add_kit_dependencies_to_project(inform_language *L, inform_project *project) { void Languages::add_kit_dependencies_to_project(inform_language *L, inform_project *project) {
if (L == NULL) internal_error("no language"); if (L == NULL) internal_error("no language");
JSON_value *md = L->as_copy->metadata_record; TEMPORARY_TEXT(kitname)
if (md == NULL) return; /* should never happen, but fail safe */ WRITE_TO(kitname, "%SLanguageKit", L->as_copy->edition->work->title);
JSON_value *needs = JSON::look_up_object(md, I"needs"); inbuild_work *work = Works::new_raw(kit_genre, kitname, I"");
if (needs == NULL) return; /* should never happen, but fail safe */ inbuild_requirement *req = Requirements::any_version_of(work);
JSON_value *E; Projects::add_kit_dependency(project, kitname, L, NULL, req, NULL);
LOOP_OVER_LINKED_LIST(E, JSON_value, needs->if_list) { DISCARD_TEXT(kitname)
JSON_value *need_clause = JSON::look_up_object(E, I"need");
if (need_clause) {
JSON_value *need_type = JSON::look_up_object(need_clause, I"type");
JSON_value *need_title = JSON::look_up_object(need_clause, I"title");
JSON_value *need_version = JSON::look_up_object(need_clause, I"version");
if (Str::eq(need_type->if_string, I"kit")) {
inbuild_work *work = Works::new_raw(kit_genre, need_title->if_string, I"");
inbuild_requirement *req;
if (need_version) req = Requirements::new(work,
VersionNumberRanges::compatibility_range(VersionNumbers::from_text(need_version->if_string)));
else req = Requirements::any_version_of(work);
Projects::add_kit_dependency(project, need_title->if_string, L, NULL, req, NULL);
}
}
}
} }
@h Finding by name. @h Finding by name.

View file

@ -396,8 +396,17 @@ void Projects::set_languages(inform_project *proj) {
text_stream *name = proj->name_of_language_of_syntax; text_stream *name = proj->name_of_language_of_syntax;
inform_language *L = Languages::find_for(name, Projects::nest_list(proj)); inform_language *L = Languages::find_for(name, Projects::nest_list(proj));
if (L) { if (L) {
proj->language_of_syntax = L; if (Languages::supports(L, SYNTAX_LSUPPORT)) {
Projects::add_language_extension_nest(proj); proj->language_of_syntax = L;
Projects::add_language_extension_nest(proj);
} else {
TEMPORARY_TEXT(err)
WRITE_TO(err,
"this project asks to be 'written in' a language which does not support that");
Copies::attach_error(proj->as_copy,
CopyErrors::new_T(LANGUAGE_DEFICIENT_CE, -1, err));
DISCARD_TEXT(err)
}
} else { } else {
build_vertex *RV = Graphs::req_vertex( build_vertex *RV = Graphs::req_vertex(
Requirements::any_version_of(Works::new(language_genre, name, I""))); Requirements::any_version_of(Works::new(language_genre, name, I"")));
@ -407,8 +416,17 @@ void Projects::set_languages(inform_project *proj) {
name = proj->name_of_language_of_play; name = proj->name_of_language_of_play;
L = Languages::find_for(name, Projects::nest_list(proj)); L = Languages::find_for(name, Projects::nest_list(proj));
if (L) { if (L) {
proj->language_of_play = L; if (Languages::supports(L, PLAY_LSUPPORT)) {
Projects::add_language_extension_nest(proj); proj->language_of_play = L;
Projects::add_language_extension_nest(proj);
} else {
TEMPORARY_TEXT(err)
WRITE_TO(err,
"this project asks to be 'played in' a language which does not support that");
Copies::attach_error(proj->as_copy,
CopyErrors::new_T(LANGUAGE_DEFICIENT_CE, -1, err));
DISCARD_TEXT(err)
}
} else { } else {
build_vertex *RV = Graphs::req_vertex( build_vertex *RV = Graphs::req_vertex(
Requirements::any_version_of(Works::new(language_genre, name, I""))); Requirements::any_version_of(Works::new(language_genre, name, I"")));
@ -421,8 +439,17 @@ void Projects::set_languages(inform_project *proj) {
name = proj->name_of_language_of_index; name = proj->name_of_language_of_index;
L = Languages::find_for(name, Projects::nest_list(proj)); L = Languages::find_for(name, Projects::nest_list(proj));
if (L) { if (L) {
proj->language_of_index = L; if (Languages::supports(L, INDEXING_LSUPPORT)) {
Projects::add_language_extension_nest(proj); proj->language_of_index = L;
Projects::add_language_extension_nest(proj);
} else {
TEMPORARY_TEXT(err)
WRITE_TO(err,
"this project asks to be 'indexed in' a language which does not support that");
Copies::attach_error(proj->as_copy,
CopyErrors::new_T(LANGUAGE_DEFICIENT_CE, -1, err));
DISCARD_TEXT(err)
}
} else { } else {
build_vertex *RV = Graphs::req_vertex( build_vertex *RV = Graphs::req_vertex(
Requirements::any_version_of(Works::new(language_genre, name, I""))); Requirements::any_version_of(Works::new(language_genre, name, I"")));

View file

@ -1,4 +1,4 @@
Total memory consumption was 121729K = 119 MB Total memory consumption was 121735K = 119 MB
---- was used for 2061500 objects, in 368450 frames in 0 x 800K = 0K = 0 MB: ---- was used for 2061500 objects, in 368450 frames in 0 x 800K = 0K = 0 MB:
@ -248,7 +248,7 @@ Total memory consumption was 121729K = 119 MB
100.0% was used for memory not allocated for objects: 100.0% was used for memory not allocated for objects:
57.0% text stream storage 71063892 bytes in 483914 claims 57.0% text stream storage 71070764 bytes in 483934 claims
4.2% dictionary storage 5335552 bytes in 7662 claims 4.2% dictionary storage 5335552 bytes in 7662 claims
---- sorting 3488 bytes in 415 claims ---- sorting 3488 bytes in 415 claims
5.7% source text 7200000 bytes in 3 claims 5.7% source text 7200000 bytes in 3 claims

View file

@ -1,32 +1,33 @@
100.0% in inform7 run 100.0% in inform7 run
70.4% in compilation to Inter 71.1% in compilation to Inter
49.9% in //Sequence::undertake_queued_tasks// 50.5% in //Sequence::undertake_queued_tasks//
4.9% in //MajorNodes::pre_pass// 4.6% in //MajorNodes::pre_pass//
3.3% in //MajorNodes::pass_1// 3.4% in //MajorNodes::pass_1//
1.7% in //ImperativeDefinitions::assess_all// 1.7% in //ImperativeDefinitions::assess_all//
1.3% in //RTKindConstructors::compile// 1.5% in //RTKindConstructors::compile//
1.3% in //RTPhrasebook::compile_entries// 1.5% in //RTPhrasebook::compile_entries//
0.9% in //Sequence::lint_inter// 1.1% in //Sequence::lint_inter//
0.5% in //ImperativeDefinitions::compile_first_block// 0.5% in //ImperativeDefinitions::compile_first_block//
0.5% in //MajorNodes::pass_2// 0.5% in //MajorNodes::pass_2//
0.5% in //Sequence::undertake_queued_tasks// 0.5% in //Sequence::undertake_queued_tasks//
0.5% in //Sequence::undertake_queued_tasks//
0.5% in //World::stage_V// 0.5% in //World::stage_V//
0.3% in //Sequence::undertake_queued_tasks//
0.1% in //CompletionModule::compile// 0.1% in //CompletionModule::compile//
0.1% in //InferenceSubjects::emit_all// 0.1% in //InferenceSubjects::emit_all//
0.1% in //RTKindConstructors::compile_permissions// 0.1% in //RTKindConstructors::compile_permissions//
0.1% in //Task::make_built_in_kind_constructors// 0.1% in //Task::make_built_in_kind_constructors//
3.0% not specifically accounted for 0.1% in //World::stages_II_and_III//
25.7% in running Inter pipeline 2.5% not specifically accounted for
9.9% in step 14/15: generate inform6 -> auto.inf 25.3% in running Inter pipeline
5.5% in step 5/15: load-binary-kits 9.6% in step 14/15: generate inform6 -> auto.inf
5.3% in step 6/15: make-synoptic-module 5.6% in step 5/15: load-binary-kits
5.2% in step 6/15: make-synoptic-module
1.7% in step 9/15: make-identifiers-unique 1.7% in step 9/15: make-identifiers-unique
0.3% in step 12/15: eliminate-redundant-operations 0.3% in step 12/15: eliminate-redundant-operations
0.3% in step 4/15: compile-splats 0.3% in step 4/15: compile-splats
0.3% in step 7/15: shorten-wiring 0.3% in step 7/15: shorten-wiring
0.3% in step 8/15: detect-indirect-calls 0.3% in step 8/15: detect-indirect-calls
0.1% in step 11/15: eliminate-redundant-labels 0.1% in step 11/15: eliminate-redundant-labels
1.2% not specifically accounted for 1.3% not specifically accounted for
3.1% in supervisor 3.2% in supervisor
0.6% not specifically accounted for 0.2% not specifically accounted for

View file

@ -2,7 +2,7 @@
"is": { "is": {
"type": "kit", "type": "kit",
"title": "BasicInformExtrasKit", "title": "BasicInformExtrasKit",
"version": "10.2.0-beta+6W21" "version": "10.2.0-beta+6W22"
}, },
"kit-details": { "kit-details": {
"has-priority": 1 "has-priority": 1

View file

@ -2,7 +2,7 @@
"is": { "is": {
"type": "kit", "type": "kit",
"title": "BasicInformKit", "title": "BasicInformKit",
"version": "10.2.0-beta+6W21" "version": "10.2.0-beta+6W22"
}, },
"needs": [ { "needs": [ {
"unless": { "unless": {

View file

@ -2,7 +2,7 @@
"is": { "is": {
"type": "kit", "type": "kit",
"title": "CommandParserKit", "title": "CommandParserKit",
"version": "10.2.0-beta+6W21" "version": "10.2.0-beta+6W22"
}, },
"needs": [ { "needs": [ {
"need": { "need": {

View file

@ -2,7 +2,7 @@
"is": { "is": {
"type": "kit", "type": "kit",
"title": "EnglishLanguageKit", "title": "EnglishLanguageKit",
"version": "10.2.0-beta+6W21" "version": "10.2.0-beta+6W22"
}, },
"needs": [ { "needs": [ {
"need": { "need": {

View file

@ -2,7 +2,7 @@
"is": { "is": {
"type": "kit", "type": "kit",
"title": "WorldModelKit", "title": "WorldModelKit",
"version": "10.2.0-beta+6W21" "version": "10.2.0-beta+6W22"
}, },
"needs": [ { "needs": [ {
"need": { "need": {

View file

@ -3,13 +3,8 @@
"type": "language", "type": "language",
"title": "English" "title": "English"
}, },
"needs": [ {
"need": {
"type": "kit",
"title": "EnglishLanguageKit"
}
} ],
"language-details": { "language-details": {
"supports": [ "play", "syntax", "indexing", "problems" ],
"translated-name": "English", "translated-name": "English",
"iso-639-1-code": "en", "iso-639-1-code": "en",
"translated-syntax-cue": "in English" "translated-syntax-cue": "in English"

View file

@ -1,2 +0,0 @@
%Index.Pages.Contents.Title = Index des matières
%Index.Pages.Contents.Caption = Comment le texte source est organisé

Binary file not shown.

Before

Width:  |  Height:  |  Size: 545 B

View file

@ -1,17 +0,0 @@
{
"is": {
"type": "language",
"title": "French"
},
"needs": [ {
"need": {
"type": "kit",
"title": "FrenchLanguageKit"
}
} ],
"language-details": {
"translated-name": "Français",
"iso-639-1-code": "fr",
"translated-syntax-cue": "en français"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 545 B

View file

@ -1,17 +0,0 @@
{
"is": {
"type": "language",
"title": "German"
},
"needs": [ {
"need": {
"type": "kit",
"title": "GermanLanguageKit"
}
} ],
"language-details": {
"translated-name": "Deutsch",
"iso-639-1-code": "de",
"translated-syntax-cue": "Geschrieben auf Deutsch"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 420 B

View file

@ -1,17 +0,0 @@
{
"is": {
"type": "language",
"title": "Italian"
},
"needs": [ {
"need": {
"type": "kit",
"title": "ItalianLanguageKit"
}
} ],
"language-details": {
"translated-name": "Italiano",
"iso-639-1-code": "it",
"translated-syntax-cue": "scritto in italiano"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 469 B

View file

@ -1,17 +0,0 @@
{
"is": {
"type": "language",
"title": "Spanish"
},
"needs": [ {
"need": {
"type": "kit",
"title": "SpanishLanguageKit"
}
} ],
"language-details": {
"translated-name": "Español",
"iso-639-1-code": "es",
"translated-syntax-cue": "en español"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 B

View file

@ -1,17 +0,0 @@
{
"is": {
"type": "language",
"title": "Swedish"
},
"needs": [ {
"need": {
"type": "kit",
"title": "SwedishLanguageKit"
}
} ],
"language-details": {
"translated-name": "Svenska",
"iso-639-1-code": "sv",
"translated-syntax-cue": "på svenska"
}
}

View file

@ -24,6 +24,7 @@
<language-metadata> ::= { <language-metadata> ::= {
"translated-name": string, "translated-name": string,
"iso-639-1-code": string, "iso-639-1-code": string,
"supports": [ ( "play" | "syntax" | "indexing" | "problems" )* ],
?"translated-syntax-cue": string ?"translated-syntax-cue": string
} }

View file

@ -28,10 +28,7 @@ void CorePreform::preform_error(word_assemblage base_text, nonterminal *nt,
LOG("The production at fault is:\n"); LOG("The production at fault is:\n");
Instrumentation::log_production(pr, FALSE); LOG("\n"); Instrumentation::log_production(pr, FALSE); LOG("\n");
} }
if (nt == NULL) Problems::quote_nonterminal(1, nt);
Problems::quote_text(1, "(no nonterminal)");
else
Problems::quote_wide_text(1, Vocabulary::get_exemplar(nt->nonterminal_id, FALSE));
Problems::quote_text(2, message); Problems::quote_text(2, message);
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable)); StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable));
if (WordAssemblages::nonempty(base_text)) { if (WordAssemblages::nonempty(base_text)) {
@ -63,6 +60,36 @@ void CorePreform::preform_error(word_assemblage base_text, nonterminal *nt,
DISCARD_TEXT(TEMP) DISCARD_TEXT(TEMP)
} }
@ And similarly for inflections.
@d PREFORM_ERROR_INFLECTIONS_CALLBACK CorePreform::inflections_problem
=
void CorePreform::inflections_problem(nonterminal *nt, inform_language *nl,
text_stream *err) {
if (nl) Problems::quote_wording(1, nl->instance_name);
Problems::quote_stream(2, err);
Problems::quote_nonterminal(3, nt);
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable));
Problems::issue_problem_segment(
"An error occurred with the Preform syntax used to specify the grammar "
"of source text. If this occurs with English, that's a bug in the compiler, "
"and should be reported. But if it occurs with languages other than English, "
"there's an issue with the language definition, which should be reported "
"to its maintainer. At any rate, this compilation can't go further. ");
if (nt) {
Problems::issue_problem_segment(
"%PThe nonterminal causing problems is %3. ");
}
if (nl) {
Problems::issue_problem_segment(
"%PThe natural language affected is '%1'. ");
}
Problems::issue_problem_segment(
"%PThe problem as reported by Preform is: %2.");
Problems::issue_problem_end();
}
@h Optimisation. @h Optimisation.
The following is fine-tuning for speed: if it weren't here, the compiler would The following is fine-tuning for speed: if it weren't here, the compiler would
still function, but would be slower. With that said, it's possible to break still function, but would be slower. With that said, it's possible to break

View file

@ -73,6 +73,15 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) {
"I can't find any definition for this language."); "I can't find any definition for this language.");
Problems::issue_problem_end(); Problems::issue_problem_end();
break; break;
case LANGUAGE_DEFICIENT_CE:
Problems::quote_work(1, CE->copy->edition->work);
Problems::quote_stream(2, CE->details);
SourceProblems::quote_genre(3, CE);
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable));
Problems::issue_problem_segment(
"The %3 %1 seems to need me to work with a non-English language, but '%2'.");
Problems::issue_problem_end();
break;
case EXT_TITLE_TOO_LONG_CE: { case EXT_TITLE_TOO_LONG_CE: {
int max = MAX_EXTENSION_TITLE_LENGTH; int max = MAX_EXTENSION_TITLE_LENGTH;
int overage = CE->details_N - MAX_EXTENSION_TITLE_LENGTH; int overage = CE->details_N - MAX_EXTENSION_TITLE_LENGTH;

View file

@ -305,39 +305,3 @@ void UsingProblems::diagnose_further(void) {
"what circumstances apply - for example 'Every turn: if the player is " "what circumstances apply - for example 'Every turn: if the player is "
"in the Penalty Zone, say \"An alarm sounds.\")"); "in the Penalty Zone, say \"An alarm sounds.\")");
} }
@
@d PREFORM_ERROR_INFLECTIONS_CALLBACK UsingProblems::inflections_problem
=
void UsingProblems::inflections_problem(nonterminal *nt, inform_language *nl, text_stream *err) {
if (nl) Problems::quote_wording(1, nl->instance_name);
Problems::quote_stream(2, err);
text_stream *NT = Str::new();
if (nt) WRITE_TO(NT, "%V", nt->nonterminal_id);
LOOP_THROUGH_TEXT(pos, NT) {
if (Str::get(pos) == '<') Str::put(pos, '\'');
if (Str::get(pos) == '>') Str::put(pos, '\'');
}
Problems::quote_stream(3, NT);
Problems::issue_problem_begin(NULL, "preform-problem");
Problems::issue_problem_segment(
"An error occurred with the Preform syntax used to specify the grammar "
"of source text. If this occurs with English, that's a bug in the compiler, "
"and should be reported. But if it occurs with languages other than English, "
"there's an issue with the language definition, which should be reported "
"to its maintainer. At any rate, this compilation can't go further. ");
if (nt) {
Problems::issue_problem_segment(
"%PThe nonterminal causing problems is %3. ");
}
if (nl) {
Problems::issue_problem_segment(
"%PThe natural language affected is '%1'. ");
}
Problems::issue_problem_segment(
"%PThe problem as reported by Preform is: %2.");
Problems::issue_problem_end();
}

View file

@ -693,7 +693,7 @@ forcetransferpreform:
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Copying the indexing structure and localisation files into the app # Copying the indexing structure and localisation files into the app
{set name: LOCALISEDINDEXES value: English, French} {set name: LOCALISEDINDEXES value: English}
.PHONY: transferindext .PHONY: transferindext
transferindext: forcetransferindext transferindext: forcetransferindext

View file

@ -221,11 +221,11 @@ declension Declensions::decline_from_groups(wording W, NATURAL_LANGUAGE_WORDS_TY
if ((pr->first_pt == NULL) || if ((pr->first_pt == NULL) ||
(pr->first_pt->ptoken_category != NONTERMINAL_PTC) || (pr->first_pt->ptoken_category != NONTERMINAL_PTC) ||
(pr->first_pt->next_pt != NULL)) (pr->first_pt->next_pt != NULL))
internal_error("noun declension nonterminal malformed"); Declensions::error(nt, nl, I"noun declension nonterminal malformed");
if (--group == 0) if (--group == 0)
return Declensions::decline_from(W, nl, pr->first_pt->nt_pt, gen, num); return Declensions::decline_from(W, nl, pr->first_pt->nt_pt, gen, num);
} }
internal_error("noun declension nonterminal has too few groups"); Declensions::error(nt, nl, I"noun declension nonterminal has too few groups");
} }
return D; return D;
} }
@ -233,13 +233,14 @@ declension Declensions::decline_from_groups(wording W, NATURAL_LANGUAGE_WORDS_TY
@<Set the group number@> = @<Set the group number@> =
group = result[0] - '0'; group = result[0] - '0';
if ((group <= 0) || (group > 9)) if ((group <= 0) || (group > 9))
internal_error("noun declension grouper result not a group number"); Declensions::error(nt, nl, I"noun declension grouper result not a group number");
if (result[1]) { if (result[1]) {
int u = result[1] - '0'; int u = result[1] - '0';
if ((u < 0) || (u > 9)) if ((u < 0) || (u > 9))
internal_error("noun declension grouper result not a group number"); Declensions::error(nt, nl, I"noun declension grouper result not a group number");
group = group*10 + u; group = group*10 + u;
if (result[2]) internal_error("noun declension grouper result too high"); if (result[2])
Declensions::error(nt, nl, I"noun declension grouper result too high");
} }
@ We have now found the actual declension table NT; if there are $N$ cases @ We have now found the actual declension table NT; if there are $N$ cases
@ -258,7 +259,7 @@ declension Declensions::decline_from(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl,
if ((pr->first_pt == NULL) || if ((pr->first_pt == NULL) ||
(pr->first_pt->ptoken_category != FIXED_WORD_PTC) || (pr->first_pt->ptoken_category != FIXED_WORD_PTC) ||
(pr->first_pt->next_pt != NULL)) (pr->first_pt->next_pt != NULL))
internal_error("<noun-declension> too complex"); Declensions::error(nt, nl, I"declension too complex");
if (((c < nc) && (num == SINGULAR_NUMBER)) || ((c >= nc) && (num == PLURAL_NUMBER))) { if (((c < nc) && (num == SINGULAR_NUMBER)) || ((c >= nc) && (num == PLURAL_NUMBER))) {
TEMPORARY_TEXT(stem) TEMPORARY_TEXT(stem)
TEMPORARY_TEXT(result) TEMPORARY_TEXT(result)
@ -272,12 +273,12 @@ declension Declensions::decline_from(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl,
} }
c++; c++;
} }
if (c < 2*nc) internal_error("too few cases in declension"); if (c < 2*nc) Declensions::error(nt, nl, I"too few cases in declension");
if (c > 2*nc) internal_error("too many cases in declension"); if (c > 2*nc) Declensions::error(nt, nl, I"too many cases in declension");
return D; return D;
} }
} }
internal_error("declination unavailable"); Declensions::error(nt, nl, I"declension unavailable");
return D; return D;
} }

View file

@ -212,6 +212,21 @@ void Problems::quote_wide_text(int t, wchar_t *p) {
void Problems::expand_wide_text(OUTPUT_STREAM, void *p) { void Problems::expand_wide_text(OUTPUT_STREAM, void *p) {
WRITE("%w", (wchar_t *) p); WRITE("%w", (wchar_t *) p);
} }
void Problems::quote_nonterminal(int t, nonterminal *nt) {
Problems::problem_quote(t, (void *) nt, Problems::expand_nonterminal);
}
void Problems::expand_nonterminal(OUTPUT_STREAM, void *p) {
nonterminal *nt = (nonterminal *) p;
if (nt == NULL) { WRITE("(no nonterminal)"); return; }
TEMPORARY_TEXT(name)
WRITE_TO(name, "%w", Vocabulary::get_exemplar(nt->nonterminal_id, FALSE));
LOOP_THROUGH_TEXT(pos, name) {
wchar_t c = Str::get(pos);
if ((c == '<') || (c == '>')) c = '\'';
PUT(c);
}
DISCARD_TEXT(name);
}
void Problems::quote_stream(int t, text_stream *p) { void Problems::quote_stream(int t, text_stream *p) {
Problems::problem_quote(t, (void *) p, Problems::expand_stream); Problems::problem_quote(t, (void *) p, Problems::expand_stream);
} }