diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2021-12-03 21:33:35 -0500 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2021-12-03 21:33:35 -0500 |
| commit | 2053db2c535ceb5457c30f8ae8832bd37ac3fc2e (patch) | |
| tree | 49ab184b270df831bd873be55e99b020f0649991 | |
| parent | 33831837f3e17f6369097327005699a9b28d06c7 (diff) | |
Clean up lhs grammar spec
| -rw-r--r-- | docs/spec/grammar.html | 14 | ||||
| -rw-r--r-- | spec/grammar.md | 11 |
2 files changed, 15 insertions, 10 deletions
diff --git a/docs/spec/grammar.html b/docs/spec/grammar.html index 9f99b430..3b18a102 100644 --- a/docs/spec/grammar.html +++ b/docs/spec/grammar.html @@ -44,12 +44,17 @@ </span><span class='Function'>FuncExpr</span> <span class='Function'>=</span> <span class='Function'>Train</span> <span class='Function'>|</span> <span class='Function'>F</span> <span class='Function'>ASGN</span> <span class='Function'>FuncExpr</span> </pre> -<p>Subject expressions are complicated by the possibility of list and namespace assignment, which share the nodes <code><span class='Value'>lhsList</span></code> and <code><span class='Value'>lhsStr</span></code> and cannot be completely distinguished until execution. We also define nothing-statements, which have very similar syntax to subject expressions but do not permit assignment.</p> +<p>Subject expressions consist mainly of function application. We also define nothing-statements, which have very similar syntax to subject expressions but do not permit assignment. They can be used as an <code><span class='Function'>STMT</span></code> or in place of a left argument.</p> <pre><span class='Value'>arg</span> <span class='Function'>=</span> <span class='Value'>subExpr</span> <span class='Function'>|</span> <span class='Paren'>(</span> <span class='Value'>subject</span> <span class='Function'>|</span> <span class='Value'>nothing</span> <span class='Paren'>)</span><span class='Value'>?</span> <span class='Function'>Derv</span> <span class='Value'>arg</span> <span class='Value'>nothing</span> <span class='Function'>=</span> <span class='String'>"·"</span> <span class='Function'>|</span> <span class='Paren'>(</span> <span class='Value'>subject</span> <span class='Function'>|</span> <span class='Value'>nothing</span> <span class='Paren'>)</span><span class='Value'>?</span> <span class='Function'>Derv</span> <span class='Value'>nothing</span> -<span class='Function'>NAME</span> <span class='Function'>=</span> <span class='Value'>s</span> <span class='Function'>|</span> <span class='Function'>F</span> <span class='Function'>|</span> <span class='Modifier'>_m</span> <span class='Function'>|</span> <span class='Modifier2'>_c_</span> +<span class='Value'>subExpr</span> <span class='Function'>=</span> <span class='Value'>arg</span> + <span class='Function'>|</span> <span class='Value'>lhs</span> <span class='Function'>ASGN</span> <span class='Value'>subExpr</span> + <span class='Function'>|</span> <span class='Value'>lhs</span> <span class='Function'>Derv</span> <span class='String'>"↩"</span> <span class='Value'>subExpr?</span> <span class='Comment'># Modified assignment +</span></pre> +<p>The target of subject assignment can be compound to allow for destructuring. List and namespace assignment share the nodes <code><span class='Value'>lhsList</span></code> and <code><span class='Value'>lhsStr</span></code> and cannot be completely distinguished until execution. The term <code><span class='Value'>sl</span></code> in <code><span class='Function'>LHS_SUB</span></code> is used for header inputs below: as an additional rule, it cannot be used in the <code><span class='Value'>lhs</span></code> term of a <code><span class='Value'>subExpr</span></code> node.</p> +<pre><span class='Function'>NAME</span> <span class='Function'>=</span> <span class='Value'>s</span> <span class='Function'>|</span> <span class='Function'>F</span> <span class='Function'>|</span> <span class='Modifier'>_m</span> <span class='Function'>|</span> <span class='Modifier2'>_c_</span> <span class='Function'>LHS_SUB</span> <span class='Function'>=</span> <span class='String'>"·"</span> <span class='Function'>|</span> <span class='Value'>lhsList</span> <span class='Function'>|</span> <span class='Value'>sl</span> <span class='Function'>LHS_ANY</span> <span class='Function'>=</span> <span class='Function'>NAME</span> <span class='Function'>|</span> <span class='Function'>LHS_SUB</span> <span class='Function'>|</span> <span class='String'>"("</span> <span class='Function'>LHS_ELT</span> <span class='String'>")"</span> <span class='Function'>LHS_ATOM</span> <span class='Function'>=</span> <span class='Function'>LHS_ANY</span> <span class='Function'>|</span> <span class='String'>"("</span> <span class='Value'>lhsStr</span> <span class='String'>")"</span> @@ -59,10 +64,7 @@ <span class='Value'>lhsList</span> <span class='Function'>=</span> <span class='String'>"⟨"</span> <span class='Separator'>⋄</span><span class='Value'>?</span> <span class='Paren'>(</span> <span class='Paren'>(</span> <span class='Function'>LHS_ENTRY</span> <span class='Separator'>⋄</span> <span class='Paren'>)</span><span class='Value'>*</span> <span class='Function'>LHS_ENTRY</span> <span class='Separator'>⋄</span><span class='Value'>?</span> <span class='Paren'>)</span><span class='Value'>?</span> <span class='String'>"⟩"</span> <span class='Value'>lhsComp</span> <span class='Function'>=</span> <span class='Function'>LHS_SUB</span> <span class='Function'>|</span> <span class='Value'>lhsStr</span> <span class='Function'>|</span> <span class='String'>"("</span> <span class='Value'>lhs</span> <span class='String'>")"</span> <span class='Value'>lhs</span> <span class='Function'>=</span> <span class='Value'>s</span> <span class='Function'>|</span> <span class='Value'>lhsComp</span> -<span class='Value'>subExpr</span> <span class='Function'>=</span> <span class='Value'>arg</span> - <span class='Function'>|</span> <span class='Value'>lhs</span> <span class='Function'>ASGN</span> <span class='Value'>subExpr</span> - <span class='Function'>|</span> <span class='Value'>lhs</span> <span class='Function'>Derv</span> <span class='String'>"↩"</span> <span class='Value'>subExpr?</span> <span class='Comment'># Modified assignment -</span></pre> +</pre> <p>A header looks like a name for the thing being headed, or its application to inputs (possibly twice in the case of modifiers). As with assignment, it is restricted to a simple form with no extra parentheses. The full list syntax is allowed for arguments. A plain name is called a label and can be used for a block with or without arguments. First we define headers <code><span class='Function'>IMM_HEAD</span></code> that include no arguments.</p> <pre><span class='Value'>headW</span> <span class='Function'>=</span> <span class='Value'>lhs</span> <span class='Function'>|</span> <span class='String'>"𝕨"</span> <span class='Value'>headX</span> <span class='Function'>=</span> <span class='Value'>lhs</span> <span class='Function'>|</span> <span class='String'>"𝕩"</span> diff --git a/spec/grammar.md b/spec/grammar.md index 90f4718b..df355c77 100644 --- a/spec/grammar.md +++ b/spec/grammar.md @@ -47,12 +47,18 @@ Functions can be formed by applying modifiers, or with trains. Modifiers are lef FuncExpr = Train | F ASGN FuncExpr -Subject expressions are complicated by the possibility of list and namespace assignment, which share the nodes `lhsList` and `lhsStr` and cannot be completely distinguished until execution. We also define nothing-statements, which have very similar syntax to subject expressions but do not permit assignment. +Subject expressions consist mainly of function application. We also define nothing-statements, which have very similar syntax to subject expressions but do not permit assignment. They can be used as an `STMT` or in place of a left argument. arg = subExpr | ( subject | nothing )? Derv arg nothing = "·" | ( subject | nothing )? Derv nothing + subExpr = arg + | lhs ASGN subExpr + | lhs Derv "↩" subExpr? # Modified assignment + +The target of subject assignment can be compound to allow for destructuring. List and namespace assignment share the nodes `lhsList` and `lhsStr` and cannot be completely distinguished until execution. The term `sl` in `LHS_SUB` is used for header inputs below: as an additional rule, it cannot be used in the `lhs` term of a `subExpr` node. + NAME = s | F | _m | _c_ LHS_SUB = "·" | lhsList | sl LHS_ANY = NAME | LHS_SUB | "(" LHS_ELT ")" @@ -63,9 +69,6 @@ Subject expressions are complicated by the possibility of list and namespace ass lhsList = "⟨" ⋄? ( ( LHS_ENTRY ⋄ )* LHS_ENTRY ⋄? )? "⟩" lhsComp = LHS_SUB | lhsStr | "(" lhs ")" lhs = s | lhsComp - subExpr = arg - | lhs ASGN subExpr - | lhs Derv "↩" subExpr? # Modified assignment A header looks like a name for the thing being headed, or its application to inputs (possibly twice in the case of modifiers). As with assignment, it is restricted to a simple form with no extra parentheses. The full list syntax is allowed for arguments. A plain name is called a label and can be used for a block with or without arguments. First we define headers `IMM_HEAD` that include no arguments. |
