<!--Weave of 'Tree Verification' generated by Inweb-->
<divclass="breadcrumbs">
<ulclass="crumbs"><li><ahref="../index.html">Home</a></li><li><ahref="../compiler.html">Shared Modules</a></li><li><ahref="index.html">syntax</a></li><li><ahref="index.html#2">Chapter 2: The Parse Tree</a></li><li><b>Tree Verification</b></li></ul></div>
<pclass="purpose">Did we go wrong anywhere? This section is purely defensive, and tests whether Inform contains bugs of a kind which lead to malformed syntax trees: that should never happen even if the source text being compiled is a dumpster fire.</p>
<spanclass="reserved-syntax">void</span><spanclass="plain-syntax"></span><spanclass="function-syntax">VerifyTree::verify_integrity_below</span><buttonclass="popup"onclick="togglePopup('usagePopup1')"><spanclass="comment-syntax">?</span><spanclass="popuptext"id="usagePopup1">Usage of <spanclass="code-font"><spanclass="function-syntax">VerifyTree::verify_integrity_below</span></span>:<br/><ahref="2-tv.html#SP3">§3</a></span></button><spanclass="plain-syntax">(</span><spanclass="reserved-syntax">parse_node</span><spanclass="plain-syntax"> *</span><spanclass="identifier-syntax">p</span><spanclass="plain-syntax">) {</span>
<spanclass="reserved-syntax">void</span><spanclass="plain-syntax"></span><spanclass="function-syntax">VerifyTree::verify_integrity_r</span><buttonclass="popup"onclick="togglePopup('usagePopup2')"><spanclass="comment-syntax">?</span><spanclass="popuptext"id="usagePopup2">Usage of <spanclass="code-font"><spanclass="function-syntax">VerifyTree::verify_integrity_r</span></span>:<br/><ahref="2-tv.html#SP1">§1</a></span></button><spanclass="plain-syntax">(</span><spanclass="reserved-syntax">parse_node</span><spanclass="plain-syntax"> *</span><spanclass="identifier-syntax">p</span><spanclass="plain-syntax">,</span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">LOG</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"Cycle found in parse tree, found %s from:\n$P"</span><spanclass="plain-syntax">, </span><spanclass="identifier-syntax">way</span><spanclass="plain-syntax">, </span><spanclass="identifier-syntax">from</span><spanclass="plain-syntax">);</span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">internal_error</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"Cycle found in parse tree"</span><spanclass="plain-syntax">);</span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">internal_error</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"Link broken in parse tree"</span><spanclass="plain-syntax">);</span>
<pclass="commentary firstcommentary"><aid="SP3"></a><b>§3. Verify structure. </b>The parse tree is a complicated structure, arbitrarily wide and deep, and
containing many different node types, each subject to its own rules of usage.
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">internal_error</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"Root of parse tree NULL"</span><spanclass="plain-syntax">);</span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">internal_error</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"Parse tree broken"</span><spanclass="plain-syntax">);</span>
<spanclass="plain-syntax"> }</span>
<spanclass="plain-syntax">}</span>
</pre>
<pclass="commentary firstcommentary"><aid="SP4"></a><b>§4. </b>Note that on every call to the following routine, (i) <spanclass="extract"><spanclass="extract-syntax">p</span></span> is a valid
parse node and (ii) either <spanclass="extract"><spanclass="extract-syntax">p</span></span> is the tree root, in which case <spanclass="extract"><spanclass="extract-syntax">parent</span></span> is
<spanclass="extract"><spanclass="extract-syntax">NULL</span></span>, or <spanclass="extract"><spanclass="extract-syntax">parent</span></span> is the unique node having <spanclass="extract"><spanclass="extract-syntax">p</span></span> (or an alternative to <spanclass="extract"><spanclass="extract-syntax">p</span></span>)
<spanclass="plain-syntax"></span><spanclass="reserved-syntax">if</span><spanclass="plain-syntax"> (</span><spanclass="identifier-syntax">metadata</span><spanclass="plain-syntax"> == </span><spanclass="identifier-syntax">NULL</span><spanclass="plain-syntax">) </span><spanclass="identifier-syntax">internal_error</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"broken tree should have been reported"</span><spanclass="plain-syntax">);</span>
<spanclass="plain-syntax"></span><spanclass="named-paragraph-container code-font"><ahref="2-tv.html#SP4_1"class="named-paragraph-link"><spanclass="named-paragraph">Check rule (1) of the invariant</span><spanclass="named-paragraph-number">4.1</span></a></span><spanclass="plain-syntax">;</span>
<spanclass="plain-syntax"></span><spanclass="named-paragraph-container code-font"><ahref="2-tv.html#SP4_2"class="named-paragraph-link"><spanclass="named-paragraph">Check rule (2) of the invariant</span><spanclass="named-paragraph-number">4.2</span></a></span><spanclass="plain-syntax">;</span>
<spanclass="plain-syntax"></span><spanclass="reserved-syntax">if</span><spanclass="plain-syntax"> (</span><spanclass="identifier-syntax">parent</span><spanclass="plain-syntax">) </span><spanclass="named-paragraph-container code-font"><ahref="2-tv.html#SP4_3"class="named-paragraph-link"><spanclass="named-paragraph">Check rule (3) of the invariant</span><spanclass="named-paragraph-number">4.3</span></a></span><spanclass="plain-syntax">;</span>
<spanclass="plain-syntax"></span><spanclass="named-paragraph-container code-font"><ahref="2-tv.html#SP4_4"class="named-paragraph-link"><spanclass="named-paragraph">Check rule (4) of the invariant</span><spanclass="named-paragraph-number">4.4</span></a></span><spanclass="plain-syntax">;</span>
<pclass="commentary firstcommentary"><aid="SP4_1"></a><b>§4.1. </b>Rule (1): no INVALID nodes.
</p>
<pclass="commentary"><spanclass="named-paragraph-container code-font"><spanclass="named-paragraph-defn">Check rule (1) of the invariant</span><spanclass="named-paragraph-number">4.1</span></span><spanclass="comment-syntax"> =</span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">LOG</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"N%d is $N, which is not allowed except temporarily\n"</span><spanclass="plain-syntax">,</span>
<spanclass="plain-syntax"></span><spanclass="named-paragraph-container code-font"><ahref="2-tv.html#SP4_1_1"class="named-paragraph-link"><spanclass="named-paragraph">Log this invariant failure</span><spanclass="named-paragraph-number">4.1.1</span></a></span>
<spanclass="plain-syntax"> }</span>
</pre>
<ulclass="endnotetexts"><li>This code is used in <ahref="2-tv.html#SP4">§4</a>.</li></ul>
<pclass="commentary firstcommentary"><aid="SP4_2"></a><b>§4.2. </b>Rule (2): all annotations must be legal for the given node type.
</p>
<pclass="commentary"><spanclass="named-paragraph-container code-font"><spanclass="named-paragraph-defn">Check rule (2) of the invariant</span><spanclass="named-paragraph-number">4.2</span></span><spanclass="comment-syntax"> =</span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">LOG</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"N%d is $N, which is not allowed to have annotation %d\n"</span><spanclass="plain-syntax">,</span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">LOG</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"Node %08x, ann %d\n"</span><spanclass="plain-syntax">, </span><spanclass="identifier-syntax">t</span><spanclass="plain-syntax">, </span><spanclass="identifier-syntax">pna</span><spanclass="plain-syntax">-></span><spanclass="element-syntax">annotation_id</span><spanclass="plain-syntax">);</span>
<spanclass="plain-syntax"></span><spanclass="named-paragraph-container code-font"><ahref="2-tv.html#SP4_1_1"class="named-paragraph-link"><spanclass="named-paragraph">Log this invariant failure</span><spanclass="named-paragraph-number">4.1.1</span></a></span>
<spanclass="plain-syntax"> }</span>
</pre>
<ulclass="endnotetexts"><li>This code is used in <ahref="2-tv.html#SP4">§4</a>.</li></ul>
<pclass="commentary firstcommentary"><aid="SP4_3"></a><b>§4.3. </b>Rule (3): can this combination of parent and child exist?
</p>
<pclass="commentary"><spanclass="named-paragraph-container code-font"><spanclass="named-paragraph-defn">Check rule (3) of the invariant</span><spanclass="named-paragraph-number">4.3</span></span><spanclass="comment-syntax"> =</span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">LOG</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"N%d is $N: should not be a child of $N\n"</span><spanclass="plain-syntax">,</span>
<spanclass="plain-syntax"></span><spanclass="named-paragraph-container code-font"><ahref="2-tv.html#SP4_1_1"class="named-paragraph-link"><spanclass="named-paragraph">Log this invariant failure</span><spanclass="named-paragraph-number">4.1.1</span></a></span>
<spanclass="plain-syntax"> }</span>
</pre>
<ulclass="endnotetexts"><li>This code is used in <ahref="2-tv.html#SP4">§4</a>.</li></ul>
<pclass="commentary firstcommentary"><aid="SP4_4"></a><b>§4.4. </b>Rule (4): The number of children has to be within the given extrema.
</p>
<pclass="commentary"><spanclass="named-paragraph-container code-font"><spanclass="named-paragraph-defn">Check rule (4) of the invariant</span><spanclass="named-paragraph-number">4.4</span></span><spanclass="comment-syntax"> =</span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">LOG</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"N%d has %d children, but min for $N is %d:\n"</span><spanclass="plain-syntax">,</span>
<spanclass="plain-syntax"></span><spanclass="named-paragraph-container code-font"><ahref="2-tv.html#SP4_1_1"class="named-paragraph-link"><spanclass="named-paragraph">Log this invariant failure</span><spanclass="named-paragraph-number">4.1.1</span></a></span>
<spanclass="plain-syntax"></span><spanclass="identifier-syntax">LOG</span><spanclass="plain-syntax">(</span><spanclass="string-syntax">"N%d has %d children, but max for $N is %d:\n"</span><spanclass="plain-syntax">,</span>
<spanclass="plain-syntax"></span><spanclass="named-paragraph-container code-font"><ahref="2-tv.html#SP4_1_1"class="named-paragraph-link"><spanclass="named-paragraph">Log this invariant failure</span><spanclass="named-paragraph-number">4.1.1</span></a></span>
<spanclass="plain-syntax"> }</span>
</pre>
<ulclass="endnotetexts"><li>This code is used in <ahref="2-tv.html#SP4">§4</a>.</li></ul>
<ulclass="endnotetexts"><li>This code is used in <ahref="2-tv.html#SP4_1">§4.1</a>, <ahref="2-tv.html#SP4_2">§4.2</a>, <ahref="2-tv.html#SP4_3">§4.3</a>, <ahref="2-tv.html#SP4_4">§4.4</a> (twice).</li></ul>