⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pa

📁 编译原理-文法等价转换
💻 ~PA
📖 第 1 页 / 共 4 页
字号:
        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 + -