mirror of
https://github.com/ganelson/inform.git
synced 2024-06-17 07:40:47 +03:00
Further work on language bundle reforms
This commit is contained in:
parent
b3b5d52426
commit
cfc27e3071
|
@ -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
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Prerelease: beta
|
||||
Build Date: 4 February 2023
|
||||
Build Number: 6W21
|
||||
Build Date: 5 February 2023
|
||||
Build Number: 6W22
|
||||
|
|
|
@ -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">, &</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>
|
||||
|
|
|
@ -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">§1. Reading Preform declarations from Syntax files</a></li><li><a href="1-cp2.html#SP2">§2. Converting Preform errors to problems</a></li><li><a href="1-cp2.html#SP3">§3. Optimisation</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="1-cp2.html#SP1">§1. Reading Preform declarations from Syntax files</a></li><li><a href="1-cp2.html#SP2">§2. Converting Preform errors to problems</a></li><li><a href="1-cp2.html#SP4">§4. Optimisation</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§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">-></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>§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>§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">-></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>§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"><s-object-instance></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>§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>§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 <k-kind> has to contain words with either the <article>
|
||||
bit or the <k-kind> 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"><s-adjective></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"><s-object-instance></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"><k-kind-variable></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"><k-formal-variable></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"><k-base-kind></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"><k-kind-construction></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"><k-kind></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"><k-kind-of-kind></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"><s-object-instance></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"><k-kind-variable></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"><k-formal-variable></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"><k-base-kind></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"><k-kind-construction></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"><k-kind></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"><k-kind-of-kind></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>
|
||||
|
|
|
@ -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">-></span><span class="element-syntax">project</span><span class="plain-syntax">-></span><span class="identifier-syntax">as_copy</span><span class="plain-syntax">-></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">§14</a><br/>Core Preform - <a href="1-cp2.html#SP2">§2</a><br/>Using Problems - <a href="2-up.html#SP3">§3</a>, <a href="2-up.html#SP3_3">§3.3</a><br/>Supplementary Issues - <a href="2-si.html#SP1">§1</a>, <a href="2-si.html#SP2">§2</a>, <a href="2-si.html#SP3">§3</a>, <a href="2-si.html#SP4">§4</a>, <a href="2-si.html#SP5">§5</a>, <a href="2-si.html#SP6">§6</a>, <a href="2-si.html#SP7">§7</a>, <a href="2-si.html#SP8">§8</a>, <a href="2-si.html#SP9">§9</a>, <a href="2-si.html#SP10">§10</a>, <a href="2-si.html#SP11">§11</a>, <a href="2-si.html#SP12">§12</a>, <a href="2-si.html#SP13">§13</a><br/>Problems With Source Text - <a href="2-pwst.html#SP1">§1</a><br/>Calculus Problems - <a href="2-cp.html#SP1">§1</a><br/>Kinds Problems - <a href="2-kp.html#SP1">§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">§14</a><br/>Core Preform - <a href="1-cp2.html#SP2">§2</a>, <a href="1-cp2.html#SP3">§3</a><br/>Using Problems - <a href="2-up.html#SP3">§3</a>, <a href="2-up.html#SP3_3">§3.3</a><br/>Supplementary Issues - <a href="2-si.html#SP1">§1</a>, <a href="2-si.html#SP2">§2</a>, <a href="2-si.html#SP3">§3</a>, <a href="2-si.html#SP4">§4</a>, <a href="2-si.html#SP5">§5</a>, <a href="2-si.html#SP6">§6</a>, <a href="2-si.html#SP7">§7</a>, <a href="2-si.html#SP8">§8</a>, <a href="2-si.html#SP9">§9</a>, <a href="2-si.html#SP10">§10</a>, <a href="2-si.html#SP11">§11</a>, <a href="2-si.html#SP12">§12</a>, <a href="2-si.html#SP13">§13</a><br/>Problems With Source Text - <a href="2-pwst.html#SP1">§1</a><br/>Calculus Problems - <a href="2-cp.html#SP1">§1</a><br/>Kinds Problems - <a href="2-kp.html#SP1">§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>
|
||||
|
||||
|
|
|
@ -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>§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">-></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">-></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">'<'</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">'>'</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">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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">-></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">-></span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-></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">-></span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-></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">-></span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-></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"> <= </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">group</span><span class="plain-syntax"> > </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"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">u</span><span class="plain-syntax"> > </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">§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">-></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">-></span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-></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">-></span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-></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> 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"> < </span><span class="identifier-syntax">nc</span><span class="plain-syntax">) && (</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"> >= </span><span class="identifier-syntax">nc</span><span class="plain-syntax">) && (</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"> < </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"> > </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"> < </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"> > </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>§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">§2</a>, <a href="3-dcl.html#SP3">§3</a>, <a href="3-dcl.html#SP6">§6</a>, <a href="3-dcl.html#SP6_1">§6.1</a>, <a href="3-dcl.html#SP7">§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">§2</a>, <a href="3-dcl.html#SP3">§3</a>, <a href="3-dcl.html#SP6">§6</a>, <a href="3-dcl.html#SP6_1">§6.1</a>, <a href="3-dcl.html#SP7">§7</a>, <a href="3-dcl.html#SP8">§8</a>, <a href="3-dcl.html#SP8_1">§8.1</a>, <a href="3-dcl.html#SP9">§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>
|
||||
|
|
|
@ -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">-></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">'<'</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="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">§5</a>, <a href="2-pl3.html#SP12">§12</a>, <a href="2-pl3.html#SP13">§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>
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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"")));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "BasicInformKit",
|
||||
"version": "10.2.0-beta+6W21"
|
||||
"version": "10.2.0-beta+6W22"
|
||||
},
|
||||
"needs": [ {
|
||||
"unless": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "CommandParserKit",
|
||||
"version": "10.2.0-beta+6W21"
|
||||
"version": "10.2.0-beta+6W22"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "EnglishLanguageKit",
|
||||
"version": "10.2.0-beta+6W21"
|
||||
"version": "10.2.0-beta+6W22"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "WorldModelKit",
|
||||
"version": "10.2.0-beta+6W21"
|
||||
"version": "10.2.0-beta+6W22"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -24,6 +24,7 @@
|
|||
<language-metadata> ::= {
|
||||
"translated-name": string,
|
||||
"iso-639-1-code": string,
|
||||
"supports": [ ( "play" | "syntax" | "indexing" | "problems" )* ],
|
||||
?"translated-syntax-cue": string
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue