lib/libexec/grammar.sh
#shellcheck shell=sh disable=SC2004,SC2016
define_block() {
eval "$1() { case \$1 in ($2) return 0; esac; return 1; }"
}
define_blocks() {
: "${SHELLSPEC_GRAMMAR_BLOCKS:="${1%.*}/blocks"}"
varname="" dsl=""
while IFS= read -r line; do
case $line in ("" | \#*) continue; esac
shellspec_trim varname "${line%::=*}"
shellspec_trim dsl "${line#*::=}"
echo "$varname=\"$dsl\""
echo "define_block \"is_$varname\" \"\$$varname\""
done < "$SHELLSPEC_GRAMMAR_BLOCKS" &&:
}
eval "$(define_blocks "$SHELLSPEC_SOURCE")"
define_dsls() {
: "${SHELLSPEC_GRAMMAR_DSLS:="${1%.*}/dsls"}"
: "${SHELLSPEC_GRAMMAR_DIRECTIVES:="${1%.*}/directives"}"
dsls=''
echo 'dsl() { case $1 in'
while IFS= read -r line; do
case $line in ("" | \#*) continue; esac
dsls="$dsls${dsls:+|}${line%%\=\>*}"
echo "${line%\=\>*}) ${line#*\=\>} \"\$2\" ;;"
done < "$SHELLSPEC_GRAMMAR_DSLS" &&:
while IFS= read -r line; do
case $line in ("" | \#*) continue; esac
echo "${line%\=\>*}) ${line#*\=\>} \"\$2\" ;;"
done < "$SHELLSPEC_GRAMMAR_DIRECTIVES" &&:
echo '*) return 1 ;; esac; }'
echo "is_dsl() { case \$1 in ($dsls) true ;; (*) false ; esac; }"
}
eval "$(define_dsls "$SHELLSPEC_SOURCE")"
define_directives() {
: "${SHELLSPEC_GRAMMAR_DIRECTIVES:="${1%.*}/directives"}"
echo 'directive() { case $2 in'
while IFS= read -r line; do
case $line in ("" | \#*) continue; esac
echo "${line%\=\>*}) with_function \"\$1\" ${line#*\=\>} \"\$3\" ;;"
done < "$SHELLSPEC_GRAMMAR_DIRECTIVES" &&:
echo '*) return 1 ;; esac; }'
}
eval "$(define_directives "$SHELLSPEC_SOURCE")"
mapping() {
dsl "$@" && return 0
case $1 in (*\(\))
is_function_name "${1%??}" || return 1
case ${2%%\%*} in (*[!\ \{]*) return 1; esac
set -- "$1" "${2#"${2%%\%*}"}"
set -- "$1" "${2%% *}" "${2#* }"
directive "$@" && return 0
esac
return 1
}