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
[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

View File

@ -1,3 +1,3 @@
Prerelease: beta
Build Date: 4 February 2023
Build Number: 6W21
Build Date: 5 February 2023
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">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-itc.html#SP8" class="function-link"><span class="function-syntax">InternalTests::begin</span></a><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>
<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>
@ -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">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="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_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_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">(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="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>
</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
things by making the wrong settings here, so be wary of making changes.
</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>
</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:
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>.
</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 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="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#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#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#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#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#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#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;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;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-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-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-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&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="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="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>

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>
</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">
<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-->

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="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">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">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="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="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>
@ -326,13 +326,14 @@ we will say that so does any inflected form of it:
<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="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">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="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="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>
</pre>
<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="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">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="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>
@ -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="identifier-syntax">c</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"> &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"> &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><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="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>
</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>
<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">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>

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="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="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="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>

View File

@ -19,6 +19,7 @@ fields are blank.
@e EXT_TITLE_TOO_LONG_CE
@e EXT_AUTHOR_TOO_LONG_CE
@e LANGUAGE_UNAVAILABLE_CE
@e LANGUAGE_DEFICIENT_CE
@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 */
@ -138,6 +139,8 @@ void CopyErrors::write(OUTPUT_STREAM, copy_error *CE) {
CE->details_N, MAX_EXTENSION_AUTHOR_LENGTH); break;
case LANGUAGE_UNAVAILABLE_CE: WRITE("%S refers to an unavailable language: %S",
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 SYNTAX_CE: @<Write a syntax error@>; break;
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
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 {
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 */
int adaptive_person; /* which person text substitutions are written from */
int Preform_loaded; /* has a Preform syntax definition been read for this? */
int supports[MAX_LSUPPORTS];
CLASS_DEFINITION
} inform_language;
@ -43,6 +51,7 @@ void Languages::scan(inbuild_copy *C) {
/* but not this one */
L->native_cue = 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");
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");
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)
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));
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");
if (translated_syntax_cue) L->native_cue = Str::duplicate(translated_syntax_cue->if_string);
@<Extract this requirement@> =
JSON_value *if_clause = JSON::look_up_object(E, I"if");
JSON_value *unless_clause = JSON::look_up_object(E, I"unless");
if ((if_clause) || (unless_clause)) {
TEMPORARY_TEXT(err)
WRITE_TO(err, "a language bundle's needs must be unconditional");
Copies::attach_error(C, CopyErrors::new_T(METADATA_MALFORMED_CE, -1, err));
DISCARD_TEXT(err)
}
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)
JSON_value *supports = JSON::look_up_object(language_details, I"supports");
if (supports) {
JSON_value *E;
LOOP_OVER_LINKED_LIST(E, JSON_value, supports->if_list) {
text_stream *key = E->if_string;
if (Str::eq(key, I"play")) L->supports[PLAY_LSUPPORT] = TRUE;
if (Str::eq(key, I"syntax")) L->supports[SYNTAX_LSUPPORT] = TRUE;
if (Str::eq(key, I"indexing")) L->supports[INDEXING_LSUPPORT] = TRUE;
if (Str::eq(key, I"problems")) L->supports[PROBLEMS_LSUPPORT] = TRUE;
}
}
@ -162,33 +139,30 @@ void Languages::write_ISO_code(OUTPUT_STREAM, inform_language *L) {
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.
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) {
if (L == NULL) internal_error("no language");
JSON_value *md = L->as_copy->metadata_record;
if (md == NULL) return; /* should never happen, but fail safe */
JSON_value *needs = JSON::look_up_object(md, I"needs");
if (needs == NULL) return; /* should never happen, but fail safe */
JSON_value *E;
LOOP_OVER_LINKED_LIST(E, JSON_value, needs->if_list) {
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);
}
}
}
TEMPORARY_TEXT(kitname)
WRITE_TO(kitname, "%SLanguageKit", L->as_copy->edition->work->title);
inbuild_work *work = Works::new_raw(kit_genre, kitname, I"");
inbuild_requirement *req = Requirements::any_version_of(work);
Projects::add_kit_dependency(project, kitname, L, NULL, req, NULL);
DISCARD_TEXT(kitname)
}
@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;
inform_language *L = Languages::find_for(name, Projects::nest_list(proj));
if (L) {
proj->language_of_syntax = L;
Projects::add_language_extension_nest(proj);
if (Languages::supports(L, SYNTAX_LSUPPORT)) {
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 {
build_vertex *RV = Graphs::req_vertex(
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;
L = Languages::find_for(name, Projects::nest_list(proj));
if (L) {
proj->language_of_play = L;
Projects::add_language_extension_nest(proj);
if (Languages::supports(L, PLAY_LSUPPORT)) {
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 {
build_vertex *RV = Graphs::req_vertex(
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;
L = Languages::find_for(name, Projects::nest_list(proj));
if (L) {
proj->language_of_index = L;
Projects::add_language_extension_nest(proj);
if (Languages::supports(L, INDEXING_LSUPPORT)) {
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 {
build_vertex *RV = Graphs::req_vertex(
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:
@ -248,7 +248,7 @@ Total memory consumption was 121729K = 119 MB
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
---- sorting 3488 bytes in 415 claims
5.7% source text 7200000 bytes in 3 claims

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,13 +3,8 @@
"type": "language",
"title": "English"
},
"needs": [ {
"need": {
"type": "kit",
"title": "EnglishLanguageKit"
}
} ],
"language-details": {
"supports": [ "play", "syntax", "indexing", "problems" ],
"translated-name": "English",
"iso-639-1-code": "en",
"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> ::= {
"translated-name": string,
"iso-639-1-code": string,
"supports": [ ( "play" | "syntax" | "indexing" | "problems" )* ],
?"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");
Instrumentation::log_production(pr, FALSE); LOG("\n");
}
if (nt == NULL)
Problems::quote_text(1, "(no nonterminal)");
else
Problems::quote_wide_text(1, Vocabulary::get_exemplar(nt->nonterminal_id, FALSE));
Problems::quote_nonterminal(1, nt);
Problems::quote_text(2, message);
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(Untestable));
if (WordAssemblages::nonempty(base_text)) {
@ -63,6 +60,36 @@ void CorePreform::preform_error(word_assemblage base_text, nonterminal *nt,
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.
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

View File

@ -73,6 +73,15 @@ void SourceProblems::issue_problems_arising(inbuild_copy *C) {
"I can't find any definition for this language.");
Problems::issue_problem_end();
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: {
int max = 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 "
"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
{set name: LOCALISEDINDEXES value: English, French}
{set name: LOCALISEDINDEXES value: English}
.PHONY: transferindext
transferindext: forcetransferindext

View File

@ -221,11 +221,11 @@ declension Declensions::decline_from_groups(wording W, NATURAL_LANGUAGE_WORDS_TY
if ((pr->first_pt == NULL) ||
(pr->first_pt->ptoken_category != NONTERMINAL_PTC) ||
(pr->first_pt->next_pt != NULL))
internal_error("noun declension nonterminal malformed");
Declensions::error(nt, nl, I"noun declension nonterminal malformed");
if (--group == 0)
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;
}
@ -233,13 +233,14 @@ declension Declensions::decline_from_groups(wording W, NATURAL_LANGUAGE_WORDS_TY
@<Set the group number@> =
group = result[0] - '0';
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]) {
int u = result[1] - '0';
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;
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
@ -258,7 +259,7 @@ declension Declensions::decline_from(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl,
if ((pr->first_pt == NULL) ||
(pr->first_pt->ptoken_category != FIXED_WORD_PTC) ||
(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))) {
TEMPORARY_TEXT(stem)
TEMPORARY_TEXT(result)
@ -272,12 +273,12 @@ declension Declensions::decline_from(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl,
}
c++;
}
if (c < 2*nc) internal_error("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 few cases in declension");
if (c > 2*nc) Declensions::error(nt, nl, I"too many cases in declension");
return D;
}
}
internal_error("declination unavailable");
Declensions::error(nt, nl, I"declension unavailable");
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) {
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) {
Problems::problem_quote(t, (void *) p, Problems::expand_stream);
}