runtime(sh): Add handling for ksh93 shared-state comsubs and mksh valsubs (#13884)

This commit adds support for ksh93 shared-state command
substitutions (syntax: ${ command; }) and mksh's value
substitutions (syntax: ${|command;}) in the sh syntax script.

Also add a syntax test for ksh subshares with dumps included
to make sure it doesn't regress.

fixes: #9514

Signed-off-by: Johnothan King <johnothanking@protonmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/syntax/testdir/input/sh_10.sh b/runtime/syntax/testdir/input/sh_10.sh
new file mode 100644
index 0000000..be463c3
--- /dev/null
+++ b/runtime/syntax/testdir/input/sh_10.sh
@@ -0,0 +1,49 @@
+#!/bin/ksh
+
+# This script is a test file for ksh93 shared-state
+# command substitutions (subshares) and mksh value
+# substitutions (valsubs).
+
+# ======
+# Below is subshare syntax supported by both ksh93 and mksh.
+print ${ echo one }
+print ${	echo two
+}
+print ${
+echo three	}
+print ${ echo 'four'; }
+print ${ echo 'five' ;}
+print ${ echo 'six'
+}
+print ${	echo 'seven'	}
+echo ${ print 'eight'	}
+typeset nine=${ pwd; }
+
+# ======
+# Value substitutions of the form ${|command} are only
+# supported by mksh, not ksh93.
+if ! command eval '((.sh.version >= 20070703))' 2>/dev/null; then
+	valsubfunc() {
+		REPLY=$1
+	}
+	echo ${|valsubfunc ten}
+	print "${|valsubfunc eleven;}"
+	printf '%s' "${|valsubfunc twelve	}"
+	unlucky=${|valsubfunc thirteen
+}
+	typeset notafloat=${|valsubfunc notanumber	}
+	print $unlucky $notanumber
+	${|echo foo}
+	${|echo bar
+}
+fi
+
+# ======
+# Shared-state command substitutions using the syntax ${<file;}
+# are only supported by ksh93, not mksh.
+echo ${
+	printf %s str
+} > /tmp/strfile
+echo ${</tmp/strfile;}
+
+exit 0