📄 expmain.pas
字号:
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 + -