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

📄 mainunit.pas

📁 简单编译器的源代码,是大学课程设计内容,附简单测试用例
💻 PAS
📖 第 1 页 / 共 2 页
字号:
       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.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -