PDA for Addition

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

Grammar
E -> TX
X -> ε | +TX | -TX
T -> FY
Y -> ε | *FY | /FY
F -> n | (E) | i(E)
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")
}