Push-down automaton for unary addition
w =push E push TX -> TX push FY -> FYX push (E) -> (E)YX match ( -> E)YX push TX -> TX)YX push FY -> FYX)YX push n -> nYX)YX match n -> YX)YX push -> X)YX push -TX -> -TX)YX match - -> TX)YX push FY -> FYX)YX push i(E) -> i(E)YX)YX match i -> (E)YX)YX match ( -> E)YX)YX push TX -> TX)YX)YX push FY -> FYX)YX)YX push n -> nYX)YX)YX match n -> YX)YX)YX push -> X)YX)YX push +TX -> +TX)YX)YX match + -> TX)YX)YX push FY -> FYX)YX)YX push n -> nYX)YX)YX match n -> YX)YX)YX push -> X)YX)YX push -> )YX)YX match ) -> YX)YX push -> X)YX push -> )YX match ) -> YX push /FY -> /FYX match / -> FYX push i(E) -> i(E)YX match i -> (E)YX match ( -> E)YX push TX -> TX)YX push FY -> FYX)YX push n -> nYX)YX match n -> YX)YX push *FY -> *FYX)YX match * -> FYX)YX push n -> nYX)YX match n -> YX)YX push -> X)YX push -> )YX match ) -> YX Reject
function delta(c, p) { // Unary addition
if (p=='E') return "TX";
if (p=='T') return "FY";
if (c=='*' && p=='Y') return "*FY";
if (c=='/' && p=='Y') return "/FY";
if(p=='Y') return '';
if (c=='n' && p=='F') return "n";
if (c=='(' && p=='F') return "(E)";
if (c=='i' && p=='F') return "i(E)";
if (c=='+' && p=='X') return "+TX";
if (c=='-' && p=='X') return "-TX";
if(p=='X')return ''; //default -- no transition
}
function accept(w, init='E') {
//w: input String
//init: start symbol
//S: stack as Array
let txt = "push "+init
let i = 0, m = w.length, S = [init]
while (i < m && S.length > 0) {
let c = w[i], p = S.pop()
if (c == p) { //input matches stack
i++; txt += "\nmatch "+c
} else { //find a valid transition
let d = delta(c, p)
if (d == null) break
let A = d.split('').reverse()
for (let x of A) S.push(x)
txt += "\npush "+d
}
txt += " -> "
for (let j=S.length-1; j>=0; j--)
txt += S[j]
}
input.selectionStart = i
input.selectionEnd = i+1
let a = (i == m && S.length == 0)
return txt+' '+(a? "Accept" : "Reject")
}