Animation 

> dfa:=randomDFA(5,4,2);
 

`:=`(dfa, DFA({q0, q1, q2, q3, q4}, {a1, a2, a3, a4}, TABLE([(q3, a3) = q4, (q1, a4) = q1, (q3, a2) = q4, (q0, a2) = q4, (q2, a4) = q4, (q1, a2) = q2, (q4, a4) = q4, (q0, a3) = q1, (q0, a1) = q1, (q1,...
`:=`(dfa, DFA({q0, q1, q2, q3, q4}, {a1, a2, a3, a4}, TABLE([(q3, a3) = q4, (q1, a4) = q1, (q3, a2) = q4, (q0, a2) = q4, (q2, a4) = q4, (q1, a2) = q2, (q4, a4) = q4, (q0, a3) = q1, (q0, a1) = q1, (q1,...
`:=`(dfa, DFA({q0, q1, q2, q3, q4}, {a1, a2, a3, a4}, TABLE([(q3, a3) = q4, (q1, a4) = q1, (q3, a2) = q4, (q0, a2) = q4, (q2, a4) = q4, (q1, a2) = q2, (q4, a4) = q4, (q0, a3) = q1, (q0, a1) = q1, (q1,...
`:=`(dfa, DFA({q0, q1, q2, q3, q4}, {a1, a2, a3, a4}, TABLE([(q3, a3) = q4, (q1, a4) = q1, (q3, a2) = q4, (q0, a2) = q4, (q2, a4) = q4, (q1, a2) = q2, (q4, a4) = q4, (q0, a3) = q1, (q0, a1) = q1, (q1,...
(3.1)
 

> op(dfa);
 

{q0, q1, q2, q3, q4}, {a1, a2, a3, a4}, TABLE([(q3, a3) = q4, (q1, a4) = q1, (q3, a2) = q4, (q0, a2) = q4, (q2, a4) = q4, (q1, a2) = q2, (q4, a4) = q4, (q0, a3) = q1, (q0, a1) = q1, (q1, a3) = q2, (q4...
{q0, q1, q2, q3, q4}, {a1, a2, a3, a4}, TABLE([(q3, a3) = q4, (q1, a4) = q1, (q3, a2) = q4, (q0, a2) = q4, (q2, a4) = q4, (q1, a2) = q2, (q4, a4) = q4, (q0, a3) = q1, (q0, a1) = q1, (q1, a3) = q2, (q4...
{q0, q1, q2, q3, q4}, {a1, a2, a3, a4}, TABLE([(q3, a3) = q4, (q1, a4) = q1, (q3, a2) = q4, (q0, a2) = q4, (q2, a4) = q4, (q1, a2) = q2, (q4, a4) = q4, (q0, a3) = q1, (q0, a1) = q1, (q1, a3) = q2, (q4...
{q0, q1, q2, q3, q4}, {a1, a2, a3, a4}, TABLE([(q3, a3) = q4, (q1, a4) = q1, (q3, a2) = q4, (q0, a2) = q4, (q2, a4) = q4, (q1, a2) = q2, (q4, a4) = q4, (q0, a3) = q1, (q0, a1) = q1, (q1, a3) = q2, (q4...
(3.2)
 

> animateDFA(dfa,[a1,a2,a1,a3,a1,a4]);
 

Plot_2d
 

> varSet:= {exp,expp,term,termp,factor,addop,mulop}:
termSet:= {"+","-","*","(",")",number}:
startSymbol:= exp:
prodTable:= table([exp={[term, expp]},expp={[addop,term,expp],[lambda]},
addop={["+"],["-"]},term={[factor,termp]},
termp={[mulop,factor,termp],[lambda]},mulop={["*"]},
factor={["(",exp,")"],[number]}]):
cfg4_4:=mkCFG(varSet,termSet,startSymbol,op(prodTable)):
 

> type(cfg4_4,LL1);
 

true (3.3)
 

> parseLL1(cfg4_4,["(",number,")"],tree=true);
 

Plot_2d
 

> gram:=[{A,B1,B2,C1,C3},{c2,d1,d2,d3,d4},A,{}]:
deri:=[[A]=[B1,B2],[[[B1]=[C1,c2],[[[C1,c2]=[d1,d2,d3],[]]]],[[B2]=[C3],[[[C3]=[d4],[]]]]]];
 

`:=`(deri, [[A] = [B1, B2], [[[B1] = [C1, c2], [[[C1, c2] = [d1, d2, d3], []]]], [[B2] = [C3], [[[C3] = [d4], []]]]]])
`:=`(deri, [[A] = [B1, B2], [[[B1] = [C1, c2], [[[C1, c2] = [d1, d2, d3], []]]], [[B2] = [C3], [[[C3] = [d4], []]]]]])
(3.4)
 

> derivationTree(gram,deri);
 

Plot_2d
 

> Q:={q0,q1,q2,q3}:
Sig:={a,b,c}:
Gam:=Sig union {\Delta}:
F:={q2,q3}:
delta:=table():
delta[(q0,a)]:=[q0,b,R]:
delta[(q0,b)]:=[q1,a,U]: ## Move up
delta[(q1,a)]:=[q1,b,U]: ##
delta[(q1,b)]:=[q2,a,L]: ##
delta[(q2,a)]:=[q2,b,L]: ##
delta[(q2,b)]:=[q3,c,L]: ##
delta[(q3,a)]:=[q2,b,L]: ##
delta[(q3,b)]:=[q1,c,L]: ##

delta[(q0,\Delta)]:=[q1,\Delta,L]:
tm:=TM2D(Q,Sig,Gam,op(delta),q0,\Delta,F);
 

`:=`(tm, TM2D({q0, q1, q2, q3}, {a, b, c}, {a, Delta, b, c}, TABLE([(q0, b) = [q1, a, U], (q3, a) = [q2, b, L], (q2, a) = [q2, b, L], (q3, b) = [q1, c, L], (q1, b) = [q2, a, L], (q2, b) = [q3, c, L], ...
`:=`(tm, TM2D({q0, q1, q2, q3}, {a, b, c}, {a, Delta, b, c}, TABLE([(q0, b) = [q1, a, U], (q3, a) = [q2, b, L], (q2, a) = [q2, b, L], (q3, b) = [q1, c, L], (q1, b) = [q2, a, L], (q2, b) = [q3, c, L], ...
`:=`(tm, TM2D({q0, q1, q2, q3}, {a, b, c}, {a, Delta, b, c}, TABLE([(q0, b) = [q1, a, U], (q3, a) = [q2, b, L], (q2, a) = [q2, b, L], (q3, b) = [q1, c, L], (q1, b) = [q2, a, L], (q2, b) = [q3, c, L], ...
(3.5)
 

> ## Randomly generated tape

xRange:=20:
yRange:=20:
noSymbols:=nops(Sig):

tape:=table():
for i from -floor(xRange/2) to floor(xRange/2) do
for j from -floor(yRange/2) to floor(yRange/2) do
 tmp:=rand(noSymbols)()+1:
 tape[(i,j)]:=op(tmp,Sig):
od:
od:
 

> animateTM(tm,tape,[3,2]);
 

Plot_2d
 

>