Skip to content

Instantly share code, notes, and snippets.

@junkblocker
Forked from alganet/parser.sh
Created April 3, 2026 17:13
Show Gist options
  • Select an option

  • Save junkblocker/38d221f91e134b93f9d2e42149142d02 to your computer and use it in GitHub Desktop.

Select an option

Save junkblocker/38d221f91e134b93f9d2e42149142d02 to your computer and use it in GitHub Desktop.
Prototype sh parser written in sh
# Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
# SPDX-License-Identifier: ISC
_repeat () {
case "${2:-}" in
0|"") return;;
1) REPLY="$1"; return;;
2) REPLY="$1$1"; return;;
3) REPLY="$1$1$1"; return;;
4) REPLY="$1$1$1$1"; return;;
esac
local VALUE="$1" COUNT="$2" POW=2; REPLY=
while :
do
if test $POW -gt $COUNT
then
test $COUNT -gt 0 || break
REPLY="$REPLY$VALUE" VALUE="$1" COUNT=$((COUNT - (POW / 2))) POW=2
continue
fi
VALUE="$VALUE$VALUE" POW=$((POW * 2))
done
}
_questn () {
eval "case \${_questn$1:-} in \"\") _repeat \\? $1; _questn$1=\$REPLY;; esac; REPLY=\$_questn$1";
}
alias SINPUTFEED='
if test ${#CODE} -lt 16 -a $# -gt 0
then
_a= _b=
while test ${#1} -gt 256
do
_questn $((${#1} / 2));
_b="${1#${REPLY}}"; _a="${1%$_b}"; shift
set -- "$_a" "$_b" "${@:-}"
done
CODE="$CODE$1"
shift
fi'
alias SINPUTMORE='
if test ${#CODE} -lt 256 -a $# -gt 0
then
_a= _b=
while test ${#1} -gt 256
do
_questn $((${#1} / 2));
_b="${1#${REPLY}}"; _a="${1%$_b}"; shift
set -- "$_a" "$_b" "${@:-}"
done
CODE="$CODE$1"
shift
fi'
alias CONSUME='REST="${CODE#?}"; CONSUMED="$CONSUMED${CODE%"$REST"}"; CODE="$REST"'
alias CONSUME2='REST="${CODE#??}"; CONSUMED="$CONSUMED${CODE%"$REST"}"; CODE="$REST"'
alias CONSUME3='REST="${CODE#???}"; CONSUMED="$CONSUMED${CODE%"$REST"}"; CODE="$REST"'
alias CONSUME4='REST="${CODE#????}"; CONSUMED="$CONSUMED${CODE%"$REST"}"; CODE="$REST"'
alias IGNORE='CODE="${CODE#?}"'
alias IGNORE2='CODE="${CODE#??}"'
alias IGNORE_WS='CODE="${CODE#"${CODE%%[!$_TAB\ ]*}"}"'
alias IGNORE_WSE='CODE="${CODE#"${CODE%%[!$_TAB$_EOL\ ]*}"}"'
alias SNEW='
STATES="$STATES $STATE"; V=$((V + 1))
case "$CONSUMED" in "");; *) local V$V="$CONSUMED";;esac
CONSUMED='
alias SOPEN='
local X$V$STATE=""
PARN="${NODES##*" "}"
NODE="X$V$STATE"; NODES="$NODES $NODE"'
alias SDOWN='
STATE="${STATES##*" "}"; STATES="${STATES%" ${STATE}"}"
eval local V$V=\"\${CONSUMED:-\${V$V:-}}\"
PARN="${NODES##*" "}"
NODE="$PARN"; NODES="${NODES%" $NODE"}"; PARN="${NODES##*" "}"'
alias SDISC='SDOWN;unset $NODE'
alias SCLOSE='SDOWN;eval "$PARN=\"\$$PARN \$NODE\""'
alias SCLOSRNE='SCLOSE; eval "eval \"case \\$\${$NODE#?}\" in \\\"\\\"\) _error $E \;\; esac; E=;"'
alias SCLOSOP='
SDOWN
eval "case \${$PARN##*" "} in X*) SIBL=\"\${$PARN##*" "}\";; *)SIBL=;;esac"
case $SIBL in
*BP) eval "$PARN=\"\${$PARN%\" \$SIBL\"}\" $SIBL=\"\${$PARN##*\" \"} \$NODE\" $PARN=\"\${$PARN%\" \"*} \$SIBL\"";;
*UP) eval "$PARN=\"\${$PARN%\" \$SIBL\"}\" $SIBL=\"\$NODE\" $PARN=\"\${$PARN%\" \"*} \$SIBL\"";;
*) eval "$PARN=\"\$$PARN \$NODE\"";;
esac'
xxx () {
local CODE= STATE=prog I=0 V=0 CONSUMED= NODES=" X0prog" X0prog='' X=0 NODE= REST= PARN= SIBL= E= _a= _b= STATES=
# set -- "! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;"
# set -- "! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;! foo; zaaa | baz b a c ||$_EOL lo_greatest_name_bar_that_has_ever_been_hooooohaaaaa=a thequickbrownfox && lazydog > foo 2>&1;"
# set -- "{ true;};2>&1"
set -- "foo && bar"
while : $CONSUMED -- x$CODE -- $STATE -- $I
do
SINPUTFEED
case $CODE in
'&&'* | '||'*)
case $STATE in
full) SNEW;STATE=logicBP;SOPEN;CONSUME2;;
stmt|exec|cmd) SCLOSOP;;
arg|word) SCLOSE;;
*) _error LOGIC;;esac;;
'!'*)
case $STATE in
stmt) SNEW;STATE=bangUP;SOPEN;IGNORE;CONSUMED=\!;;
arg) SNEW;STATE=word;SOPEN;IGNORE;CONSUMED=\!;;
bangUP) IGNORE;CONSUMED=\!;;
prog) SNEW;STATE=full;SOPEN;;
full) SNEW;STATE=stmt;SOPEN;;
cmd) SNEW;STATE=arg;SOPEN;;
exec) SCLOSOP;;
logicBP) SCLOSE;;
*) _error BANG;;esac;;
'|'*)
case $STATE in
exec) SNEW;STATE=pipeBP;SOPEN;IGNORE;CONSUMED=\|;;
cpatt)
IGNORE;SCLOSE;SNEW;STATE=cpatt;SOPEN;;
cmd) SCLOSOP;;
arg|word) SCLOSE;;
*) _error PIPE;;esac;;
"$_EOL"*)
case $STATE in
logicBP|pipeBP|prog) IGNORE_WSE;;
fredir) E=FREDIR; SCLOSRNE;;
full) SCLOSE;;
stmt|exec) SCLOSOP;;
cmd) SCLOSOP;CONSUMED=;;
cmdpre|blockpos|arg|word) SCLOSE;CONSUMED=;;
commt) SCLOSE;;
*) _error END OF LINE;;esac;;
';'*)
case $STATE in
full) SCLOSE;IGNORE;CONSUMED=;;
ccasepatt) SCLOSE;SCLOSE;IGNORE;;
prog)
SCLOSE
case $PARN in *ccaseitem) SCLOSE;SCLOSE;IGNORE;;esac
;;
fredir) E=FREDIR; SCLOSRNE;;
stmt|exec|cmd) SCLOSOP;;
cmdpre|blockpos|arg|word) SCLOSE;;
*) _error SEMICOLON;;esac;;
"")
case $STATE in
prog) break;;
fredir) E=FREDIR; SCLOSRNE;;
stmt|exec|cmd) SCLOSOP;;
blockpos|full|cmdpre|vassig|cmd|arg|word|commt) SCLOSE;;
logicBP) _error END LOGIC;;
pipeBP) _error END PIPE;;
*) _error END OF SCRIPT;;esac;;
' '*|"$_TAB"*)
case $STATE in
ccase|fdecl|blockpos|vassig|cmdpre|cmd|stmt|prog) IGNORE_WS;;
exec|bangUP|logicBP|pipeBP) IGNORE_WSE;;
fredir) E=FREDIR; SCLOSRNE;;
arg|word|expan) SCLOSE;CONSUMED=;;
text) CONSUME;;
dquo)
_error $STATE;;
commt)
CONSUME;;
*) _error ARGUMENT;;esac;;
[0-9]'>&'[0-9]*)
case $STATE in
blockpos|cmdpre|cmd) SNEW;STATE=ioredir;SOPEN;CONSUME4;SCLOSE;;
prog) SNEW;STATE=full;SOPEN;;
full) SNEW;STATE=stmt;SOPEN;;
stmt) SNEW;STATE=exec;SOPEN;;
exec) SNEW;STATE=cmd;SOPEN;STATE=cmdpre;;
vassig|arg|word) SCLOSE;;
*) _error IOREDIR;;esac;;
'>&'[0-9]*)
case $STATE in
blockpos|cmdpre|cmd) SNEW;STATE=ioredir;SOPEN;CONSUME3;SCLOSE;;
prog) SNEW;STATE=full;SOPEN;;
full) SNEW;STATE=stmt;SOPEN;;
stmt) SNEW;STATE=exec;SOPEN;;
exec) SNEW;STATE=cmd;SOPEN;STATE=cmdpre;;
vassig|arg|word) SCLOSE;;
*) _error IOREDIR;;esac;;
[0-9]'>'*)
case $STATE in
blockpos|cmdpre|cmd) SNEW;STATE=fredir;SOPEN;CONSUME2;IGNORE_WS;SNEW;STATE=arg;SOPEN;;
prog) SNEW;STATE=full;SOPEN;;
full) SNEW;STATE=stmt;SOPEN;;
stmt) SNEW;STATE=exec;SOPEN;;
exec) SNEW;STATE=cmd;SOPEN;STATE=cmdpre;;
vassig|arg|word) SCLOSE;;
*) _error FREDIR;;esac;;
'>'*)
case $STATE in
blockpos|cmdpre|cmd) SNEW;STATE=fredir;SOPEN;CONSUME;IGNORE_WS;SNEW;STATE=arg;SOPEN;;
prog) SNEW;STATE=full;SOPEN;;
full) SNEW;STATE=stmt;SOPEN;;
stmt) SNEW;STATE=exec;SOPEN;;
exec) SNEW;STATE=cmd;SOPEN;STATE=cmdpre;;
vassig|arg|word) SCLOSE;;
*) _error FREDIR;;esac;;
"{ "* | "{$_TAB"* | "{$_EOL"*)
case $STATE in
exec) SNEW;STATE=cmd;SOPEN;SNEW;STATE=block;SOPEN;IGNORE2;SNEW;STATE=prog;SOPEN;;
fdecl) SNEW;STATE=block;SOPEN;IGNORE2;SNEW;STATE=prog;SOPEN;;
prog) SNEW;STATE=full;SOPEN;;
full) SNEW;STATE=stmt;SOPEN;;
stmt) SNEW;STATE=exec;SOPEN;;
word) CONSUME;;
esac;;
'}'*)
case $STATE in
prog)
SCLOSE
case $PARN in *block);; *) _error AJDNKAJND;;esac
IGNORE;SCLOSE;STATE=blockpos
case $CODE in
"$_EOL"* | "$_TAB"* | ' '*);;
""|';'*);;
*) _error BLOCK CLOSING;;
esac
;;
expan|vsubst) SCLOSE; IGNORE;;
cmd|exec|arg|word) SCLOSE;;
stmt) _error BLOCK CLOSING;;
word) CONSUME;;
*) _error brclos;;esac;;
# escapes
# &
# until
# comments DONE
# subshell DONE
# dquotesub DONE
# expansions DONE (:- :+ %% ## # %)
# dquote PARTIAL (dquotesub, escapes)
# squote (mostly) DONE (improve chars)
# case -- (mostly) DONE (improve errors)
# for ------ (mostly) DONE (improve in)
# while --- DONE
# if --- DONE
')'*)
case $STATE in
word|arg|cmd|exec|stmt|full) SCLOSE;;
prog)
SCLOSE
case $PARN in
*dquotesub)
IGNORE;SCLOSE;CONSUMED=
case $PARN in
*dquo) SNEW;STATE=text;SOPEN;;
*arg) SCLOSE;;
*) _error $PARN AJDNKAJaaaND;;
esac;;
*subsh)
IGNORE;SCLOSE;CONSUMED=
case $PARN in
*arg) SCLOSE;;
*) _error $PARN ---AJDNKAJaaaND;;
esac;;
*) _error AJDNKAJND;;
esac
;;
cpatt) SCLOSE;IGNORE;
SNEW;STATE=prog;SOPEN;;
cpatt) IGNORE;SCLOSE;;
*) _error CASE ITEMx;;esac;;
"'"*)
case $STATE in
cmd) SNEW;STATE=arg;SOPEN;SNEW;STATE=squo;SOPEN;SNEW;STATE=text;SOPEN;IGNORE;;
squo) SCLOSE;IGNORE;;
text) SCLOSE;;
*) _error squo $STATE;;esac;;
'"'*)
case $STATE in
cmd) SNEW;STATE=arg;SOPEN;SNEW;STATE=dquo;SOPEN;SNEW;STATE=text;SOPEN;IGNORE;;
dquo) SCLOSE;IGNORE;;
text) SCLOSE;;
*) _error dquo $STATE;;esac;;
'${'*)
case $STATE in
cmd) SNEW;STATE=arg;SOPEN;SNEW;STATE=expan;SOPEN;SNEW;STATE=vparam;SOPEN;IGNORE2;;
*) _error brop $STATE;;esac;;
'$('*)
case $STATE in
text)
SCLOSE
case $PARN in *dquo);; *) _error AJDNKAJND;;esac
IGNORE2;CONSUMED=;SNEW;STATE=dquotesub;SOPEN;SNEW;STATE=prog;SOPEN;
;;
cmd) SNEW;STATE=arg;SOPEN;SNEW;STATE=dquotesub;SOPEN;SNEW;STATE=prog;SOPEN;IGNORE2;;
*) _error brop $STATE;;esac;;
'('*)
case $STATE in
prog) SNEW;STATE=full;SOPEN;;
full) SNEW;STATE=stmt;SOPEN;;
stmt) SNEW;STATE=exec;SOPEN;;
exec) SNEW;STATE=cmd;SOPEN;;
cmd) SNEW;STATE=arg;SOPEN;SNEW;STATE=subsh;SOPEN;SNEW;STATE=prog;SOPEN;IGNORE;;
*) _error bropa $STATE;;esac;;
'$'*)
case $STATE in
cmd) SNEW;STATE=arg;SOPEN;SNEW;STATE=expan;SOPEN;SNEW;STATE=vname;SOPEN;IGNORE;;
*) _error dquo $STATE;;esac;;
':-'* | ':+'* | '%%'* | '##'*)
case $STATE in
expan) SNEW;STATE=vsubst;SOPEN;CONSUME2;SNEW;STATE=arg;SOPEN;;
*) _error col $STATE;;esac;;
'#'* | '%'*)
case $STATE in
expan) SNEW;STATE=vsubst;SOPEN;CONSUME;SNEW;STATE=arg;SOPEN;;
prog|cmd) SNEW;STATE=commt;SOPEN;CONSUME;;
*) _error col $STATE;;esac;;
[a-zA-Z0-9_=]*)
case $STATE in
word) CONSUME;;
vsubst|vparam|vname)
SINPUTMORE
CONSUMED="${CODE%%[!a-zA-Z0-9_=]*}"; CODE="${CODE#"$CONSUMED"}"
SCLOSE;
;;
execpre)
STATE=cmdpre
SINPUTMORE
MATCH="${CODE%%[!a-zA-Z0-9_=]*}"; REST="${CODE#"$MATCH"}"
MATCH2="${REST#"${REST%%[!$_TAB\ ]*}"}"
case $MATCH2 in
'()'*)
CODE="${MATCH2#'()'}"
CONSUMED="$MATCH";SNEW;STATE=fdecl;SOPEN;
;;
*)
case $MATCH in
'if')
CODE="${MATCH2}"
CONSUMED="$MATCH";SNEW;STATE=cif;SOPEN;SNEW;STATE=prog;SOPEN;
;;
'then')
SDISC;SCLOSE;SCLOSE;SDISC
case $STATES in "") _error kdnafkandkasd;;esac
SCLOSE
case $PARN in
*cif|*celif)
CONSUME4;SNEW;STATE=cthen;SOPEN;SNEW;STATE=prog;SOPEN;
;;
*) _error aijndkjandlaksalallll;;
esac;;
'elif')
SDISC;SCLOSE;SCLOSE;SDISC
case $STATES in "") _error zzzzzzzzzzzz;;esac
SCLOSE;SCLOSE
case $PARN in
*cif|*celif)
CONSUME4;SNEW;STATE=celif;SOPEN;SNEW;STATE=prog;SOPEN;
;;
*) _error gggggggg;;
esac;;
'else')
SDISC;SCLOSE;SCLOSE;SDISC
case $STATES in "") _error xxxxxxxxxxkdnafkandkasd;;esac
SCLOSE;SCLOSE
case $PARN in
*cif|*celif)
CONSUME4;SNEW;STATE=celse;SOPEN;SNEW;STATE=prog;SOPEN;
;;
*) _error xxxxxxxxxaijndkjandlaksalallll;;
esac;;
'fi')
SDISC;SDISC;SDISC;SDISC
case $STATES in "") _error xxxxxxxxxxkdnafkandkasd;;esac
SCLOSE;SCLOSE
case $PARN in
*cif|*celif)
CONSUME2;SCLOSE;SCLOSE
;;
*) _error sadasdaijndkjandlaksalallll;;
esac;;
'while')
CODE="${MATCH2}"
CONSUMED="$MATCH";SNEW;STATE=cwhile;SOPEN;SNEW;STATE=prog;SOPEN;
;;
'for')
CODE="${MATCH2}"
CONSUMED="$MATCH";SNEW;STATE=cfor;SOPEN;SNEW;STATE=prog;SOPEN;
;;
'do')
SDISC;SCLOSE;SCLOSE;SDISC
case $STATES in "") _error kdnafkandkasd;;esac
SCLOSE
case $PARN in
*cwhile|*cfor)
CONSUME2;SNEW;STATE=cdo;SOPEN;SNEW;STATE=prog;SOPEN;
;;
*) _error doinqwkjnkqjwn;;
esac;;
'done')
SDISC;SDISC;SDISC;SDISC
case $STATES in "") _error xxxxxxxxxxkdnafkandkasd;;esac
SCLOSE;SCLOSE
case $PARN in
*cwhile|*cfor)
CONSUME4;SCLOSE;SCLOSE
;;
*) _error sadasdaijndkjandlaksalallll;;
esac;;
'case')
CODE="${MATCH2}"
CONSUMED="$MATCH";SNEW;STATE=cswitch;SOPEN;
;;
esac
esac
;;
cswitch)
SINPUTMORE
MATCH="${CODE%%[!a-zA-Z0-9_]*}"; REST="${CODE#"$MATCH"}"
MATCH2="${REST#"${REST%%[!$_TAB\ ]*}"}"
case $MATCH2 in
'in'*) CODE="${MATCH2#"in"}";CONSUMED="$MATCH";IGNORE_WS;SNEW;STATE=arg;SOPEN;SCLOSE;STATE=ccase;;
*) _error CASE;;
esac
;;
ccase)
SINPUTMORE
MATCH="${CODE%%[!a-zA-Z0-9_]*}"; REST="${CODE#"$MATCH"}"
case $MATCH in
'esac') CONSUME4;CONSUMED=;SCLOSE;;
*) SNEW;STATE=ccaseitem;SOPEN;SNEW;STATE=ccasepatt;SOPEN;;
esac
;;
cmdpre)
SINPUTMORE
MATCH="${CODE%%[!a-zA-Z0-9_]*}"; REST="${CODE#"$MATCH"}"
case $REST in
'='*) CODE="$REST";CONSUMED="$MATCH";SNEW;STATE=vassig;SOPEN;SNEW;STATE=arg;SOPEN;IGNORE;CONSUMED=;;
*) STATE=cmd;;
esac
;;
vassig)
SINPUTMORE
MATCH="${CODE%%[!a-zA-Z0-9_]*}"; REST="${CODE#"$MATCH"}"
case $REST in
'='*) SCLOSE;CODE="$REST";CONSUMED="$MATCH";SNEW;STATE=vassig;SOPEN;SNEW;STATE=arg;SOPEN;IGNORE;CONSUMED=;;
*) SCLOSE;STATE=cmd;;
esac
;;
prog) SNEW;STATE=full;SOPEN;;
full) SNEW;STATE=stmt;SOPEN;;
stmt) SNEW;STATE=exec;SOPEN;;
exec) SNEW;STATE=cmd;SOPEN;STATE=execpre;;
cmd) SNEW;STATE=arg;SOPEN;;
ccasepatt) SNEW;STATE=cpatt;SOPEN;;
arg) SNEW;STATE=word;SOPEN;;
cpatt) CONSUME;;
text|commt) CONSUME;;
bangUP|logicBP|pipeBP) SCLOSE;CONSUMED=;;
*) _error NAME;;esac;;
*) _error CHARACTER;;
esac
done
case $- in *z*);;*)
set | while read -r LINE || test -n "$LINE"
do
case $LINE in
[VX][0-9]*)
NAM="${LINE%%=*}"
eval "VAL=\"\${$NAM:-}\""
_printr1 "$NAM=$VAL"
;;
esac
done
exit $?
esac
}
main () {
xxx
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment