inweb-bootstrap/docs/inweb/4-pl.html
2020-04-13 17:06:45 +01:00

1013 lines
199 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Programming Languages</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../index.html">
<img src="../..//docs/docs-src/Figures/Octagram184x184.png" width=72 height=72">
</a></h1>
<ul><li><a href="index.html"><span class="selectedlink">inweb</span></a></li>
</ul><h2>Foundation Module</h2><ul>
<li><a href="../foundation-module/index.html">foundation</a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul><h2>Example Webs</h2><ul>
<li><a href="../goldbach/index.html">goldbach</a></li>
<li><a href="../twinprimes/twinprimes.html">twinprimes</a></li>
</ul><h2>External</h2><ul>
<li><a href="https://github.com/ganelson/inweb">github</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Programming Languages' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#4">Chapter 4: Languages</a></li><li><b>Programming Languages</b></li></ul><p class="purpose">Defining the programming languages supported by Inweb, loading in their definitions from files.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Languages</a></li><li><a href="#SP9">&#167;9. Blocks</a></li><li><a href="#SP11">&#167;11. Colouring Rules</a></li><li><a href="#SP14">&#167;14. Reserved words</a></li><li><a href="#SP15">&#167;15. Expressions</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Languages. </b>Programming languages are identified by name: for example, <code class="display"><span class="extract">C++</span></code> or <code class="display"><span class="extract">Perl</span></code>.
</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="functiontext">Languages::find_by_name<button class="popup" onclick="togglePopup('usagePopup94')">...<span class="popuptext" id="usagePopup94">Usage of <b>Languages::find_by_name</b>:<br><a href="#SP3">&#167;3</a>, The Reader - <a href="2-tr.html#SP4_2">&#167;4.2</a>, <a href="2-tr.html#SP4_3">&#167;4.3</a>, <a href="2-tr.html#SP4_4">&#167;4.4</a><br>The Parser - <a href="2-tp.html#SP1_1_6_7">&#167;1.1.6.7</a><br>The Weaver - <a href="3-tw.html#SP1_3_4_1_2_1">&#167;1.3.4.1.2.1</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">lname</span><span class="plain">, </span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">;</span>
&lt;<span class="cwebmacro">If this is the name of a language already known, return that</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Read the language definition file with this name</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::ne</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">language_name</span><span class="plain">, </span><span class="identifier">lname</span><span class="plain">))</span>
<span class="functiontext"><a href="3-em.html#SP2">Errors::fatal_with_text</a></span><span class="plain">(</span>
<span class="string">"definition of programming language '%S' is for something else"</span><span class="plain">, </span><span class="identifier">lname</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">pl</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">If this is the name of a language already known, return that</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="reserved">programming_language</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">lname</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">language_name</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">pl</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read the language definition file with this name</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext"><a href="3-pth.html#SP4">Pathnames::subfolder</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Dialects"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Try P</span> <span class="cwebmacronumber">2.2.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext"><a href="#SP5">Languages::default_directory</a></span><span class="plain">();</span>
&lt;<span class="cwebmacro">Try P</span> <span class="cwebmacronumber">2.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="functiontext"><a href="3-em.html#SP2">Errors::fatal_with_text</a></span><span class="plain">(</span>
<span class="string">"unsupported programming language '%S'"</span><span class="plain">, </span><span class="identifier">lname</span><span class="plain">);</span>
<span class="identifier">pl</span><span class="plain"> = </span><span class="functiontext"><a href="#SP7">Languages::read_definition</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>&#167;2.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Try P</span> <span class="cwebmacronumber">2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S.ildf"</span><span class="plain">, </span><span class="identifier">lname</span><span class="plain">);</span>
<span class="identifier">F</span><span class="plain"> = </span><span class="functiontext"><a href="3-fln.html#SP2">Filenames::in_folder</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-tf.html#SP1">TextFiles::exists</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a> (twice).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>I'm probably showing my age here.
</p>
<pre class="display">
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="functiontext">Languages::default<button class="popup" onclick="togglePopup('usagePopup95')">...<span class="popuptext" id="usagePopup95">Usage of <b>Languages::default</b>:<br>The Reader - <a href="2-tr.html#SP4_2">&#167;4.2</a></span></button></span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="#SP2">Languages::find_by_name</a></span><span class="plain">(</span><span class="identifier">I</span><span class="string">"C"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Languages::show<button class="popup" onclick="togglePopup('usagePopup96')">...<span class="popuptext" id="usagePopup96">Usage of <b>Languages::show</b>:<br>Program Control - <a href="1-pc.html#SP7_2">&#167;7.2</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Inweb can see the following programming language definitions:\n\n"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain">);</span>
<span class="reserved">programming_language</span><span class="plain"> **</span><span class="identifier">sorted_table</span><span class="plain"> =</span>
<span class="functiontext"><a href="2-mmr.html#SP25">Memory::I7_calloc</a></span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, (</span><span class="reserved">int</span><span class="plain">) </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain"> *), </span><span class="constant">CLS_SORTING_MREASON</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="reserved">programming_language</span><span class="plain">) </span><span class="identifier">sorted_table</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">++] = </span><span class="identifier">pl</span><span class="plain">;</span>
<span class="identifier">qsort</span><span class="plain">(</span><span class="identifier">sorted_table</span><span class="plain">, (</span><span class="identifier">size_t</span><span class="plain">) </span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain"> *), </span><span class="functiontext"><a href="#SP4">Languages::compare_names</a></span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">N</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">sorted_table</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S: %S\n"</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">language_name</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">language_details</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext"><a href="2-mmr.html#SP27">Memory::I7_free</a></span><span class="plain">(</span><span class="identifier">sorted_table</span><span class="plain">, </span><span class="constant">CLS_SORTING_MREASON</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">*((</span><span class="reserved">int</span><span class="plain">) </span><span class="reserved">sizeof</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain"> *)));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Languages::compare_names<button class="popup" onclick="togglePopup('usagePopup97')">...<span class="popuptext" id="usagePopup97">Usage of <b>Languages::compare_names</b>:<br><a href="#SP3">&#167;3</a></span></button></span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">tx1</span><span class="plain"> = (*((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> **) </span><span class="identifier">ent1</span><span class="plain">))-&gt;</span><span class="element">language_name</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">tx2</span><span class="plain"> = (*((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> **) </span><span class="identifier">ent2</span><span class="plain">))-&gt;</span><span class="element">language_name</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="4-sm.html#SP19">Str::cmp_insensitive</a></span><span class="plain">(</span><span class="identifier">tx1</span><span class="plain">, </span><span class="identifier">tx2</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>We can read every language in a directory:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Languages::read_definitions<button class="popup" onclick="togglePopup('usagePopup98')">...<span class="popuptext" id="usagePopup98">Usage of <b>Languages::read_definitions</b>:<br>Program Control - <a href="1-pc.html#SP7_2">&#167;7.2</a><br>Configuration - <a href="1-cnf.html#SP2_4">&#167;2.4</a></span></button></span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext"><a href="#SP5">Languages::default_directory</a></span><span class="plain">();</span>
<span class="reserved">scan_directory</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext"><a href="3-drc.html#SP2">Directories::open</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext"><a href="3-drc.html#SP2">Directories::next</a></span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_last_char</a></span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">) != </span><span class="constant">FOLDER_SEPARATOR</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext"><a href="3-fln.html#SP2">Filenames::in_folder</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="functiontext"><a href="#SP7">Languages::read_definition</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="functiontext"><a href="3-drc.html#SP2">Directories::close</a></span><span class="plain">(</span><span class="identifier">D</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Languages::default_directory<button class="popup" onclick="togglePopup('usagePopup99')">...<span class="popuptext" id="usagePopup99">Usage of <b>Languages::default_directory</b>:<br><a href="#SP2_2">&#167;2.2</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="3-pth.html#SP4">Pathnames::subfolder</a></span><span class="plain">(</span><span class="identifier">path_to_inweb</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Languages"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>So, then, languages are defined by files which are read in, and parsed
into the following structure (one per language):
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">language_name</span><span class="plain">; </span><span class="comment"> identifies it: see above</span>
<span class="comment"> then a great many fields set directly in the definition file:</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">file_extension</span><span class="plain">; </span><span class="comment"> by default output to a file whose name has this extension</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">language_details</span><span class="plain">; </span><span class="comment"> brief explanation of what language is</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">supports_namespaces</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line_comment</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">whole_line_comment</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">multiline_comment_open</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">multiline_comment_close</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">string_literal</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">string_literal_escape</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">character_literal</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">character_literal_escape</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">binary_literal_prefix</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">octal_literal_prefix</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">hexadecimal_literal_prefix</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">negative_literal_prefix</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">shebang</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line_marker</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">before_macro_expansion</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">after_macro_expansion</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">start_definition</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">prolong_definition</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">end_definition</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">start_ifdef</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">end_ifdef</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">start_ifndef</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">end_ifndef</span><span class="plain">;</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">type_notation</span><span class="plain">[</span><span class="constant">MAX_ILDF_REGEXP_LENGTH</span><span class="plain">];</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">function_notation</span><span class="plain">[</span><span class="constant">MAX_ILDF_REGEXP_LENGTH</span><span class="plain">];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_disclaimer</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">C_like</span><span class="plain">; </span><span class="comment"> languages with this set have access to extra features</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">reserved_words</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">reserved_word</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">hash_table</span><span class="plain"> </span><span class="identifier">built_in_keywords</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colouring_language_block</span><span class="plain"> *</span><span class="identifier">program</span><span class="plain">; </span><span class="comment"> algorithm for syntax colouring</span>
<span class="constant">METHOD_CALLS</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">programming_language</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure programming_language is accessed in 1/pc, 3/tt, 4/taf, 4/lm, 4/as, 4/tp and here.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>This is a simple one-pass compiler. The <code class="display"><span class="extract">language_reader_state</span></code> provides
the only state preserved as we work through line by line, except of course
that we are also working on the programming language it is <code class="display"><span class="extract">defining</span></code>. The
<code class="display"><span class="extract">current_block</span></code> is the braced block of colouring instructions we are
currently inside.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">language_reader_state</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">defining</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colouring_language_block</span><span class="plain"> *</span><span class="identifier">current_block</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">language_reader_state</span><span class="plain">;</span>
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="functiontext">Languages::read_definition<button class="popup" onclick="togglePopup('usagePopup100')">...<span class="popuptext" id="usagePopup100">Usage of <b>Languages::read_definition</b>:<br><a href="#SP2_2">&#167;2.2</a>, <a href="#SP5">&#167;5</a>, Configuration - <a href="1-cnf.html#SP2_4">&#167;2.4</a></span></button></span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Initialise the language to a plain-text state</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>
<span class="reserved">language_reader_state</span><span class="plain"> </span><span class="identifier">lrs</span><span class="plain">;</span>
<span class="identifier">lrs</span><span class="plain">.</span><span class="element">defining</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">;</span>
<span class="identifier">lrs</span><span class="plain">.</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="functiontext"><a href="4-tf.html#SP5">TextFiles::read</a></span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open programming language definition file"</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext"><a href="#SP8">Languages::read_definition_line</a></span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) &amp;</span><span class="identifier">lrs</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Add method calls to the language</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">pl</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure language_reader_state is private to this section.</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the language to a plain-text state</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">language_name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">file_extension</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">supports_namespaces</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">line_comment</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">whole_line_comment</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_open</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_close</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">string_literal</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">string_literal_escape</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">character_literal</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">character_literal_escape</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">binary_literal_prefix</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">octal_literal_prefix</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">hexadecimal_literal_prefix</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">negative_literal_prefix</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">shebang</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">line_marker</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">before_macro_expansion</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">after_macro_expansion</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">start_definition</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">prolong_definition</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">end_definition</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">start_ifdef</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">end_ifdef</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">start_ifndef</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">end_ifndef</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">C_like</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">suppress_disclaimer</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">type_notation</span><span class="plain">[0] = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">function_notation</span><span class="plain">[0] = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">reserved_words</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">reserved_word</span><span class="plain">);</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">built_in_keywords</span><span class="plain">.</span><span class="element">analysis_hash_initialised</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">program</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="identifier">methods</span><span class="plain"> = </span><span class="functiontext"><a href="2-mth.html#SP3">Methods::new_set</a></span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b>Note that there are two levels of extra privilege: any language calling
itself C-like has functionality for function and structure definitions;
the language whose name is InC gets even more, without having to ask.
</p>
<p class="inwebparagraph">Languages have effect through their method calls, which is how those
extra features are provided. The call to <code class="display"><span class="extract">ACMESupport::add_fallbacks</span></code>
adds generic method calls to give effect to the settings in the definition.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Add method calls to the language</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">C_like</span><span class="plain">) </span><span class="functiontext"><a href="4-cl.html#SP1">CLike::make_c_like</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">language_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"InC"</span><span class="plain">)) </span><span class="functiontext"><a href="4-is.html#SP1">InCSupport::add_features</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">);</span>
<span class="functiontext"><a href="4-as.html#SP1">ACMESupport::add_fallbacks</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>So, then, the above reads the file and feeds it line by line to this:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Languages::read_definition_line<button class="popup" onclick="togglePopup('usagePopup101')">...<span class="popuptext" id="usagePopup101">Usage of <b>Languages::read_definition_line</b>:<br><a href="#SP7">&#167;7</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">v_state</span><span class="plain">) {</span>
<span class="reserved">language_reader_state</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain"> = (</span><span class="reserved">language_reader_state</span><span class="plain"> *) </span><span class="identifier">v_state</span><span class="plain">;</span>
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">defining</span><span class="plain">;</span>
<span class="functiontext"><a href="4-sm.html#SP23">Str::trim_white_space</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">); </span><span class="comment"> ignore trailing space</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; </span><span class="comment"> ignore blank lines</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == </span><span class="character">'#'</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; /* </span><span class="identifier">lines</span><span class="plain"> </span><span class="identifier">opening</span><span class="plain"> </span><span class="identifier">with</span><span class="plain"> |#| </span><span class="identifier">are</span><span class="plain"> </span><span class="identifier">comments</span><span class="plain"> */</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="identifier">current_block</span><span class="plain">) </span>&lt;<span class="cwebmacro">Syntax inside a colouring program</span> <span class="cwebmacronumber">8.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Syntax outside a colouring program</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b>Outside a colouring program, you can do three things: start a program,
declare a reserved keyword, or set a key to a value.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Syntax outside a colouring program</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"colouring {"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">program</span><span class="plain">) </span><span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"duplicate colouring program"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">program</span><span class="plain"> = </span><span class="functiontext"><a href="#SP10">Languages::new_block</a></span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">WHOLE_LINE_CRULE_RUN</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">program</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"keyword (%C+) of (%c+?)"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="#SP14">Languages::reserved</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">), </span><span class="functiontext"><a href="#SP15">Languages::colour</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">tfp</span><span class="plain">), </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"keyword (%C+)"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="#SP14">Languages::reserved</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">, </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">), </span><span class="constant">RESERVED_COLOUR</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) *: *(%c+?)"</span><span class="plain">)) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], *</span><span class="identifier">value</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Name"</span><span class="plain">)) </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">language_name</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Details"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">language_details</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Extension"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">file_extension</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Line Comment"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">line_comment</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Whole Line Comment"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">whole_line_comment</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Multiline Comment Open"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_open</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Multiline Comment Close"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">multiline_comment_close</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"String Literal"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">string_literal</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"String Literal Escape"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">string_literal_escape</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Character Literal"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">character_literal</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Character Literal Escape"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">character_literal_escape</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Binary Literal Prefix"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">binary_literal_prefix</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Octal Literal Prefix"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">octal_literal_prefix</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Hexadecimal Literal Prefix"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">hexadecimal_literal_prefix</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Negative Literal Prefix"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">negative_literal_prefix</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Shebang"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">shebang</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Line Marker"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">line_marker</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Before Named Paragraph Expansion"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">before_macro_expansion</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"After Named Paragraph Expansion"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">after_macro_expansion</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Start Definition"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">start_definition</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Prolong Definition"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">prolong_definition</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"End Definition"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">end_definition</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Start Ifdef"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">start_ifdef</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Start Ifndef"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">start_ifndef</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"End Ifdef"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">end_ifdef</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"End Ifndef"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">end_ifndef</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"C-Like"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">C_like</span><span class="plain"> = </span><span class="functiontext"><a href="#SP16">Languages::boolean</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Suppress Disclaimer"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">suppress_disclaimer</span><span class="plain"> = </span><span class="functiontext"><a href="#SP16">Languages::boolean</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Supports Namespaces"</span><span class="plain">))</span>
<span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">supports_namespaces</span><span class="plain"> = </span><span class="functiontext"><a href="#SP16">Languages::boolean</a></span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Function Declaration Notation"</span><span class="plain">))</span>
<span class="functiontext"><a href="#SP18">Languages::regexp</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">function_notation</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">key</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Type Declaration Notation"</span><span class="plain">))</span>
<span class="functiontext"><a href="#SP18">Languages::regexp</a></span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">type_notation</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"unknown property name before ':'"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"line in language definition illegible"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b>Inside a colouring program, you can close the current block (which may be
the entire program), open a new block to apply to each character or to
runs of a given colour, or give an if-X-then-Y rule:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Syntax inside a colouring program</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"}"</span><span class="plain">)) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">-&gt;</span><span class="element">parent</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"characters {"</span><span class="plain">)) {</span>
<span class="reserved">colouring_rule</span><span class="plain"> *</span><span class="identifier">rule</span><span class="plain"> = </span><span class="functiontext"><a href="#SP12">Languages::new_rule</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain"> =</span>
<span class="functiontext"><a href="#SP10">Languages::new_block</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">, </span><span class="constant">CHARACTERS_CRULE_RUN</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"characters in (%c+) {"</span><span class="plain">)) {</span>
<span class="reserved">colouring_rule</span><span class="plain"> *</span><span class="identifier">rule</span><span class="plain"> = </span><span class="functiontext"><a href="#SP12">Languages::new_rule</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain"> =</span>
<span class="functiontext"><a href="#SP10">Languages::new_block</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">, </span><span class="constant">CHARACTERS_IN_CRULE_RUN</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">-&gt;</span><span class="element">char_set</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"runs of (%c+) {"</span><span class="plain">)) {</span>
<span class="reserved">colouring_rule</span><span class="plain"> *</span><span class="identifier">rule</span><span class="plain"> = </span><span class="functiontext"><a href="#SP12">Languages::new_rule</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain"> = </span><span class="constant">UNQUOTED_COLOUR</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::ne</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">I</span><span class="string">"unquoted"</span><span class="plain">)) </span><span class="identifier">r</span><span class="plain"> = </span><span class="functiontext"><a href="#SP15">Languages::colour</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain"> = </span><span class="functiontext"><a href="#SP10">Languages::new_block</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">, </span><span class="identifier">r</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"instances of (%c+) {"</span><span class="plain">)) {</span>
<span class="reserved">colouring_rule</span><span class="plain"> *</span><span class="identifier">rule</span><span class="plain"> = </span><span class="functiontext"><a href="#SP12">Languages::new_rule</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain"> = </span><span class="functiontext"><a href="#SP10">Languages::new_block</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">, </span><span class="constant">INSTANCES_CRULE_RUN</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">-&gt;</span><span class="element">run_instance</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"matches of (%c+) {"</span><span class="plain">)) {</span>
<span class="reserved">colouring_rule</span><span class="plain"> *</span><span class="identifier">rule</span><span class="plain"> = </span><span class="functiontext"><a href="#SP12">Languages::new_rule</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain"> = </span><span class="functiontext"><a href="#SP10">Languages::new_block</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">, </span><span class="constant">MATCHES_CRULE_RUN</span><span class="plain">);</span>
<span class="functiontext"><a href="#SP18">Languages::regexp</a></span><span class="plain">(</span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">-&gt;</span><span class="element">match_regexp_text</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"brackets in (%c+) {"</span><span class="plain">)) {</span>
<span class="reserved">colouring_rule</span><span class="plain"> *</span><span class="identifier">rule</span><span class="plain"> = </span><span class="functiontext"><a href="#SP12">Languages::new_rule</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain"> = </span><span class="functiontext"><a href="#SP10">Languages::new_block</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">, </span><span class="constant">BRACKETS_CRULE_RUN</span><span class="plain">);</span>
<span class="functiontext"><a href="#SP18">Languages::regexp</a></span><span class="plain">(</span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">-&gt;</span><span class="element">match_regexp_text</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">at</span><span class="plain"> = -1, </span><span class="identifier">quoted</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">)-1; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'"'</span><span class="plain">) </span><span class="identifier">quoted</span><span class="plain"> = </span><span class="identifier">quoted</span><span class="plain">?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">quoted</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\\'</span><span class="plain">)) </span><span class="identifier">i</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">quoted</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'='</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'&gt;'</span><span class="plain">)) </span><span class="identifier">at</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">premiss</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">conclusion</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP25">Str::substr</a></span><span class="plain">(</span><span class="identifier">premiss</span><span class="plain">, </span><span class="functiontext"><a href="4-sm.html#SP10">Str::start</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">), </span><span class="functiontext"><a href="4-sm.html#SP10">Str::at</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">at</span><span class="plain">));</span>
<span class="functiontext"><a href="4-sm.html#SP25">Str::substr</a></span><span class="plain">(</span><span class="identifier">conclusion</span><span class="plain">, </span><span class="functiontext"><a href="4-sm.html#SP10">Str::at</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">at</span><span class="plain">+2), </span><span class="functiontext"><a href="4-sm.html#SP10">Str::end</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">));</span>
<span class="functiontext"><a href="#SP13">Languages::parse_rule</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">conclusion</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">conclusion</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">premiss</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"line in colouring block illegible"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Blocks. </b>These are code blocks of colouring instructions. A block whose <code class="display"><span class="extract">parent</span></code> is <code class="display"><span class="extract">NULL</span></code>
represents a complete program.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">WHOLE_LINE_CRULE_RUN</span><span class="plain"> -1 </span><span class="comment"> This block applies to the whole snippet being coloured</span>
<span class="definitionkeyword">define</span> <span class="constant">CHARACTERS_CRULE_RUN</span><span class="plain"> -2 </span><span class="comment"> This block applies to each character in turn</span>
<span class="definitionkeyword">define</span> <span class="constant">CHARACTERS_IN_CRULE_RUN</span><span class="plain"> -3 </span><span class="comment"> This block applies to each character from a set in turn</span>
<span class="definitionkeyword">define</span> <span class="constant">INSTANCES_CRULE_RUN</span><span class="plain"> -4 </span><span class="comment"> This block applies to each instance in turn</span>
<span class="definitionkeyword">define</span> <span class="constant">MATCHES_CRULE_RUN</span><span class="plain"> -5 </span><span class="comment"> This block applies to each match against a regexp in turn</span>
<span class="definitionkeyword">define</span> <span class="constant">BRACKETS_CRULE_RUN</span><span class="plain"> -6 </span><span class="comment"> This block applies to bracketed subexpressions in a regexp</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colouring_language_block</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">rules</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">colouring_rule</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colouring_language_block</span><span class="plain"> *</span><span class="identifier">parent</span><span class="plain">; </span><span class="comment"> or <code class="display"><span class="extract">NULL</span></code> for the topmost one</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">run</span><span class="plain">; </span><span class="comment"> one of the <code class="display"><span class="extract">*_CRULE_RUN</span></code> values, or else a colour</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">run_instance</span><span class="plain">; </span><span class="comment"> used only for <code class="display"><span class="extract">INSTANCES_CRULE_RUN</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">char_set</span><span class="plain">; </span><span class="comment"> used only for <code class="display"><span class="extract">CHARACTERS_IN_CRULE_RUN</span></code></span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">match_regexp_text</span><span class="plain">[</span><span class="constant">MAX_ILDF_REGEXP_LENGTH</span><span class="plain">]; </span><span class="comment"> used for <code class="display"><span class="extract">MATCHES_CRULE_RUN</span></code>, <code class="display"><span class="extract">BRACKETS_CRULE_RUN</span></code></span>
<span class="comment"> workspace during painting</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain">; </span><span class="comment"> of a regular expression</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">colouring_language_block</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure colouring_language_block is accessed in 4/tp and here.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p>
<pre class="display">
<span class="reserved">colouring_language_block</span><span class="plain"> *</span><span class="functiontext">Languages::new_block<button class="popup" onclick="togglePopup('usagePopup102')">...<span class="popuptext" id="usagePopup102">Usage of <b>Languages::new_block</b>:<br><a href="#SP8_1">&#167;8.1</a>, <a href="#SP8_2">&#167;8.2</a>, <a href="#SP13_2">&#167;13.2</a></span></button></span><span class="plain">(</span><span class="reserved">colouring_language_block</span><span class="plain"> *</span><span class="identifier">within</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain">) {</span>
<span class="reserved">colouring_language_block</span><span class="plain"> *</span><span class="identifier">block</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">colouring_language_block</span><span class="plain">);</span>
<span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">rules</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">colouring_rule</span><span class="plain">);</span>
<span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">parent</span><span class="plain"> = </span><span class="identifier">within</span><span class="plain">;</span>
<span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">run</span><span class="plain"> = </span><span class="identifier">r</span><span class="plain">;</span>
<span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">run_instance</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">char_set</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">match_regexp_text</span><span class="plain">[0] = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">block</span><span class="plain">-&gt;</span><span class="element">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">block</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Colouring Rules. </b>Each individual rule has the form: if a premiss, then a conclusion. It will be
applied to a snippet of text, and the premiss can test that, together with a
little context before it (where available).
</p>
<p class="inwebparagraph">Note that rules can be unconditional, in that the premiss always passes.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">NOT_A_RULE_PREFIX</span><span class="plain"> </span><span class="constant">1</span><span class="plain"> </span><span class="comment"> this isn't a prefix rule</span>
<span class="definitionkeyword">define</span> <span class="constant">UNSPACED_RULE_PREFIX</span><span class="plain"> </span><span class="constant">2</span><span class="plain"> </span><span class="comment"> for <code class="display"><span class="extract">prefix P</span></code></span>
<span class="definitionkeyword">define</span> <span class="constant">SPACED_RULE_PREFIX</span><span class="plain"> </span><span class="constant">3</span><span class="plain"> </span><span class="comment"> for <code class="display"><span class="extract">spaced prefix P</span></code></span>
<span class="definitionkeyword">define</span> <span class="constant">OPTIONALLY_SPACED_RULE_PREFIX</span><span class="plain"> </span><span class="constant">4</span><span class="plain"> </span><span class="comment"> for <code class="display"><span class="extract">optionally spaced prefix P</span></code></span>
<span class="definitionkeyword">define</span> <span class="constant">UNSPACED_RULE_SUFFIX</span><span class="plain"> </span><span class="constant">5</span><span class="plain"> </span><span class="comment"> for <code class="display"><span class="extract">suffix P</span></code></span>
<span class="definitionkeyword">define</span> <span class="constant">SPACED_RULE_SUFFIX</span><span class="plain"> </span><span class="constant">6</span><span class="plain"> </span><span class="comment"> for <code class="display"><span class="extract">spaced suffix P</span></code></span>
<span class="definitionkeyword">define</span> <span class="constant">OPTIONALLY_SPACED_RULE_SUFFIX</span><span class="plain"> </span><span class="constant">7</span><span class="plain"> </span><span class="comment"> for <code class="display"><span class="extract">optionally spaced suffix P</span></code></span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_ILDF_REGEXP_LENGTH</span><span class="plain"> </span><span class="constant">64</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colouring_rule</span><span class="plain"> {</span>
<span class="comment"> the premiss:</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sense</span><span class="plain">; </span><span class="comment"> <code class="display"><span class="extract">FALSE</span></code> to negate the condition</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match_colour</span><span class="plain">; </span><span class="comment"> for <code class="display"><span class="extract">coloured C</span></code>, or else <code class="display"><span class="extract">NOT_A_COLOUR</span></code></span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match_keyword_of_colour</span><span class="plain">; </span><span class="comment"> for <code class="display"><span class="extract">keyword C</span></code>, or else <code class="display"><span class="extract">NOT_A_COLOUR</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">match_text</span><span class="plain">; </span><span class="comment"> or length 0 to mean "anything"</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match_prefix</span><span class="plain">; </span><span class="comment"> one of the <code class="display"><span class="extract">*_RULE_PREFIX</span></code> values above</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">match_regexp_text</span><span class="plain">[</span><span class="constant">MAX_ILDF_REGEXP_LENGTH</span><span class="plain">];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">number</span><span class="plain">; </span><span class="comment"> for <code class="display"><span class="extract">number N</span></code> rules; 0 for others</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">number_of</span><span class="plain">; </span><span class="comment"> for <code class="display"><span class="extract">number N of M</span></code> rules; 0 for others</span>
<span class="comment"> the conclusion:</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colouring_language_block</span><span class="plain"> *</span><span class="identifier">execute_block</span><span class="plain">; </span><span class="comment"> or <code class="display"><span class="extract">NULL</span></code>, in which case...</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">set_to_colour</span><span class="plain">; </span><span class="comment"> ...paint the snippet in this colour</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">set_prefix_to_colour</span><span class="plain">; </span><span class="comment"> ...also paint this (same for suffix)</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">debug</span><span class="plain">; </span><span class="comment"> ...or print debugging text to console</span>
<span class="comment"> workspace during painting</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">fix_position</span><span class="plain">; </span><span class="comment"> where the prefix or suffix started</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain">; </span><span class="comment"> of a regular expression</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">colouring_rule</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure colouring_rule is accessed in 4/tp and here.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="reserved">colouring_rule</span><span class="plain"> *</span><span class="functiontext">Languages::new_rule<button class="popup" onclick="togglePopup('usagePopup103')">...<span class="popuptext" id="usagePopup103">Usage of <b>Languages::new_rule</b>:<br><a href="#SP8_2">&#167;8.2</a>, <a href="#SP13">&#167;13</a></span></button></span><span class="plain">(</span><span class="reserved">colouring_language_block</span><span class="plain"> *</span><span class="identifier">within</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">within</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"rule outside block"</span><span class="plain">);</span>
<span class="reserved">colouring_rule</span><span class="plain"> *</span><span class="identifier">rule</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">colouring_rule</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">rule</span><span class="plain">, </span><span class="reserved">colouring_rule</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">-&gt;</span><span class="element">rules</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">sense</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_colour</span><span class="plain"> = </span><span class="constant">NOT_A_COLOUR</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_prefix</span><span class="plain"> = </span><span class="constant">NOT_A_RULE_PREFIX</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_keyword_of_colour</span><span class="plain"> = </span><span class="constant">NOT_A_COLOUR</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_regexp_text</span><span class="plain">[0] = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">number</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">number_of</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">set_to_colour</span><span class="plain"> = </span><span class="constant">NOT_A_COLOUR</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">set_prefix_to_colour</span><span class="plain"> = </span><span class="constant">NOT_A_COLOUR</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">debug</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">fix_position</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rule</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Languages::parse_rule<button class="popup" onclick="togglePopup('usagePopup104')">...<span class="popuptext" id="usagePopup104">Usage of <b>Languages::parse_rule</b>:<br><a href="#SP8_2">&#167;8.2</a></span></button></span><span class="plain">(</span><span class="reserved">language_reader_state</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">premiss</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">action</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
<span class="reserved">colouring_rule</span><span class="plain"> *</span><span class="identifier">rule</span><span class="plain"> = </span><span class="functiontext"><a href="#SP12">Languages::new_rule</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">);</span>
<span class="functiontext"><a href="4-sm.html#SP23">Str::trim_white_space</a></span><span class="plain">(</span><span class="identifier">premiss</span><span class="plain">); </span><span class="functiontext"><a href="4-sm.html#SP23">Str::trim_white_space</a></span><span class="plain">(</span><span class="identifier">action</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Parse the premiss</span> <span class="cwebmacronumber">13.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Parse the conclusion</span> <span class="cwebmacronumber">13.2</span>&gt;<span class="plain">;</span>
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP13_1"></a><b>&#167;13.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Parse the premiss</span> <span class="cwebmacronumber">13.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"not (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">sense</span><span class="plain"> = (</span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">sense</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
<span class="functiontext"><a href="4-sm.html#SP15">Str::clear</a></span><span class="plain">(</span><span class="identifier">premiss</span><span class="plain">); </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"number (%d+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">number</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP7">Str::atoi</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="constant">0</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"number (%d+) of (%d+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">number</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP7">Str::atoi</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="constant">0</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">number_of</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP7">Str::atoi</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="constant">0</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"keyword of (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_keyword_of_colour</span><span class="plain"> = </span><span class="functiontext"><a href="#SP15">Languages::colour</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"keyword"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"ambiguous: make it keyword of !reserved or \"keyword\""</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"prefix (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_prefix</span><span class="plain"> = </span><span class="constant">UNSPACED_RULE_PREFIX</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"matching (%c+)"</span><span class="plain">)) {</span>
<span class="functiontext"><a href="#SP18">Languages::regexp</a></span><span class="plain">(</span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_regexp_text</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"spaced prefix (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_prefix</span><span class="plain"> = </span><span class="constant">SPACED_RULE_PREFIX</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"optionally spaced prefix (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_prefix</span><span class="plain"> = </span><span class="constant">OPTIONALLY_SPACED_RULE_PREFIX</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"suffix (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_prefix</span><span class="plain"> = </span><span class="constant">UNSPACED_RULE_SUFFIX</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"spaced suffix (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_prefix</span><span class="plain"> = </span><span class="constant">SPACED_RULE_SUFFIX</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"optionally spaced suffix (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_prefix</span><span class="plain"> = </span><span class="constant">OPTIONALLY_SPACED_RULE_SUFFIX</span><span class="plain">;</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"coloured (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_colour</span><span class="plain"> = </span><span class="functiontext"><a href="#SP15">Languages::colour</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">premiss</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">match_text</span><span class="plain"> = </span><span class="functiontext"><a href="#SP17">Languages::text</a></span><span class="plain">(</span><span class="identifier">premiss</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP13_2"></a><b>&#167;13.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Parse the conclusion</span> <span class="cwebmacronumber">13.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">action</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"{"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain"> =</span>
<span class="functiontext"><a href="#SP10">Languages::new_block</a></span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain">, </span><span class="constant">WHOLE_LINE_CRULE_RUN</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">current_block</span><span class="plain"> = </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">execute_block</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">action</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(!%c+) on prefix"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">set_prefix_to_colour</span><span class="plain"> = </span><span class="functiontext"><a href="#SP15">Languages::colour</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">action</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(!%c+) on suffix"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">set_prefix_to_colour</span><span class="plain"> = </span><span class="functiontext"><a href="#SP15">Languages::colour</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">action</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(!%c+) on both"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">set_to_colour</span><span class="plain"> = </span><span class="functiontext"><a href="#SP15">Languages::colour</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">set_prefix_to_colour</span><span class="plain"> = </span><span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">set_to_colour</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">action</span><span class="plain">) == </span><span class="character">'!'</span><span class="plain">) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">set_to_colour</span><span class="plain"> = </span><span class="functiontext"><a href="#SP15">Languages::colour</a></span><span class="plain">(</span><span class="identifier">action</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">action</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"debug"</span><span class="plain">)) {</span>
<span class="identifier">rule</span><span class="plain">-&gt;</span><span class="element">debug</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"action after '=&gt;' illegible"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. Reserved words. </b>Note that these can come in any colour, though usually it's <code class="display"><span class="extract">!reserved</span></code>.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">reserved_word</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">word</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">colour</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">reserved_word</span><span class="plain">;</span>
<span class="reserved">reserved_word</span><span class="plain"> *</span><span class="functiontext">Languages::reserved<button class="popup" onclick="togglePopup('usagePopup105')">...<span class="popuptext" id="usagePopup105">Usage of <b>Languages::reserved</b>:<br><a href="#SP8_1">&#167;8.1</a></span></button></span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">,</span>
<span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
<span class="reserved">reserved_word</span><span class="plain"> *</span><span class="identifier">rw</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">rw</span><span class="plain">, </span><span class="reserved">reserved_word</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">reserved_words</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">rw</span><span class="plain">-&gt;</span><span class="element">word</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"duplicate reserved word"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">rw</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">reserved_word</span><span class="plain">);</span>
<span class="identifier">rw</span><span class="plain">-&gt;</span><span class="element">word</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">rw</span><span class="plain">-&gt;</span><span class="element">colour</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">rw</span><span class="plain">, </span><span class="reserved">reserved_word</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">reserved_words</span><span class="plain">);</span>
<span class="functiontext"><a href="3-ta.html#SP10">Analyser::mark_reserved_word</a></span><span class="plain">(&amp;(</span><span class="identifier">pl</span><span class="plain">-&gt;</span><span class="element">built_in_keywords</span><span class="plain">), </span><span class="identifier">rw</span><span class="plain">-&gt;</span><span class="element">word</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rw</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure reserved_word is accessed in 4/as and here.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. Expressions. </b>Language definition files have three types of data: colours, booleans, and
text. Colours first. Note that there are two pseudo-colours used above,
but which are not expressible in the syntax of this file.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">DEFINITION_COLOUR</span><span class="plain"> </span><span class="character">'d'</span>
<span class="definitionkeyword">define</span> <span class="constant">FUNCTION_COLOUR</span><span class="plain"> </span><span class="character">'f'</span>
<span class="definitionkeyword">define</span> <span class="constant">RESERVED_COLOUR</span><span class="plain"> </span><span class="character">'r'</span>
<span class="definitionkeyword">define</span> <span class="constant">ELEMENT_COLOUR</span><span class="plain"> </span><span class="character">'e'</span>
<span class="definitionkeyword">define</span> <span class="constant">IDENTIFIER_COLOUR</span><span class="plain"> </span><span class="character">'i'</span>
<span class="definitionkeyword">define</span> <span class="constant">CHAR_LITERAL_COLOUR</span><span class="plain"> </span><span class="character">'c'</span>
<span class="definitionkeyword">define</span> <span class="constant">CONSTANT_COLOUR</span><span class="plain"> </span><span class="character">'n'</span>
<span class="definitionkeyword">define</span> <span class="constant">STRING_COLOUR</span><span class="plain"> </span><span class="character">'s'</span>
<span class="definitionkeyword">define</span> <span class="constant">PLAIN_COLOUR</span><span class="plain"> </span><span class="character">'p'</span>
<span class="definitionkeyword">define</span> <span class="constant">EXTRACT_COLOUR</span><span class="plain"> </span><span class="character">'x'</span>
<span class="definitionkeyword">define</span> <span class="constant">COMMENT_COLOUR</span><span class="plain"> </span><span class="character">'!'</span>
<span class="definitionkeyword">define</span> <span class="constant">NEWLINE_COLOUR</span><span class="plain"> </span><span class="character">'\n'</span>
<span class="definitionkeyword">define</span> <span class="constant">NOT_A_COLOUR</span><span class="plain"> </span><span class="character">' '</span>
<span class="definitionkeyword">define</span> <span class="constant">UNQUOTED_COLOUR</span><span class="plain"> </span><span class="character">'_'</span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Languages::colour<button class="popup" onclick="togglePopup('usagePopup106')">...<span class="popuptext" id="usagePopup106">Usage of <b>Languages::colour</b>:<br><a href="#SP8_1">&#167;8.1</a>, <a href="#SP8_2">&#167;8.2</a>, <a href="#SP13_1">&#167;13.1</a>, <a href="#SP13_2">&#167;13.2</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_first_char</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) != </span><span class="character">'!'</span><span class="plain">) {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"colour names must begin with !"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">PLAIN_COLOUR</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!string"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">STRING_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!function"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FUNCTION_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!definition"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">DEFINITION_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!reserved"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">RESERVED_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!element"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">ELEMENT_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!identifier"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">IDENTIFIER_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!character"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CHAR_LITERAL_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!constant"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">CONSTANT_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!plain"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">PLAIN_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!extract"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">EXTRACT_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!comment"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">COMMENT_COLOUR</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"no such !colour"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">PLAIN_COLOUR</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>A boolean must be written as <code class="display"><span class="extract">true</span></code> or <code class="display"><span class="extract">false</span></code>.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Languages::boolean<button class="popup" onclick="togglePopup('usagePopup107')">...<span class="popuptext" id="usagePopup107">Usage of <b>Languages::boolean</b>:<br><a href="#SP8_1">&#167;8.1</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"true"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"false"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span><span class="string">"must be true or false"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>In text, <code class="display"><span class="extract">\n</span></code> represents a newline, <code class="display"><span class="extract">\s</span></code> a space and <code class="display"><span class="extract">\t</span></code> a tab. Spaces
can be given in the ordinary way inside a text in any case. <code class="display"><span class="extract">\\</span></code> is a
literal backslash.
</p>
<pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Languages::text<button class="popup" onclick="togglePopup('usagePopup108')">...<span class="popuptext" id="usagePopup108">Usage of <b>Languages::text</b>:<br><a href="#SP8_1">&#167;8.1</a>, <a href="#SP8_2">&#167;8.2</a>, <a href="#SP13_1">&#167;13.1</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP2">Str::new</a></span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bareword</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">spaced</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">from</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">to</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">)-1;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">to</span><span class="plain"> &gt; </span><span class="identifier">from</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">) == </span><span class="character">'"'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">) == </span><span class="character">'"'</span><span class="plain">)) {</span>
<span class="identifier">bareword</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span><span class="identifier">from</span><span class="plain">++; </span><span class="identifier">to</span><span class="plain">--;</span>
<span class="plain">}</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">from</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">&lt;=</span><span class="identifier">to</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) </span><span class="identifier">spaced</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\\'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'n'</span><span class="plain">)) {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="character">'\n'</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\\'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'s'</span><span class="plain">)) {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="character">' '</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\\'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'t'</span><span class="plain">)) {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="character">'\t'</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\\'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'\\'</span><span class="plain">)) {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="character">'\\'</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bareword</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\\'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'"'</span><span class="plain">)) {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="character">'"'</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bareword</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'"'</span><span class="plain">)) {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span>
<span class="string">"backslash needed before internal double-quotation mark"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bareword</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'!'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">i</span><span class="plain"> == </span><span class="identifier">from</span><span class="plain">)) {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span>
<span class="string">"a literal starting with ! must be in double-quotation marks"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bareword</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'/'</span><span class="plain">)) {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span>
<span class="string">"forward slashes can only be used in quoted strings"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bareword</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'"'</span><span class="plain">)) {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span>
<span class="string">"double-quotation marks can only be used in quoted strings"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bareword</span><span class="plain">) &amp;&amp; (</span><span class="identifier">spaced</span><span class="plain">) &amp;&amp; (</span><span class="identifier">allow</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"'%S' seems to be literal text, but if so it needs double-quotation marks"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file_S</a></span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bareword</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"both"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"brackets"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"characters"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"coloured"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"colouring"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"debug"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"false"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"in"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"instances"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"keyword"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"matches"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"matching"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"not"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"of"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"on"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"optionally"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"prefix"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"runs"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"spaced"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"suffix"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"true"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP18">Str::eq</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"unquoted"</span><span class="plain">)) </span><span class="identifier">rw</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rw</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"'%S' is a reserved word, so you should put it in double-quotation marks"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">);</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file_S</a></span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>And regular expressions.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Languages::regexp<button class="popup" onclick="togglePopup('usagePopup109')">...<span class="popuptext" id="usagePopup109">Usage of <b>Languages::regexp</b>:<br><a href="#SP8_1">&#167;8.1</a>, <a href="#SP8_2">&#167;8.2</a>, <a href="#SP13_1">&#167;13.1</a></span></button></span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">write_to</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">write_to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no buffer"</span><span class="plain">);</span>
<span class="identifier">write_to</span><span class="plain">[0] = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">to</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">)-1, </span><span class="identifier">x</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">to</span><span class="plain"> &gt; </span><span class="identifier">from</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">) == </span><span class="character">'/'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">) == </span><span class="character">'/'</span><span class="plain">)) {</span>
<span class="identifier">from</span><span class="plain">++; </span><span class="identifier">to</span><span class="plain">--;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">from</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">&lt;=</span><span class="identifier">to</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\\'</span><span class="plain">) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">w</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w</span><span class="plain"> == </span><span class="character">'\\'</span><span class="plain">) {</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="identifier">w</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w</span><span class="plain"> == </span><span class="character">'d'</span><span class="plain">) {</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_escape_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="character">'d'</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w</span><span class="plain"> == </span><span class="character">'t'</span><span class="plain">) {</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_escape_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="character">'t'</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w</span><span class="plain"> == </span><span class="character">'s'</span><span class="plain">) {</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="character">' '</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w</span><span class="plain"> == </span><span class="character">'S'</span><span class="plain">) {</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_escape_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="character">'C'</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w</span><span class="plain"> == </span><span class="character">'"'</span><span class="plain">) {</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_escape_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="character">'q'</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_escape_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="identifier">w</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'.'</span><span class="plain">) {</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_escape_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="character">'c'</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'%'</span><span class="plain">) {</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_escape_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="character">'%'</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">x</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span>
<span class="string">"the expression to match must be in slashes '/'"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> &gt;= </span><span class="constant">MAX_ILDF_REGEXP_LENGTH</span><span class="plain">)</span>
<span class="functiontext"><a href="3-em.html#SP5">Errors::in_text_file</a></span><span class="plain">(</span>
<span class="string">"the expression to match is too long"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Languages::add_to_regexp<button class="popup" onclick="togglePopup('usagePopup110')">...<span class="popuptext" id="usagePopup110">Usage of <b>Languages::add_to_regexp</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">write_to</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="constant">MAX_ILDF_REGEXP_LENGTH</span><span class="plain">) </span><span class="identifier">write_to</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">++] = </span><span class="identifier">c</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Languages::add_escape_to_regexp<button class="popup" onclick="togglePopup('usagePopup111')">...<span class="popuptext" id="usagePopup111">Usage of <b>Languages::add_escape_to_regexp</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">write_to</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
<span class="identifier">i</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="character">'%'</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain"> = </span><span class="functiontext"><a href="#SP18">Languages::add_to_regexp</a></span><span class="plain">(</span><span class="identifier">write_to</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 4: Languages.)</i></li><li><a href="4-taf.html">Continue with 'Types and Functions'</a></li></ul><hr class="tocbar">
<!--End of weave-->
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
</main>
</body>
</html>