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

📄 expmain.pas

📁 编译原理源程序扫描
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      strAWord := strAWord + strChar;
      intPos := intPos + 1;//读指针向前移动一位
    end;
    showWord(strAWord,intType,intExp);//显示运算符
  end;
  WordProcess := intPos;//返回当前指针位置
end;

//显示字符或单词
//参数:
//  strWord:要显示的字符或单词
//  intC: 当前strWord的类型,决于显示的颜色
//  intExp: 当前实验
procedure TfrmMain.ShowWord(strWord: String;intC,intExp: Integer);
begin
  if strWord=#13 then   //处理回车
  begin
    intY := intY +intH;
    intX := 5;
    exit
  end;
  intX := intX + ShowLabel(intX,intY,intC,strWord);//正常情况下显示单词
  if Length(Trim(strWord))=0 then exit;
  if intExp=2 then  //显示所识别的单词或各类符号,应用于实验二
    memClass.Text := memClass.Text+'('+IntToStr(intC)+',“'+strWord+'”)'+#13+#10
  else if intExp=3 then //显示所识别的合法或非法的实数
    if intC=4 then
      memClass.Text := memClass.Text+strWord+'  接受'+#13+#10
    else if intC=-1 then
      memClass.Text := memClass.Text+strWord+'  不接受'+#13+#10;
end;



//初使化各变量
procedure TfrmMain.InitPro;
begin
  //定义空格
  SPACE := ' ';
  //定义运算符常量
  operator[1] := '+';
  operator[2] := '-';
  operator[3] := '*';
  operator[4] := '/';
  operator[5] := '=';
  operator[6] := '>';
  operator[7] := '<';
  operator[8] := '>=';
  operator[9] := '<=';
  operator[10] := '!=';
  //定义分隔符常量
  separator[1] := ',';
  separator[2] := ';';
  separator[3] := '{';
  separator[4] := '}';
  separator[5] := '(';
  separator[6] := ')';
  separator[7] := '[';
  separator[8] := ']';
  //定义保留字
  reservedwords[1] := 'int';
  reservedwords[2] := 'if';
  reservedwords[3] := 'for';
  reservedwords[4] := 'while';
  reservedwords[5] := 'do';
  reservedwords[6] := 'return';
  reservedwords[7] := 'break';
  reservedwords[8] := 'continue';
  reservedwords[9] := '#include';
  reservedwords[10] := '#define';
  reservedwords[11] := 'const';
  reservedwords[12] := 'void';
  //定义颜色
  AColor[0] := clBlack;   //黑
  AColor[1] := clBlue;    //蓝 保留字
  AColor[2] := clGreen;   //紫 运算符
  AColor[3] := clDkGray;  //灰 分隔符
  AColor[4] := clRed;     //红 实数
  AColor[5] := clGreen;   //绿 关键字
  //定义位置
  intX := 5;
  intY := 0;
  intH := 18;
end;

//删除动态创建的Label控件
procedure TfrmMain.FreeLabel;
var
  intI: Integer;
begin
  for intI:=panText.ControlCount-1 downto 0 do begin
    if panText.Controls[intI] is TLabel then
      panText.Controls[intI].Free;
  end;
  intX := 5;
  intY := 0;
end;

procedure TfrmMain.N7Click(Sender: TObject);
begin
  Self.Close;
end;
//实验一:源程序的扫描
procedure TfrmMain.btnOneClick(Sender: TObject);
var
  //intI存储当前位置
  //intLen存储字符长度
  intI,intLen: Integer;
begin
  //界面处理代码
  Gauge1.Progress := 0;
  Gauge1.Visible := true;
  memText.Visible := true;
  memText.ReadOnly := true;
  memText.Font.Color := clBlue;
  panText.Visible := false;
  ToolBar1.Enabled := false;

  //将输入的字符存入缓冲区strText
  strText := memText.Text;
  memText.Text := '';
  intLen := Length(strText);
  for intI := 1 to intLen do
  begin
    //一个个读出字符
    memText.Text := memText.Text + GetChar(strText,intI);
    //延时,演示用
    Delay(20);
    //设置进度条,演示用
    SetGauge(intI,intLen);
  end;
  
  //界面处理代码
  ToolBar1.Enabled := true;
  Gauge1.Visible := false;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  InitPro;//初始化各变量
  //界面处理代码
  memText.Align := alClient;
  panText.Align := alClient;
  memText.Visible := true;
  panText.Visible := false;
  memText.Text := '';
end;

//实验二:词法分析
procedure TfrmMain.btnTwoClick(Sender: TObject);
var
  strAWord,strChar: String; //用来暂存从缓冲区中读出的字符,或单词
  intPos: Integer;          //存储当前所读的位置
  intLen: Integer;          //存储缓冲区中字符的长度
  intType: Integer;         //存储当前字符的类型
begin
  //界面处理代码
  FreeLabel;
  memClass.Text := '';
  Gauge1.Progress := 0;
  Gauge1.Visible := true;
  memText.Visible := false;
  panText.Visible := true;
  ToolBar1.Enabled := false;
  //将输入的字符存入缓冲区strText
  strText := memText.Text;
  intLen := Length(strText);
  strAWord := '';
  intPos := 1;
  while intPos<=intLen do
  begin
    //设置进度条,演示用
    SetGauge(intPos,intLen);
    //读取当前位置的字符
    strChar := GetChar(strText,intPos);
    //判断所读取的字符类型
    intType := IsOver(strChar);
    //非零时,表示已读完一个单词
    if intType<>0 then
    begin
      //处理所读到的单词以及结束该单词的字符,并将读指针向前移动
      intPos := WordProcess(intType,intPos,2,strAWord,strChar) + 1;
      strAWord := '';
      continue;
    end;
    //将所读到的字符加入当前单词
    strAWord := strAWord + strChar;
    if intPos=intLen then
      //当缓冲区中最后一个字符为非分隔符的常规字符时
      //所读取到的单词将无法在前面的代码中显示出来
      //因此在此处进行处理
      ShowWord(strAWord,WhatType(Trim(strAWord),2),2);
    //读指针向前移动
    intPos := intPos + 1;
  end;
  //界面处理代码
  ToolBar1.Enabled := true;
  Gauge1.Visible := false;
end;

//新建文档
procedure TfrmMain.N2Click(Sender: TObject);
begin
  strText := '';
  memText.Text := '';
  memText.Visible := true;
  panText.Visible := false;
  memText.ReadOnly := false;
  memText.Font.Color := clBlack;
end;

//实验三:有限自动机
//    加入了识另常规正实数有限自动机的词法分析
procedure TfrmMain.btnThreeClick(Sender: TObject);
var
  strAWord,strChar: String; //用来暂存从缓冲区中读出的字符,或单词
  intPos: Integer;          //存储当前所读的位置
  intLen: Integer;          //存储缓冲区中字符的长度
  intType: Integer;         //存储当前字符的类型
begin
  //界面处理代码
  FreeLabel;
  memClass.Text := '';
  Gauge1.Progress := 0;
  Gauge1.Visible := true;
  memText.Visible := false;
  panText.Visible := true;
  ToolBar1.Enabled := false;
  strText := memText.Text;
  //将输入的字符存入缓冲区strText
  intLen := Length(strText);
  strAWord := '';
  intPos := 1;
  while intPos<=intLen do
  begin
    //设置进度条,演示用
    SetGauge(intPos,intLen);
    //读取当前位置的字符
    strChar := GetChar(strText,intPos);
    //判断所读取的字符类型
    intType := IsOver(strChar);
    //非零时,表示已读完一个单词
    if intType<>0 then
    begin
      //处理所读到的单词以及结束该单词的字符,并将读指针向前移动
      intPos := WordProcess(intType,intPos,3,strAWord,strChar) + 1;
      strAWord := '';
      continue;
    end;
    //将所读到的字符加入当前单词
    strAWord := strAWord + strChar;
    if intPos=intLen then
      //当缓冲区中最后一个字符为非分隔符的常规字符时
      //所读取到的单词将无法在前面的代码中显示出来
      //因此在此处进行处理
      ShowWord(strAWord,WhatType(Trim(strAWord),3),3);
    //读指针向前移动
    intPos := intPos + 1;
  end;
  //界面处理代码
  ToolBar1.Enabled := true;
  Gauge1.Visible := false;
end;

//设置进度条
procedure TfrmMain.SetGauge(intP,intT: Integer);
begin
  Gauge1.Progress := Round((intP/intT)*100);
  Application.ProcessMessages;
end;

//打开文件
procedure TfrmMain.N3Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    memText.Lines.LoadFromFile(OpenDialog1.FileName)
  else
    memText.Lines.Clear;
  //进入编辑状态
  memText.Font.Color := clBlack;
  memText.ReadOnly := false;
  memText.Visible := true;
  panText.Visible := false;
end;

//保存文件
procedure TfrmMain.N4Click(Sender: TObject);
begin
if SaveDialog1.Execute then
  memText.Lines.SaveToFile(SaveDialog1.FileName);
end;

//进入编辑状态
procedure TfrmMain.btnEditClick(Sender: TObject);
begin
  memText.Font.Color := clBlack;
  memText.ReadOnly := false;
  memText.Visible := true;
  panText.Visible := false;
end;

end.

⌨️ 快捷键说明

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