diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2022-04-17 18:00:17 -0400 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2022-04-17 18:03:42 -0400 |
| commit | a1b60a18922e578a97e50efe1a2e29863b6f8d92 (patch) | |
| tree | 641e154685203b4899d7cffc0827ca816c57578f /docs/spec/grammar.html | |
| parent | 6553132505093fce4b7a3b2c95ad7d945d97e168 (diff) | |
Fix the spec's treatment of multiple bodies and predicates
Diffstat (limited to 'docs/spec/grammar.html')
| -rw-r--r-- | docs/spec/grammar.html | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/docs/spec/grammar.html b/docs/spec/grammar.html index 19425e06..139a5dd4 100644 --- a/docs/spec/grammar.html +++ b/docs/spec/grammar.html @@ -86,14 +86,15 @@ <span class='Function'>|</span> <span class='Function'>FuncName</span> <span class='String'>"˜"</span><span class='Head'>?</span> <span class='String'>"⁼"</span> <span class='Function'>|</span> <span class='Value'>lhsComp</span> </pre> -<p>A block is written with braces. It contains bodies, which are lists of statements, separated by semicolons. Multiple bodies can handle different cases, as determined by headers and predicates. A header is written before its body with a separating colon, and an expression other than the last in a body can be made into a predicate by following it with the separator-like <code><span class='Head'>?</span></code>. A block can have any number of bodies with headers. After these there can be bodies without headers—up to one for an immediate block and up to two for a block with arguments. If a block with arguments has one such body, it's ambivalent, but two of them refer to the monadic and dyadic cases.</p> +<p>A block is written with braces. It contains bodies, which are lists of statements, separated by semicolons. Multiple bodies can handle different cases, as determined by headers and predicates. A header is written before its body with a separating colon, and an expression other than the last in a body can be made into a predicate by following it with the separator-like <code><span class='Head'>?</span></code>.</p> +<p>An <code><span class='Function'>I_CASE</span></code>, <code><span class='Function'>A_CASE</span></code>, or <code><span class='Function'>S_CASE</span></code> is called a <em>general case</em> or <em>general body</em> if it has no header or predicate, or, more formally, it doesn't directly include a <code><span class='String'>":"</span></code> token and its <code><span class='Function'>BODY</span></code> node doesn't use the <code><span class='Function'>EXPR</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='String'>"?"</span> <span class='Separator'>⋄</span><span class='Head'>?</span></code> case. A program must satisfy some additional rules regarding general cases, but these are not needed to resolve the grammar and shouldn't strictly be considered part of it. First, no general body can appear before a body that isn't general in a block. Second, a <code><span class='Function'>IMM_BLK</span></code> or <code><span class='Value'>blSub</span></code> can directly contain at most one general body and an <code><span class='Function'>ARG_BLK</span></code> at most two (these are monadic and dyadic cases).</p> <pre><span class='Function'>BODY</span> <span class='Function'>=</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='Paren'>(</span> <span class='Function'>STMT</span> <span class='Separator'>⋄</span> <span class='Function'>|</span> <span class='Function'>EXPR</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='String'>"?"</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='Paren'>)</span><span class='Value'>*</span> <span class='Function'>STMT</span> <span class='Separator'>⋄</span><span class='Head'>?</span> -<span class='Function'>CASE</span> <span class='Function'>=</span> <span class='Function'>BODY</span> -<span class='Function'>I_CASE</span> <span class='Function'>=</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='Function'>IMM_HEAD</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='String'>":"</span> <span class='Function'>BODY</span> -<span class='Function'>A_CASE</span> <span class='Function'>=</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='Function'>ARG_HEAD</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='String'>":"</span> <span class='Function'>BODY</span> -<span class='Function'>IMM_BLK</span> <span class='Function'>=</span> <span class='String'>"{"</span> <span class='Paren'>(</span> <span class='Function'>I_CASE</span> <span class='String'>";"</span> <span class='Paren'>)</span><span class='Value'>*</span> <span class='Paren'>(</span> <span class='Function'>I_CASE</span> <span class='Function'>|</span> <span class='Function'>CASE</span> <span class='Paren'>)</span> <span class='String'>"}"</span> -<span class='Function'>ARG_BLK</span> <span class='Function'>=</span> <span class='String'>"{"</span> <span class='Paren'>(</span> <span class='Function'>A_CASE</span> <span class='String'>";"</span> <span class='Paren'>)</span><span class='Value'>*</span> <span class='Paren'>(</span> <span class='Function'>A_CASE</span> <span class='Function'>|</span> <span class='Function'>CASE</span> <span class='Paren'>(</span> <span class='String'>";"</span> <span class='Function'>CASE</span> <span class='Paren'>)</span><span class='Head'>?</span> <span class='Paren'>)</span> <span class='String'>"}"</span> -<span class='Value'>blSub</span> <span class='Function'>=</span> <span class='String'>"{"</span> <span class='Paren'>(</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='Value'>s</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='String'>":"</span> <span class='Paren'>)</span><span class='Head'>?</span> <span class='Function'>BODY</span> <span class='String'>"}"</span> +<span class='Function'>I_CASE</span> <span class='Function'>=</span> <span class='Paren'>(</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='Function'>IMM_HEAD</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='String'>":"</span> <span class='Paren'>)</span><span class='Head'>?</span> <span class='Function'>BODY</span> +<span class='Function'>A_CASE</span> <span class='Function'>=</span> <span class='Paren'>(</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='Function'>ARG_HEAD</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='String'>":"</span> <span class='Paren'>)</span><span class='Head'>?</span> <span class='Function'>BODY</span> +<span class='Function'>S_CASE</span> <span class='Function'>=</span> <span class='Paren'>(</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='Value'>s</span> <span class='Separator'>⋄</span><span class='Head'>?</span> <span class='String'>":"</span> <span class='Paren'>)</span><span class='Head'>?</span> <span class='Function'>BODY</span> +<span class='Function'>IMM_BLK</span> <span class='Function'>=</span> <span class='String'>"{"</span> <span class='Paren'>(</span> <span class='Function'>I_CASE</span> <span class='String'>";"</span> <span class='Paren'>)</span><span class='Value'>*</span> <span class='Function'>I_CASE</span> <span class='String'>"}"</span> +<span class='Function'>ARG_BLK</span> <span class='Function'>=</span> <span class='String'>"{"</span> <span class='Paren'>(</span> <span class='Function'>A_CASE</span> <span class='String'>";"</span> <span class='Paren'>)</span><span class='Value'>*</span> <span class='Function'>A_CASE</span> <span class='String'>"}"</span> +<span class='Value'>blSub</span> <span class='Function'>=</span> <span class='String'>"{"</span> <span class='Paren'>(</span> <span class='Function'>S_CASE</span> <span class='String'>";"</span> <span class='Paren'>)</span><span class='Value'>*</span> <span class='Function'>S_CASE</span> <span class='String'>"}"</span> <span class='Function'>BlFunc</span> <span class='Function'>=</span> <span class='Function'>ARG_BLK</span> <span class='Modifier'>_blMod1</span> <span class='Function'>=</span> <span class='Function'>IMM_BLK</span> <span class='Function'>|</span> <span class='Function'>ARG_BLK</span> <span class='Modifier2'>_blMod2_</span> <span class='Function'>=</span> <span class='Function'>IMM_BLK</span> <span class='Function'>|</span> <span class='Function'>ARG_BLK</span> |
