PDA for Addition

Push-down automaton for unary addition

w =
push E
push TX -> TX
push FY -> FYX  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 (c=='+' && p=='X') return "+TX";
if (c=='-' && p=='X') return "-TX";
if ( p=='X') return "";
if (p=='T') return "FY";

if (c=='*' && p=='Y') return "*FY";
if (c=='/' && p=='Y') return "/FY";
if ( p=='Y') return "";
if (c=='(' && p=='F') return "(E)";
if (c=='n' && p=='F') return "n";
if (c=='i' && p=='F') return "i(E)";
return null; //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")
}