📄 unit1.~pa
字号:
prepare;
compute;
cansave:=true;
setview;
seteview;
setnewview;
setnewview1;
waitd.hide;
end;
end;
function TForm1.fzjhave:string;
var i:integer;
j:integer;
temp:string;
begin
temp:='';
fzjhave:='';
if ccss.count=fzjnum
then exit;
for i:=1 to fzjnum do
begin
j:=1;
while (j<=ccss.count) and (ccss.cans[j].parent.index<>fzjfuhao[i].index) do
j:=j+1;
if j>ccss.count
then
begin
temp:=temp+' '+fzjfuhao[i].name;
end;
end;
fzjhave:=temp;
end;
procedure TForm1.prepare;
var i:integer;
begin
emtry.emtry;
for i:=ccss300.count downto 1 do
begin
ccss300.delete(i);
end;
for i:=ccssnew.count downto 1 do
begin
ccssnew.delete(i);
end;
for i:=ccssnew1.count downto 1 do
begin
ccssnew1.delete(i);
end;
fzjnumnew:=0;
fzjnumnew1:=0;
for i:=1 to ccss.count do
begin
ccss.cans[i].setsi(1);
ccss.cans[i].refreshff;
repeat
if ccss.cans[i].get.index<=300
then
begin
ccss.cans[i].addfirst(ccss.cans[i].get.index);
end;
ccss.cans[i].setflag(true);
until ccss.cans[i].next;
end;
i:=1;
while (i<=ccss.count) and (ccss.cans[i].parent.index<>startnum) do
i:=i+1;
if i<=ccss.count
then
begin
ccss.cans[i].addfellow(0);
end;
for i:=1 to fzjnum do
begin
fzjfuhaonew[i].index:=fzjfuhao[i].index;
fzjfuhaonew[i].name:=fzjfuhao[i].name;
end;
fzjnumnew:=fzjnum;
end;
procedure Tform1.compute;
label 1;
var i:integer;
ifend,ifemtry:boolean;
j:integer;
can:cansensi;
newf:fensensi;
tempcan:cansensi;
tempf:fensensi;
num:integer;
i1,i2:integer;
temps:string;
begin
waitd.label1.caption:='计算First 集合';
waitd.BiGauge1.value:=0;
waitd.update;
ifend:=true;
repeat
ifend:=true;
i:=1;
while (i<=ccss.count)and(not ccss.cans[i].parent.res) do
begin
i:=i+1;
end;
if (i<=ccss.count)
then
begin
ifend:=false;
ccss.cans[i].parent.setflag(false);
for j:=1 to ccss.count do
begin
{ waitd.label2.caption:=stringgrid2.cells[1,j];
waitd.update;}
ccss.cans[j].setsi(1);
repeat
repeat
if ccss.cans[j].get.index=ccss.cans[i].parent.index
then
begin
ccss.cans[i].first.setsi;
while not (ccss.cans[i].first.next) do
begin
if ccss.cans[i].first.get.index<300
then
begin
ccss.cans[j].addfirst(ccss.cans[i].first.get.index);
end;
end;
if ccss.cans[i].first.ifhave(300)
then
begin
if not (ccss.cans[j].sunnext)
then
begin
ccss.cans[j].setflag(true);
end
else
begin
ccss.cans[j].addfirst(300);
end;
end;
end
until (ccss.cans[j].sunnext) or (ccss.cans[j].get.res=false);
until ccss.cans[j].next;
end;
end;
until ifend;
(*计算为空集合*)
waitd.label1.caption:='计算空 集合';
waitd.BiGauge1.value:=25;
waitd.update;
for i:=1 to ccss.count do
begin
if ccss.cans[i].first.ifhave(300)
then
begin
emtry.add(ccss.cans[i].parent.index);
end;
end;
for i:=1 to ccss.count do
begin
ccss.cans[i].setsi(1);
tempcan:=cansensi.init2(ccss.cans[i].parent.index);
repeat
ccss.cans[i].now.setsi;
if not ((ccss.cans[i].now.ifeof) and (ccss.cans[i].now.get.index=300))
then
begin
newf:=fensensi.init3(ccss.cans[i].now);
newf.setsi;
num:=0;
repeat
if (newf.get.index>300)
then
begin
j:=ccss.gofuhao(newf.get.index);
if ccss.cans[j].first.ifhave(300)
then
begin
newf.setflag(true);
num:=num+1;
end;
end;
until newf.next;
i2:=1;
i2:=i2 shl num;
for i1:=0 to i2-1 do
begin
tempcan.add(newf,i1);
end;
newf.done;
end;
until ccss.cans[i].next;
if tempcan.scansisi<>nil
then ccss300.add2(tempcan)
else tempcan.done;
end;
waitd.label1.caption:='化简文法';
waitd.BiGauge1.value:=50;
waitd.update;
if ccss300.count<ccss.count
then
begin
emtry.emtry;
for i:=1 to fzjnum do
begin
if ccss300.gofuhao(fzjfuhao[i].index)=-1
then
begin
emtry.add(fzjfuhao[i].index);
end;
end;
emtry.setsi;
while not emtry.next do
begin
for i:=1 to ccss300.count do
begin
if ccss300.cans[i].subfuhao(emtry.get.index)
then
begin
emtry.add(ccss300.cans[i].parent.index);
ccss300.delete(i);
end
end;
end;
end;
if ccss300.gofuhao(startnum)<>-1
then
begin
i:=ccss.gofuhao(startnum);
ccss.cans[i].setsi(1);
ifend:=false;
repeat
if (ccss.cans[i].now.ifeof) and (ccss.cans[i].now.get.index=300)
then
begin
ifend:=true;
end;
until ccss.cans[i].next or ifend;
if ifend
then
begin
for i:=1 to ccss300.count do
begin
ccss300.cans[i].setsi(1);
repeat
repeat
if ccss300.cans[i].now.get.index=startnum
then
begin
goto 1;
end;
until ccss300.cans[i].now.next
until ccss300.cans[i].next;
end;
i:=ccss300.gofuhao(startnum);
tempf:=fensensi.init2(300);
ccss300.cans[i].add(tempf,1);
tempf.done;
end;
1:for i:=1 to ccss300.count do
begin
ccssnew.add3(ccss300.cans[i]);
end;
(*消除左递归*)
waitd.label1.caption:='消除左递规';
waitd.BiGauge1.value:=75;
waitd.update;
for i:=1 to ccssnew.count do
begin
for j:=1 to i-1 do
begin
ccssnew.cans[i].setsi(1);
repeat
if ccssnew.cans[i].get.index=ccssnew.cans[j].parent.index
then
begin
ccssnew.cans[i].change(ccssnew);
end;
until ccssnew.cans[i].next
end;
if ccssnew.cans[i].change1(ccssnew)<0 (*消除左递归*)
then
begin
Application.MessageBox('Error!', 'ERROR', mb_OK);
exit;
end;
end;
(*消除多余产生式*)
emtry.emtry;
emtry.add(startnum);
while not emtry.next do
begin
i:=ccssnew.gofuhao(emtry.get.index);
ccssnew.cans[i].setsi(1);
repeat
repeat
if ccssnew.cans[i].now.get.index>300
then
begin
emtry.add(ccssnew.cans[i].now.get.index);
end;
until ccssnew.cans[i].now.next;
until ccssnew.cans[i].next;
end;
end
else
begin
emtry.emtry;
emtry.add(startnum);
temps:='';
temps:=findname(startnum);
temps:=temps+'='+findname(300);
ccssnew.add(temps);
ccss300.add(temps);
end;
end;
procedure Tform1.setview;
var i:integer;
temp1,temp2:string;
temp:string;
temp4:string;
begin
for i:=1 to ccss.count do
begin
temp1:='';
temp2:='';
ccss.cans[i].first.setsi;
while not (ccss.cans[i].first.next) do
begin
temp4:=findname(ccss.cans[i].first.get.index);
temp1:=temp1+' '+temp4;
end;
ccss.cans[i].fellow.setsi;
while not (ccss.cans[i].fellow.next) do
begin
temp4:=findname(ccss.cans[i].fellow.get.index);
temp2:=temp2+' '+temp4;
end;
temp:=form1.findname(ccss.cans[i].parent.index);
end;
end;
procedure Tform1.seteview;
var i:integer;
temp1,temp2:string;
temp:string;
temp4:string;
begin
stringgrid4.rowcount:=ccss.count+1;
for i:=1 to ccss.count do
begin
temp1:='';
temp2:='';
ccss.cans[i].first.setsi;
while not (ccss.cans[i].first.next) do
begin
temp4:=findname(ccss.cans[i].first.get.index);
temp1:=temp1+' '+temp4;
end;
temp:=form1.findname(ccss.cans[i].parent.index);
stringgrid4.cells[0,i]:=temp;
stringgrid4.cells[1,i]:=temp1;
if ccss.cans[i].first.ifhave(300)
then
begin
if stringgrid5.cells[0,stringgrid5.rowcount-1]<>''
then stringgrid5.rowcount:=stringgrid5.rowcount+1;
stringgrid5.cells[0,stringgrid5.rowcount-1]:=inttostr(ccss.cans[i].parent.index);
stringgrid5.cells[1,stringgrid5.rowcount-1]:=findname(ccss.cans[i].parent.index);
end;
end;
stringgrid6.rowcount:=ccss300.count+1;
for i:=1 to ccss300.count do
begin
stringgrid6.cells[0,i]:=inttostr(i);
stringgrid6.cells[1,i]:=ccss300.cans[i].getcanssi;
end;
end;
procedure Tform1.setnewview;
var i:integer;
begin
stringgrid7.rowcount:=fzjnumnew+1;
for i:=1 to fzjnumnew do
begin
stringgrid7.cells[0,i]:=inttostr(fzjfuhaonew[i].index);
stringgrid7.cells[1,i]:=fzjfuhaonew[i].name;
end;
stringgrid8.rowcount:=zjnum+1;
for i:=1 to zjnum do
begin
stringgrid8.cells[0,i]:=inttostr(zjfuhao[i].index);
stringgrid8.cells[1,i]:=zjfuhao[i].name;
end;
stringgrid9.rowcount:=ccssnew.count+1;
for i:=1 to ccssnew.count do
begin
stringgrid9.cells[0,i]:=inttostr(i);
stringgrid9.cells[1,i]:=ccssnew.cans[i].getnewcanssi;
end;
end;
procedure Tform1.setnewview1;
var i,j,z:integer;
begin
stringgrid10.rowcount:=emtry.getcount+1;
stringgrid12.rowcount:=emtry.getcount+1;
emtry.setsi;
i:=1;
while not emtry.next do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -