www.pudn.com > byyl.rar > mainUnit.pas


unit mainUnit; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  StdCtrls, Buttons, ExtCtrls, ComCtrls, ToolWin, Menus, ActnList, ImgList, 
  ShellApi, 
  pcommon,plscan,plparser,plassemb; 
 
type 
  TmainForm = class(TForm) 
    MainMenu1: TMainMenu; 
    StatusBar: TStatusBar; 
    F1: TMenuItem; 
    N1: TMenuItem; 
    O1: TMenuItem; 
    S1: TMenuItem; 
    K1: TMenuItem; 
    N18: TMenuItem; 
    N19: TMenuItem; 
    N20: TMenuItem; 
    N21: TMenuItem; 
    N22: TMenuItem; 
    N23: TMenuItem; 
    PageControl: TPageControl; 
    TabSheet1: TTabSheet; 
    TabSheet2: TTabSheet; 
    TabSheet3: TTabSheet; 
    yuanchengcu: TRichEdit; 
    cifafenxishuchu: TRichEdit; 
    yufayuyifenxishuchu: TRichEdit; 
    OpenDialog: TOpenDialog; 
    SaveDialog: TSaveDialog; 
    TabSheet4: TTabSheet; 
    mubiaodaimashuchu: TRichEdit; 
    errpage: TPanel; 
    TabSheet5: TTabSheet; 
    result: TMemo; 
    error: TRichEdit; 
    CoolBar1: TCoolBar; 
    SpeedButton1: TSpeedButton; 
    SpeedButton2: TSpeedButton; 
    SpeedButton3: TSpeedButton; 
    SpeedButton4: TSpeedButton; 
    N2: TMenuItem; 
    N3: TMenuItem; 
    N5: TMenuItem; 
    SpeedButton6: TSpeedButton; 
    TabSheet6: TTabSheet; 
    help: TRichEdit; 
    procedure newButtonClick(Sender: TObject); 
    procedure yuanchengcuChange(Sender: TObject); 
    procedure SaveButtonClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure X1Click(Sender: TObject); 
    procedure OpenButtonClick(Sender: TObject); 
    procedure A1Click(Sender: TObject); 
    procedure PrintButtonClick(Sender: TObject); 
    procedure UndoButtonClick(Sender: TObject); 
    procedure CutButtonClick(Sender: TObject); 
    procedure CopyButtonClick(Sender: TObject); 
    procedure PasteButtonClick(Sender: TObject); 
    procedure N11Click(Sender: TObject); 
    procedure N13Click(Sender: TObject); 
    procedure FindDialogFind(Sender: TObject); 
    procedure N12Click(Sender: TObject); 
    procedure PL1Click(Sender: TObject); 
    procedure yuanchengcuSelectionChange(Sender: TObject); 
    procedure runClick(Sender: TObject); 
    procedure noerrClick(Sender: TObject); 
    procedure PLInterpreter; 
    procedure ToolButton1Click(Sender: TObject); 
    procedure N16Click(Sender: TObject); 
    procedure BitBtn1Click(Sender: TObject); 
    procedure BitBtn2Click(Sender: TObject); 
    procedure BitBtn3Click(Sender: TObject); 
    procedure BitBtn4Click(Sender: TObject); 
    procedure init; 
    procedure StandardToolBarMouseMove(Sender: TObject; Shift: TShiftState; 
      X, Y: Integer); 
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure yuanchengcuMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure errmsgMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure cifafenxishuchuMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure yufayuyifenxishuchuMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure mubiaodaimashuchuMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure PageControlMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure resultMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure FormShow(Sender: TObject); 
    procedure N3Click(Sender: TObject); 
    procedure SpeedButton6Click(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
 
var 
  mainForm: TmainForm; 
  maindir,filename:string;  Code0:  text;  runobj:boolean; 
 
implementation 
 
 
 
{$R *.DFM} 
 
   {  the PL interpreter  } 
procedure tmainform.PLInterpreter; 
const 
    min=1; 
    max=8191; 
type 
     OperationPart=(Add2,And2,Arrow2,Assign2,Bar2,Call2,constant2,Divide2, 
                    EndPro2,EndProg2,Equal2,Fi2,Greater2,Index2,Less2,Minus2, 
                    Modulo2,Multiply2,Not2,Or2,Proc2,Prog2,Read2,Subtract2, 
                    Value2,Variable2,Write2); 
     String1=string[30]; 
     Store=array[min..max] of integer; 
var 
     St:Store; 
     p,b,s:integer; StackBottom:integer; 
     Running:Boolean; 
   //  ProgramName:String1; 
   //  Code:text; 
 
procedure  Error(LineNo:integer; text1:String1); 
begin 
    Writeln('LineNo',LineNo:5,' ',Text1); Running:=false 
end; 
 
procedure  Allocate(Words:integer); 
begin {writeln; writeln(s);} 
   s:=s+Words;   {writeln(s); } 
   if s>Max then begin Writeln('Stack overflow'); Running:=false end 
end; 
 
{variableAccess::="Variable"[Expression"Index"]} 
procedure Variable(Level,Displ:integer); 
var x:integer; 
begin 
     Allocate(1); x:=b; 
     while Level>0 do begin x:=St[x]; Level:=Level-1 end; 
     St[s]:=x+Displ; p:=p+3 
end; 
 
procedure Index(Bound, LineNo:integer); 
var i:integer; 
begin 
      i:=St[s]; s:=s-1; p:=p+3; 
      if (i<1) or (i>Bound) then  Error(LineNO,'Range Error') 
      else St[s]:=St[s]+i-1 
end; 
 
{ Factor::="constant"| VariableAccess"Value"|Expression|Factor"Not"} 
procedure Constant(Value:integer); 
begin 
    Allocate(1); 
    St[s]:=Value; 
    p:=p+2 
end; 
 
procedure Value; 
begin 
   St[s]:=St[St[s]]; p:=p+1 
end; 
 
procedure  Notx; 
begin 
   St[s]:=1-St[s]; p:=p+1 
end; 
 
 {Term::=Factor # Factor MultiplyingOperator # 
MultiplyingOperator::="Multiply" | "Divide" | "Modulo" } 
procedure Multiply; 
begin 
   p:=p+1; s:=s-1; St[s]:=St[s]*St[s+1] 
end; 
 
procedure Divide; 
begin 
   p:=p+1; s:=s-1; St[s]:=St[s] div St[s+1] 
end; 
 
procedure Modulo; 
begin 
   P:=p+1;  s:=s-1; St[s]:=St[s] mod St[s+1] 
end; 
 
 {SimpleExpression::=Term["Minus"] # Term AddingOperator # 
  AddingOperator::="Add" | "subtract"} 
procedure Minus; 
begin 
  St[s]:=-St[s]; p:=p+1 
end; 
 
procedure Add; 
begin 
   p:=p+1; s:=s-1; St[s]:=St[s]+St[s+1] 
end; 
 
procedure Subtract; 
begin 
   p:=p+1; s:=s-1; St[s]:=St[s]-St[s+1] 
end; 
 
{ primaryExpression::=SimpleExpression [SimpleExpression RelationOperator] 
  RelationlOperator::="Less" | "Equal" | "Greater"} 
procedure Less; 
begin 
   p:=p+1; s:=s-1; St[s]:=ord(St[s]St[s+1]) 
end; 
 
{Expression::=PrimaryExpression # PrimaryExpression PrimaryOperator # 
PrimaryOperator::="And" | "Or" } 
procedure Andx; 
begin 
    p:=p+1; s:=s-1; 
    if St[s]=1 then St[s]:=St[s+1] 
 end; 
 
procedure Orx; 
begin 
   p:=p+1; s:=s-1; 
   if St[s]=0 then St[s]:=St[s+1] 
end; 
 
{Readstatement::=VariableList "Read" 
 VariableList::=VariableAccess # VariableAccess # } 
procedure  Readx(No:integer); 
var tmpstr:string; inp,int:boolean;  x,i:integer; 
begin 
   {  Write('?'); 
     Readln(St[St[s]]);       } 
   p:=p+2; s:=s-No; x:=s; 
   while x'' then 
             begin 
              int:=true; 
              for i:=1 to length(TmpStr) do 
                if not (TmpStr[i] in ['0'..'9']) then int:=false; 
              if int then 
                begin 
                  St[St[x]]:=strtoint(TmpStr); 
                  result.Lines[result.Lines.Count-1]:=' 输 入 : '+ TmpStr; 
                  inp:=true; 
                end 
              else showmessage('出错:类型不匹配!请输入整数!'); 
            end 
          else showmessage('出错:输入不能为空值!请输入整数!'); 
        end 
      else showmessage('出错:你必须输入一个整数,否则程序无法运行!'); 
    end; 
end; 
 
 {WriteStatement::=ExpressionList "Write" 
  ExpressionList::=Expression # Expression # } 
procedure Writex(No:integer); 
var  x:integer; 
begin 
   p:=p+2; s:=s-No; x:=s; 
   while x 0 do 
    begin x :=St[x]; Level := Level -1 end; 
 St[s-2] :=x; St[s-1] := b; St[s] := p +3; b:= s -2; p := Addr 
end; 
 
{ IfStatement ::= GuardedCommandList  "Fi" 
 DoStatement ::= GuardedCommandList 
 GuardedCommandList ::= GuardedCommand # GuardedCommand # 
 GuardedCommand ::= Expression "Arrow" StatementPart "Bar" } 
 
procedure Arrow ( Addr :integer); 
begin 
   if St[s] = ord (true ) then p:= p+2 else p:= Addr; 
   s :=s-1 
end; 
 
procedure Bar (Addr :Integer); 
begin 
   p :=Addr 
end; 
 
procedure Fi (LineNo :Integer); 
begin 
   Error ( LineNo, 'If Statement Fails') 
end; 
 
{ ProcedureDefinition ::= "Proc" Block " EndProc" 
  Block ::= # ProcedureDefinition # StatementPart 
  Statement ::= Empty | ReadStatement | WriteStatement| AssignmentSatemnet 
  ProcedureStatement| IfStatement  | DoStatement } 
procedure Proc (VarLength, Addr :integer); 
begin 
   Allocate (VarLength); p:= Addr  
end; 
 
procedure EndProc; 
begin 
   s:= b-1; p := St[b +2]; b:=St[b+1] 
end; 
 
{ Program ::="Prog" Block "EndProg" } 
procedure Prog (VarLength, Addr :integer); 
begin 
    b := StackBottom; s:= b; Allocate(VarLength +2); P :=Addr 
end; 
 
procedure EndProg; 
begin 
    Running := false 
end; 
 
procedure LoadProgram; 
var x:integer; 
begin 
   x:=Min; 
   While not Eof(Code0 ) do 
     begin 
       readln(Code0, St[x]); 
       x:= x+1 
     end; 
   StackBottom :=x 
end; 
 
procedure RunProgram; 
var op, op5:integer; 
begin 
   Running:=true; 
   p :=min; 
   while Running do 
   begin 
     op :=St[p]; op5 :=op div 5; 
     case op5 of 
     0: case op of 
        0 {add2}   :add; 
        1 {And2}   :Andx; 
        2 {Arrow2} :Arrow(St[p+1]); 
        3 {Assign2}:AssignValue(St[p+1]); 
        4 {bar2}   :Bar(St[p+1]) 
       end; 
      1: case op of 
        5 {Call2}    : Callx(St[p+1],St[p+2]); 
        6 {constant2}: Constant (St[p+1]); 
        7 {divide2}  :Divide; 
        8 {EndProc2} :EndProc; 
        9 {EndProg2} :EndProg 
      end; 
      2: case op of 
       10{Equal2}   :Equal; 
       11{Fi2}      :Fi(St[p+1]); 
       12{Greater2} :Greater; 
       13{Index2}   :Index(St[p+1],St[p+2]); 
       14{Less2}    :Less 
       end; 
      3: case op of 
        15{Minus2}    :Minus; 
        16{Modulo2}   :Modulo; 
        17{Multiply2} :Multiply; 
        18{not2}      :Notx; 
        19{or2}       :Orx 
        end; 
      4: case op of 
        20{Proc2}      :Proc(St[p+1],St[p+2]); 
        21{Prog2}      :Prog(St[p+1],St[p +2]); 
        22{read2}      :Readx(St[p+1]); 
        23{subtract2}  :Subtract; 
        24{value2}     :Value 
        end; 
      5: case op of 
        25{variable2}  :Variable(St[p+1],St[p+2]); 
        26{write2}     :Writex(St[p+1]) 
       end 
     end { case op5 } 
   end {while} 
end; 
 
 {  PL Interpreter  } 
begin 
   result.Lines.Add('  '); 
   assignfile(Code0, ChangeFileExt(filename,'.COD')); 
   Reset(Code0); 
   LoadProgram; 
   RunProgram; 
   Closefile(Code0); 
   result.Lines.Add('  '); 
   StatusBar.Panels[4].Text:='程序结束!'; 
end; 
 
 
procedure TmainForm.newButtonClick(Sender: TObject); 
begin 
   yuanchengcu.Lines.Clear ; 
   yuanchengcu.Lines.Add('begin'); 
   yuanchengcu.Lines.add('   '); 
   yuanchengcu.Lines.Add('end.'); 
   filename:=maindir+'kechengshiji.pl'; 
   init; 
   PageControl.ActivePage:=TabSheet1; 
   cifafenxishuchu.Lines.Clear ; 
   yufayuyifenxishuchu.Lines.Clear ; 
   mubiaodaimashuchu.Lines.Clear ; 
   result.Lines.Clear ;    
end; 
 
procedure TmainForm.yuanchengcuChange(Sender: TObject); 
begin 
 
   s1.Enabled :=true; 
end; 
 
procedure TmainForm.SaveButtonClick(Sender: TObject); 
begin 
   if filename=maindir+'kechengsiji.pl' then 
      A1Click(nil)   //save as 
   else 
     begin 
       s1.Enabled :=false; 
       yuanchengcu.Lines.SaveToFile(filename); 
     end; 
end; 
 
procedure TmainForm.FormCreate(Sender: TObject); 
begin 
   runobj:=true; 
   maindir:=extractfilepath(paramstr(0)); 
   newButtonClick(nil); 
   OpenDialog.InitialDir:=maindir; 
   SaveDialog.InitialDir:=maindir; 
end; 
 
procedure TmainForm.X1Click(Sender: TObject); 
begin 
   close; 
end; 
 
procedure TmainForm.OpenButtonClick(Sender: TObject); 
begin 
  if OpenDialog.Execute then 
    if fileexists(OpenDialog.FileName) then 
     begin 
      OpenDialog.InitialDir:=OpenDialog.GetNamePath; 
      filename:=OpenDialog.FileName; 
      yuanchengcu.Lines.LoadFromFile(filename); 
      mainform.Caption :='Project Language 1.0 - '+ChangeFileExt(ExtractFileName(filename),''); 
  //    savebutton.Enabled:=false; 
      s1.Enabled :=false; 
      init; 
      PageControl.ActivePage:=TabSheet1; 
      cifafenxishuchu.Lines.Clear ; 
      yufayuyifenxishuchu.Lines.Clear ; 
      mubiaodaimashuchu.Lines.Clear ; 
      result.Lines.Clear ; 
     end 
    else 
     begin 
       showmessage('你指定的文件“'+OpenDialog.FileName 
                   +'”不存在!请指定另外的PL程序文件!'); 
       OpenButtonClick(nil); 
     end; 
end; 
 
procedure TmainForm.A1Click(Sender: TObject); 
begin 
   if saveDialog.Execute then 
     begin 
      saveDialog.InitialDir:=saveDialog.GetNamePath; 
      filename:=saveDialog.FileName; 
      if copy(yuanchengcu.Lines[0],1,12)='$ PL Program' then 
        yuanchengcu.Lines[0]:='$ PL Program '+ChangeFileExt(ExtractFileName(filename),''); 
      mainform.Caption :='Project Language 1.0 - '+ChangeFileExt(ExtractFileName(filename),''); 
      yuanchengcu.Lines.SaveToFile(filename); 
  //    savebutton.Enabled:=false; 
      s1.Enabled :=false; 
     end; 
end; 
 
procedure TmainForm.PrintButtonClick(Sender: TObject); 
begin 
  { if filename=maindir+'unname.pl' then 
      showmessage('请先保存文件再打印!') 
   else 
      if PrintDialog.Execute then 
         souce.Print(filename);  } 
end; 
 
procedure TmainForm.UndoButtonClick(Sender: TObject); 
begin 
   with yuanchengcu do 
     if HandleAllocated then SendMessage(Handle, EM_UNDO, 0, 0); 
end; 
 
procedure TmainForm.CutButtonClick(Sender: TObject); 
begin 
   yuanchengcu.CutToClipboard ; 
end; 
 
procedure TmainForm.CopyButtonClick(Sender: TObject); 
begin 
   yuanchengcu.CopyToClipboard ; 
end; 
 
procedure TmainForm.PasteButtonClick(Sender: TObject); 
begin 
   yuanchengcu.PasteFromClipboard; 
end; 
 
procedure TmainForm.N11Click(Sender: TObject); 
begin 
    yuanchengcu.SelectAll; 
end; 
 
procedure TmainForm.N13Click(Sender: TObject); 
begin 
 {  FindDialog.Position := Point(mainForm.Left + 50, mainForm.Top+50); 
   FindDialog.Execute;  } 
end; 
 
procedure TmainForm.FindDialogFind(Sender: TObject); 
var 
  FoundAt: LongInt; 
  StartPos, ToEnd,i: Integer; 
begin 
  with yuanchengcu do 
  begin 
    StartPos := 0; 
    for i:=1 to CaretPos.y do 
      StartPos:=StartPos+length(lines[i-1])+2 ; 
    StartPos:=StartPos+CaretPos.x ; 
    ToEnd := Length(Text) - StartPos; 
   // FoundAt := FindText(FindDialog.FindText, StartPos, ToEnd, [stMatchCase]); 
    if FoundAt <> -1 then 
      begin 
        SetFocus; 
        SelStart := FoundAt; 
     //   SelLength := Length(FindDialog.FindText); 
      end 
    else 
      begin 
      //  FindDialog.CloseDialog ; 
      //  showmessage('找不到字符串“'+FindDialog.FindText+'”!'); 
      end; 
  end; 
end; 
 
procedure TmainForm.N12Click(Sender: TObject); 
begin 
   ShellExecute(0,nil,pchar(maindir+'help\plhelp.hlp'),nil,nil,SW_NORMAL); 
end; 
 
procedure TmainForm.PL1Click(Sender: TObject); 
begin 
  // aboutbox.show;    
end; 
 
procedure TmainForm.yuanchengcuSelectionChange(Sender: TObject); 
begin 
   StatusBar.Panels[1].Text:= ' '+inttostr(yuanchengcu.CaretPos.y+1)+' 行 '; 
end; 
 
procedure TmainForm.runClick(Sender: TObject); 
var codname:string; 
begin 
   yuanchengcu.Lines.SaveToFile(filename); 
   assignfile(Notes, maindir+'PLNotes.ERR' ); 
   Rewrite(Notes); 
   assignfile(Input1, filename); 
   Reset(Input1); 
   assignfile(Output1, maindir+'PLTemp1.DAT' ); 
   Rewrite(Output1); 
   Errors := false;  Emitting := true; 
   Pass1;     //  do the first pass 
   Closefile(Input1); 
   Closefile(Output1); 
   cifafenxishuchu.Lines.LoadFromFile(maindir+'PLTemp1.DAT'); 
   if not Errors then 
      begin 
         assignfile(Input1, maindir+'PLTemp1.DAT' ); 
         Reset(Input1); 
         assignfile(Output1, maindir+'PLTemp2.DAT' ); 
         Rewrite(Output1); 
         Pass2;  // do the second pass 
         Closefile(Input1); 
         Closefile(Output1); 
         yufayuyifenxishuchu.Lines.LoadFromFile(maindir+'PLTemp2.DAT'); 
     end; 
  if not Errors then 
     begin 
        assignfile(Input1, maindir+'PLTemp2.DAT' ); 
        reset(Input1); 
        codname:=ChangeFileExt(filename,'.COD'); 
        assignfile(Output1,  codname ); 
        Rewrite(Output1); 
        Emitting := false; 
        Pass3;   // do the third pass 
        Closefile(Input1); 
        Closefile(Output1); 
        mubiaodaimashuchu.Lines.LoadFromFile(codname); 
     end; 
  Closefile(Notes); 
  if Errors then 
       begin 
          if not errpage.Visible then 
            begin 
              yuanchengcu.Height:=yuanchengcu.Height-75; 
              errpage.Visible:=true; 
            end; 
           
          error.Lines.LoadFromFile(maindir+'PLNotes.ERR'); 
          error.Lines.add(''); 
          error.Lines.add('程序有错,请分步执行查错!'); 
          StatusBar.Panels[4].Text:='程序有错,无法执行,请分步执行查错!' 
 
       end 
  else 
    begin 
      if errpage.Visible then noerrClick(nil); 
      if runobj then 
         begin 
           PageControl.ActivePage:=TabSheet5; 
           PLInterpreter; 
         end 
       else 
         begin 
           PageControl.ActivePage:=TabSheet1; 
           runobj:=true; 
           showmessage('      程序编译正确!       '); 
         end; 
       init;          
     end; 
end; 
 
procedure TmainForm.noerrClick(Sender: TObject); 
begin 
    errpage.Visible:=false; 
    yuanchengcu.Height:=yuanchengcu.Height+75; 
end; 
 
procedure TmainForm.ToolButton1Click(Sender: TObject); 
begin 
   result.Lines.Clear ; 
end; 
 
procedure TmainForm.N16Click(Sender: TObject); 
begin 
    runobj:=false; 
    runClick(nil); 
end; 
 
procedure TmainForm.BitBtn1Click(Sender: TObject); 
begin 
   yuanchengcu.Lines.SaveToFile(filename); 
   assignfile(Notes, maindir+'PLNotes.ERR' ); 
   Rewrite(Notes); 
   assignfile(Input1, filename); 
   Reset(Input1); 
   assignfile(Output1, maindir+'PLTemp1.DAT' ); 
   Rewrite(Output1); 
   Errors := false;  Emitting := true; 
   Pass1;     //  do the first pass 
   Closefile(Input1); 
   Closefile(Output1); 
   cifafenxishuchu.Lines.LoadFromFile(maindir+'PLTemp1.DAT'); 
   Closefile(Notes); 
   if Errors then 
     begin 
       if not errpage.Visible then 
         begin 
           n21.Enabled :=false; 
           errpage.Visible:=true; 
         end; 
       error.Lines.LoadFromFile(maindir+'PLNotes.ERR'); 
       error.Lines.add('有词法错误!'); 
       PageControl.ActivePage:=TabSheet1; 
       StatusBar.Panels[4].Text:='有词法错误!'; 
     end 
   else 
     begin 
       n21.Enabled :=true; 
       if errpage.Visible then noerrClick(nil); 
       PageControl.ActivePage:=TabSheet2; 
       StatusBar.Panels[4].Text:='通过词法分析!'; 
 
    end; 
   n22.Enabled :=false; 
   n23.Enabled :=false; 
   yufayuyifenxishuchu.Lines.Clear ; 
   mubiaodaimashuchu.Lines.Clear ; 
   result.Lines.Clear ; 
end; 
 
procedure TmainForm.BitBtn2Click(Sender: TObject); 
begin 
   if not Errors then 
      begin 
         assignfile(Notes, maindir+'PLNotes.ERR' ); 
         Rewrite(Notes); 
         assignfile(Input1, maindir+'PLTemp1.DAT' ); 
         Reset(Input1); 
         assignfile(Output1, maindir+'PLTemp2.DAT' ); 
         Rewrite(Output1); 
         Pass2;  // do the second pass 
         Closefile(Input1); 
         Closefile(Output1); 
         yufayuyifenxishuchu.Lines.LoadFromFile(maindir+'PLTemp2.DAT'); 
         Closefile(Notes); 
     end; 
   if Errors then 
     begin 
       n22.Enabled :=false; 
       if not errpage.Visible then 
         begin 
           errpage.Visible:=true; 
         end; 
       error.Lines.LoadFromFile(maindir+'PLNotes.ERR'); 
       error.Lines.add('语法或语义错误!'); 
       PageControl.ActivePage:=TabSheet1; 
       StatusBar.Panels[4].Text:='有语法或语义错误!'; 
     end 
   else 
     begin 
       n22.Enabled :=true; 
       if errpage.Visible then noerrClick(nil); 
       PageControl.ActivePage:=TabSheet3; 
       StatusBar.Panels[4].Text:='通过语法、语义分析!'; 
    end; 
   n23.Enabled :=false; 
end; 
 
procedure TmainForm.BitBtn3Click(Sender: TObject); 
var codname:string; 
begin 
  if not Errors then 
     begin 
        assignfile(Notes, maindir+'PLNotes.ERR' ); 
        Rewrite(Notes); 
        assignfile(Input1, maindir+'PLTemp2.DAT' ); 
        reset(Input1); 
        codname:=ChangeFileExt(filename,'.COD'); 
        assignfile(Output1,  codname ); 
        Rewrite(Output1); 
        Emitting := false; 
        Pass3;   // do the third pass 
        Closefile(Input1); 
        Closefile(Output1); 
        mubiaodaimashuchu.Lines.LoadFromFile(codname); 
        Closefile(Notes); 
     end; 
   if Errors then 
     begin 
       n23.Enabled :=false; 
       if not errpage.Visible then 
         begin 
           yuanchengcu.Height:=yuanchengcu.Height-75; 
           errpage.Visible:=true; 
         end; 
       error.Lines.LoadFromFile(maindir+'PLNotes.ERR'); 
       error.Lines.add('代码生成发生错误!'); 
       PageControl.ActivePage:=TabSheet1; 
       StatusBar.Panels[4].Text:='代码生成发生错误!'; 
 
     end 
   else 
     begin 
       n23.Enabled :=true; 
       if errpage.Visible then noerrClick(nil); 
       PageControl.ActivePage:=TabSheet4; 
      StatusBar.Panels[4].Text:='代码成功生成!'; 
    end; 
end; 
 
procedure TmainForm.BitBtn4Click(Sender: TObject); 
begin 
  if not Errors then 
    begin 
      PageControl.ActivePage:=TabSheet5; 
      PLInterpreter; 
       n21.Enabled :=false; 
       n22.Enabled :=false; 
       n23.Enabled :=false; 
    end;   
end; 
 
procedure TmainForm.init; 
begin 
   if errpage.Visible then noerrClick(nil); 
   n21.Enabled :=false; 
   n22.Enabled :=false; 
   n23.Enabled :=false; 
end; 
 
procedure TmainForm.StandardToolBarMouseMove(Sender: TObject; 
  Shift: TShiftState; X, Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.yuanchengcuMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.errmsgMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.cifafenxishuchuMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.yufayuyifenxishuchuMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.mubiaodaimashuchuMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.PageControlMouseMove(Sender: TObject; 
  Shift: TShiftState; X, Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.resultMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
   StatusBar.Panels[2].Text:=''; 
end; 
 
procedure TmainForm.FormClose(Sender: TObject; var Action: TCloseAction); 
var saveword:word; 
begin 
   // if savebutton.Enabled then 
      begin 
       saveword:=MessageDlg('是否保存对程序文件“'+ChangeFileExt(ExtractFileName(filename),'')+'”的修改?', 
           mtWarning, mbYesNoCancel, 1); 
       if saveword = mrYes then 
         begin 
           SaveButtonClick(nil); 
    //       if savebutton.Enabled then abort; 
         end 
       else if saveword = mrCancel then 
         abort; 
      end; 
    if fileexists(maindir+'unname.pl') then  deletefile(maindir+'unname.pl'); 
    if fileexists(maindir+'unname.cod') then  deletefile(maindir+'unname.cod'); 
end; 
 
procedure TmainForm.FormShow(Sender: TObject); 
begin 
   mainForm.WindowState:=wsmaximized; 
end; 
 
procedure TmainForm.N3Click(Sender: TObject); 
begin 
close; 
end; 
 
procedure TmainForm.SpeedButton6Click(Sender: TObject); 
begin 
close; 
end; 
 
end.