function DFSA = read_dfsa(fname) if strcmp(inputname(1),'fstr') % this is why i love matlab so much fstr = fname; else fstr = file2str(fname); end fstr = lower(fstr); fstr = strrep(fstr,[char(13) char(10)],char(10)); fstr = strrep(fstr,'final','accepting'); fstr = strrep(fstr,'initial','start'); DFSA.ALF = get_alf(fstr); %DFSA.Q = get_states(fstr,'the states'); DFSA.Q = get_states(fstr,'states'); DFSA.F = get_states(fstr,'accepting'); q0 = get_states(fstr,'start'); if (length(q0)~=1) error('bad start state entry'); end DFSA.q0 = q0; dead = get_states(fstr,'dead'); DFSA = setdelta(DFSA,fstr,dead); if ~all(all(DFSA.delta)) warning('DFSA is incomplete'); end return function ALF = get_alf(fstr) if ~isempty(findstr(fstr,'alphabet')) cc = text2cell_adv(fstr,'','"',1); ALF = cc{2}; else % must go the harder route % look at all the letters that govern transitions i = findstr(fstr,'('); fstr=fstr(i:end); cc = text2cell_adv(fstr,'',char(10)); ALF = []; for j=1:length(cc) % ignore entries not containing '->' if ~isempty(findstr(cc{j},'->')) dd = text2cell_adv(cc{j},'',' (),->0123456789'); ALF = [ALF dd{1}]; end end ALF = unique(ALF); end return function qq = get_states(fstr,key) i = findstr(fstr,key); fstr=fstr(i:end); i = findstr(fstr,char(10)); fstr = fstr(1:i); cc = text2cell_adv(fstr,'0123456789',''); qq = []; for j=1:length(cc) qq(end+1) = str2num(cc{j}); end qq = sort(qq); return function DFSA = setdelta(DFSA,fstr,dead) DFSA = init_ddelta(DFSA); i = findstr(fstr,'('); fstr=fstr(i:end); cc = text2cell_adv(fstr,'',char(10)); for j=1:length(cc) % ignore entries not containing '->' if ~isempty(findstr(cc{j},'->')) dd = text2cell_adv(cc{j},[DFSA.ALF '0123456789'],''); q1 = str2num(dd{1}); s = dd{2}; q2 = str2num(dd{3}); for j=1:length(s) DFSA = set_ddelta(DFSA,q1,s(j),q2); end end end if ~isempty(dead) for q=dead for s=DFSA.ALF DFSA = set_ddelta(DFSA,q,s,q); end end end return DFSA = init_ddelta(DFSA); for j=1:length(str) q1 = j; q2 = j+1; %s = double(str(j)); s = str(j); DFSA = set_ddelta(DFSA,q1,s,q2); %for t=setdiff(double(DFSA.ALF),s) for t=setdiff(DFSA.ALF,s) DFSA = set_ddelta(DFSA,q1,t,qd); end end %for t=double(DFSA.ALF) for t=DFSA.ALF DFSA = set_ddelta(DFSA,qd,t,qd); DFSA = set_ddelta(DFSA,qf,t,qd); end return