📄 ul.txt
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include<iostream>
#include <fstream>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define KEYWORDCOUNT 35
#define SCOUNT 32
#define FGCOUNT 8
#define ZSCOUNT 1
using namespace std;
bool isrv=false;
bool issd(const String *s1,const String &s2,int kcount);
bool isfd(const char* s,const char m);
//定义字母表
char* crt="abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLOMOPQRSTUVWXYZ_";
//定义数字
char* numb="1234567890.";
//定义符号
char* syb="+-*/=~!#%&|<>,.\\";
//定义分隔符
char* fgf="{}[]();";
//定义关键字
String keyw[KEYWORDCOUNT]={"auto","break","case","char","const","continue","default","do","double",
"else","enum","extern","float","for","goto","if","int","long","register",
"return","short","signed","sizeof","static","struct","switch","typedef",
"union","unsigned","void","volatile","while","true","false","bool"} ;
//定义运算符
String yuns[SCOUNT]={"->",".","!","++","--","&","~","*","/","%","+","-",
"<<",">>","<","<=",">",">=","==","!=","&&","||",
"=","+=","-=","*=","/=",",","#"};
//定义注释符
String zs[ZSCOUNT]={"//"};
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//TODO: ----------[ 判断一个字符是否在一个字符串内 ]--------------------
bool isfd(const char* s,const char m)
{
int i=strlen(s);
for(int jj=0;jj<=i-1;++jj)
{
if(m==s[jj])return true;
}
return false;
}
//TODO: ---------------[ 判断一个字符串是否在另一个字符串内 ]---------------
bool issd(const String *s1,const String &s2,int kcount)
{
for(int i=0;i<=kcount-1;++i)
{
if(s2==s1[i])return true;
}
return false;
}
//TODO: ----------------------[ 进行词法分析 ]-------------------------
void __fastcall TForm1::Anylize1Click(TObject *Sender)
{
int ii;
char lin[1000];
char num[10];
char fh;
int j;
String final;
Result1->Checked=true;
for(int i=0;i<=RichEdit1->Lines->Count-1;++i)
{
j=1;
ii=-1;
char tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
for(unsigned int iii=0;iii<=strlen(RichEdit1->Lines->Strings[i].c_str());++iii)
{
//状态1:"开头
if(RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]=='\"')
{
final+="(" +String(i+1) + ") "+"字符串开始标志:\""+String("\r\n");
tk=RichEdit1->Lines->Strings[i].SubString(++j,1).c_str()[0];
while(tk!='\n'&&tk!='\r'&&tk!='\0'&&tk!='\"')
{
lin[++ii]=tk;
++j;
tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
if(tk=='\"'){
lin[++ii]='\0';
// if(strlen(lin)>=4)lin[strlen(lin)-3]='\0';
final+="(" +String(i+1) + ")" +"字符串:"+String(lin)+String("\r\n");
final+="(" +String(i+1) + ") "+"字符串结束标志:\""+String("\r\n");
goto sends;
}
}
if(strlen(lin)>=4)lin[strlen(lin)-3]='\0';
final+="(" +String(i+1) + ")" +"字符串:"+String(lin)+String("\r\n");
final+="(" +String(i+1) + ")"+"(" +String(j) + ") " +"错误:有字符串开始标志却无结束标志"+String("\r\n");
sends:
++j;
ii=-1; }
//----------------------------------------------------------------------
//状态2://开头
else if(RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]=='/'&&RichEdit1->Lines->Strings[i].SubString(j+1,1).c_str()[0]=='/')
{ final+="(" +String(i+1) + ") "+"注释符://"+String("\r\n");
tk=RichEdit1->Lines->Strings[i].SubString(j+2,1).c_str()[0];
j+=2;
while(tk!='\n'&&tk!='\r'&&tk!='\0')
{
lin[++ii]=tk;
++j;
tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
}
lin[++ii]='\0';
final+="(" +String(i+1) + ")" +"注释内容:"+String(lin)+String("\r\n");
ii=-1; }
//-------------------------------------------------------------
//状态2:#开头
else if(RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]=='#')
{ final+="(" +String(i+1) + ") "+"预定义符:#"+String("\r\n");
tk=RichEdit1->Lines->Strings[i].SubString(j+1,1).c_str()[0];
j+=1;
while(tk!='\n'&&tk!='\r'&&tk!='\0')
{
lin[++ii]=tk;
++j;
tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
}
lin[++ii]='\0';
final+="(" +String(i+1) + ")" +"预定义内容:"+String(lin)+String("\r\n");
ii=-1; }
//-------------------------------------------------------------
//状态3:'开头
else if(RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0]=='\'')
{
final+="(" +String(i+1) + ") "+"字符开始标志:\'"+String("\r\n");
tk=RichEdit1->Lines->Strings[i].SubString(++j,1).c_str()[0];
while(tk!='\n'&&tk!='\r'&&tk!='\0'&&tk!='\'')
{
lin[++ii]=tk;
++j;
tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
if(tk=='\''){
lin[++ii]='\0';
// if(strlen(lin)>=4)lin[strlen(lin)-3]='\0';
final+="(" +String(i+1) + ")" +"字符:"+String(lin)+String("\r\n");
final+="(" +String(i+1) + ") "+"字符结束标志:\'"+String("\r\n");
if(strlen(lin)>1)final+="(" +String(i+1) + ") "+"(" +String(j) + ") "+"字符长度大于1,是否是字符串?"+String("\r\n");
goto sends2;
}
}
if(strlen(lin)>=4)lin[strlen(lin)-3]='\0';
final+="(" +String(i+1) + ")" +"字符串:"+String(lin)+String("\r\n");
final+="(" +String(i+1) + ")"+"(" +String(j) + ") " +"错误:有字符串开始标志却无结束标志"+String("\r\n");
sends2:
++j;
ii=-1; }
//状态3:字母开头
else if(isfd(crt,tk))
{
while(isfd(crt,tk)||isfd(numb,tk))
{
lin[++ii]=tk;
++j;
tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
}
lin[++ii]='\0';
//是否关键字
if(issd(keyw,lin,KEYWORDCOUNT))
final+="(" +String(i+1) + ") "+"关键字:"+String(lin)+String("\r\n");
else
final+="(" +String(i+1) + ") "+"自定义标识符:"+String(lin)+String("\r\n");
ii=-1;
}
//状态4:符号开头
else if(isfd(syb,tk))
{
while(isfd(syb,tk))
{
lin[++ii]=tk;
++j;
tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
}
lin[++ii]='\0';
//是否运算符
if(issd(yuns,lin,SCOUNT))
final+="(" +String(i+1) + ") "+"运算符:"+String(lin)+String("\r\n");
else
final+="(" +String(i+1) + ")"+"(" +String(j) + ") "+"错误符号:"+String(lin)+String("\r\n");
ii=-1;
}
//状态5:数字开头
else if(isfd(numb,tk))
{
while(isfd(numb,tk))
{
lin[++ii]=tk;
++j;
tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
}
lin[++ii]='\0';
final+="(" +String(i+1) + ") "+"数字:"+String(lin)+String("\r\n");
ii=-1;
}
//状态6:分隔符开头
else if(isfd(fgf,tk))
{
lin[++ii]=tk;
++j;
tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
lin[++ii]='\0';
final+="(" +String(i+1) + ") "+"分隔符:"+String(lin)+String("\r\n");
ii=-1;
}
//以上什么都不是,跳过
else
{
++j;
tk=RichEdit1->Lines->Strings[i].SubString(j,1).c_str()[0];
}
}
}
Memo1->Text=final;
isrv=true;
RichEdit1->Width=Form1->Width-Memo1->Width-8;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -