📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char m_szKW[80][20]; //关键词表
struct CIFA //保存词法分析结果
{
int nType; //0:错误, 1:标志符, 2:数字, 3-:关键字和操作符, -1:结束符
int nValue; //二元式中的值
char szText[20]; //单词
int nAddr; //源文件缓冲区中地址
};
CIFA * m_cifa[10000]; //词法分析结果
char m_szErrMsg[100][100]; //错误信息表
int m_n; //用于词法分析中,用于指示词法分析结果的个数
char m_str[20000]; //源程序缓冲区
int befor_struct=0;
String kkk;
String tmd;
char tmd_char;
void init();
int FindInKWTab(char * a);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String str, strTemp;
BOOL flag=false;
char token[20];
String Str_test;
String Str_test2;
int n=0; //用于指示当前的字符
int k,v;
CIFA * * p;
int s=0;
int a;
init();
Str_test2=kkk;
// Str_test2=Memo1->Text;
Str_test=Str_test2;
strcpy(m_str,Str_test.c_str());
// Edit1->Text=m_str;
while (m_str[n])
{
if (flag)
{
while (!((m_str[n]=='*')&&(m_str[n+1]=='/')))
{
if (m_str[n])
n++;
else
break;
}
if (m_str[n])
{
tmd_char=m_str[n];
n++;
n++;
flag=false;
}
}
while (1)
{
while ((m_str[n]==32) || (m_str[n]==9))
n++;
if (!((m_str[n]==13) && (m_str[n+1]==10)))
break;
n++;
n++;
}
if (isalpha(m_str[n])) //字母
{
k=0;
while (1)
{
if (k<19) //标志符的长度为20
token[k++]=m_str[n++];
else
n++;
if (!isalnum(m_str[n])) //如果不是数字或字母就退出
break;
}
token[k]=0;
v=FindInKWTab(token); //查找关键词表
if (v) //如果是关键词
{
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n-k;
m_n++;
}
else //普通标志符
{
m_cifa[m_n]=new CIFA;
/*----------在词法分析结果中查找-----------*/
int vv=1;
for (int i=0;i<m_n;i++)
{
if (m_cifa[i]->nType==1)
{
vv++;
if (!::stricmp(m_cifa[i]->szText,token))
m_cifa[m_n]->nValue= m_cifa[i]->nValue;
}
}
m_cifa[m_n]->nValue=vv;
/*---------------------------------------*/
m_cifa[m_n]->nType=1;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n-k;
m_n++;
}
}
else if (isdigit(m_str[n])) //数字
{
k=0;
BOOL error=false;
while (1)
{
if (k<=8)
token[k++]=m_str[n++];
else
{
error=true;
n++;
}
if (!isdigit(m_str[n]))
break;
}
token[k]=0;
v=::strtol(token,NULL,10);
if (error)
{
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=1;
m_cifa[m_n]->nType=0;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n-k;
m_n++;
}
else
{
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=v;
m_cifa[m_n]->nType=2;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n-k;
m_n++;
}
}
else
switch (m_str[n]) //其他符号
{
case '+':
case '-':
case '*':
case '~':
case '&':
case '|':
case '=':
case ';':
case '.':
case ',':
case '(':
case ')':
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
break;
case '\0':
break;
case '/':
switch (m_str[n+1])
{
case '*':
n++;
n++;
flag=true;
break;
default:
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
break;
case '<':
switch (m_str[n+1])
{
case '=':
token[0]=m_str[n];
token[1]=m_str[n+1];
token[2]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
n++;
break;
case '>':
token[0]=m_str[n];
token[1]=m_str[n+1];
token[2]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
n++;
break;
default:
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
break;
case '>':
switch (m_str[n+1])
{
case '=':
token[0]=m_str[n];
token[1]=m_str[n+1];
token[2]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
n++;
break;
default:
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
break;
case ':':
switch (m_str[n+1])
{
case '=':
token[0]=m_str[n];
token[1]=m_str[n+1];
token[2]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
n++;
break;
default:
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
break;
default:
token[0]=m_str[n];
token[1]=0;
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=2;
m_cifa[m_n]->nType=0;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
if (m_n==10000-2) //词法分析的结果的个数规定为10000
{
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=99;
m_cifa[m_n]->nType=0;
strcpy(m_cifa[m_n]->szText,"");
m_cifa[m_n]->nAddr=n-1;
m_n++;
break;
}
}
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=-1; //结束符
strcpy(m_cifa[m_n]->szText,"");
m_cifa[m_n]->nAddr=0;
m_n++;
befor_struct=m_n;
while ((m_cifa[s]->nType)>=0)
{
s++;
}
for (int i=0;i<s;i++)
{
strTemp=IntToStr(m_cifa[i]->nType)+" "+IntToStr(m_cifa[i]->nValue)+" "+m_cifa[i]->szText;
strTemp=strTemp+'\r'+'\n';
str+=strTemp;
}
Memo2->Text =str;
for (int i=0;i<m_n;i++) //当第2次调用该函数时,就要释放前1次的资源
delete m_cifa[i];
m_n=0;
}
//---------------------------------------------------------------------------
void init()
{
strcpy(m_szKW[0],"");
strcpy(m_szKW[1],"");//标识符
strcpy(m_szKW[2],"");//正整数
strcpy(m_szKW[3],"main");
strcpy(m_szKW[4],"void");
strcpy(m_szKW[7],"if");
strcpy(m_szKW[8],"else");
strcpy(m_szKW[9],"while");
strcpy(m_szKW[10],"do");
strcpy(m_szKW[11],"for");
strcpy(m_szKW[12],"int");
strcpy(m_szKW[13],"char");
strcpy(m_szKW[14],"float");
strcpy(m_szKW[15],"double");
strcpy(m_szKW[16],"long");
strcpy(m_szKW[17],"signed");
strcpy(m_szKW[18],"unsigned");
strcpy(m_szKW[19],"struct");
strcpy(m_szKW[20],"union");
strcpy(m_szKW[21],"enum");
strcpy(m_szKW[22],"typedef");
strcpy(m_szKW[23],"sizeof");
strcpy(m_szKW[24],"auto");
strcpy(m_szKW[25],"static");
strcpy(m_szKW[26],"register");
strcpy(m_szKW[27],"extern ");
strcpy(m_szKW[28],"const");
strcpy(m_szKW[29],"volatile");
strcpy(m_szKW[30],"return");
strcpy(m_szKW[31],"continue");
strcpy(m_szKW[32],"break");
strcpy(m_szKW[33],"goto");
strcpy(m_szKW[34],"switch");
strcpy(m_szKW[35],"case");
strcpy(m_szKW[36],"default");
strcpy(m_szKW[37],"scanf");
strcpy(m_szKW[38],"printf");
strcpy(m_szKW[39],"+");
strcpy(m_szKW[40],"-");
strcpy(m_szKW[41],"*");
strcpy(m_szKW[42],"/");
strcpy(m_szKW[43],"~");
strcpy(m_szKW[44],"&");
strcpy(m_szKW[45],"|");
strcpy(m_szKW[46],"<");
strcpy(m_szKW[47],"<=");
strcpy(m_szKW[48],">");
strcpy(m_szKW[49],">=");
strcpy(m_szKW[50],"=");
strcpy(m_szKW[51],"<>");
strcpy(m_szKW[52],":=");
strcpy(m_szKW[53],"{");
strcpy(m_szKW[54],"}");
strcpy(m_szKW[55],";");
strcpy(m_szKW[56],".");
strcpy(m_szKW[57],",");
strcpy(m_szKW[58],"(");
strcpy(m_szKW[59],")");
strcpy(m_szKW[60],":");
strcpy(m_szKW[61],"/*");
strcpy(m_szKW[62],"*/");
strcpy(m_szKW[63],"");
strcpy(m_szKW[64],"");
strcpy(m_szKW[65],"");
strcpy(m_szKW[66],"");
strcpy(m_szKW[67],"");
strcpy(m_szKW[68],"");
strcpy(m_szKW[69],"");
strcpy(m_szKW[70],"");
strcpy(m_szKW[71],"");
strcpy(m_szKW[72],"");
strcpy(m_szKW[73],"");
strcpy(m_szKW[74],"");
strcpy(m_szErrMsg[0],"正确!");
strcpy(m_szErrMsg[1],"数字位数过长!");
strcpy(m_szErrMsg[2],"非法字符!");
strcpy(m_szErrMsg[3],"缺少关键字“ main ”!");
strcpy(m_szErrMsg[4],"program 后缺少标识符!");
strcpy(m_szErrMsg[5],"缺少“ ; ”符号!");
strcpy(m_szErrMsg[6],"缺少程序结束符“ . ”符号!");
strcpy(m_szErrMsg[7],"缺少《程序体》,应为 begin,integer,real,procedure");
strcpy(m_szErrMsg[8],"缺少保留字“ begin ”!");
strcpy(m_szErrMsg[9],"缺少《语句》,应为 begin,ID,if,while,call");
strcpy(m_szErrMsg[10],"缺少保留字“ end ”!");
strcpy(m_szErrMsg[11],"缺少《声明》,应为 integer,real,procedure");
strcpy(m_szErrMsg[12],"缺少保留字 integer 或 real!");
strcpy(m_szErrMsg[13],"procedure 后缺少标识符!");
strcpy(m_szErrMsg[14],"变量声明后缺少标识符!");
strcpy(m_szErrMsg[15],"缺少保留字“ procedure ”!");
strcpy(m_szErrMsg[16],"缺少 “ ( ”符号!");
strcpy(m_szErrMsg[17],"缺少 “ ) ”符号!");
strcpy(m_szErrMsg[18],"缺少形参标识符 !");
strcpy(m_szErrMsg[19],"缺少 “ : ”符号!");
strcpy(m_szErrMsg[20],"缺少标识符!");
strcpy(m_szErrMsg[21],"缺少赋值符号“ := ”!");
strcpy(m_szErrMsg[22],"缺少保留字“ if ”!");
strcpy(m_szErrMsg[23],"缺少保留字“ then ”!");
strcpy(m_szErrMsg[24],"缺少保留字“ while ”!");
strcpy(m_szErrMsg[25],"缺少保留字“ do ”!");
strcpy(m_szErrMsg[26],"缺少保留字“ call ”!");
strcpy(m_szErrMsg[27],"缺少被调过程名标识符!");
strcpy(m_szErrMsg[28],"缺少《因子》,应为 (,ID,NUMBER");
strcpy(m_szErrMsg[29],"缺少《布尔表达式》,应为 ~,(,ID,NUMBER");
strcpy(m_szErrMsg[30],"缺少《关系》!");
strcpy(m_szErrMsg[31],"变量名不能和过程名相同!");
strcpy(m_szErrMsg[32],"标识符重复声明!");
strcpy(m_szErrMsg[33],"未声明标识符!");
strcpy(m_szErrMsg[34],"不能直接引用过程名!");
strcpy(m_szErrMsg[35],"不能从real转换为integer类型!");
strcpy(m_szErrMsg[36],"不能用常数作实参!");
strcpy(m_szErrMsg[37],"变参应为变量!");
strcpy(m_szErrMsg[38],"实参个数不足!");
strcpy(m_szErrMsg[39],"只有integer和integer才能比较!");
strcpy(m_szErrMsg[40],"不能这样调用过程!");
strcpy(m_szErrMsg[41],"");
strcpy(m_szErrMsg[42],"");
strcpy(m_szErrMsg[43],"");
strcpy(m_szErrMsg[96],"源程序结束符 end. 后还有多余内容!");
strcpy(m_szErrMsg[97],"语法错误太多,终止语法分析!");
strcpy(m_szErrMsg[98],"源程序不正常结束!");
strcpy(m_szErrMsg[99],"内存不足!词法分析终止!");
}
int FindInKWTab(char * a)
{
for (int i=0;i<80;i++)
if (!::stricmp(m_szKW[i],a)) //找到
return i;
return 0; //未找到
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Memo1->Lines->Clear();
Memo2->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
kkk="";
kkk=Memo1->Text;
Memo1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
OpenDialog1->Filter="文本文档(*.txt)|*.TXT|C文件(*.c)|*.C|C++文件(*.cpp)|*.CPP";
if(OpenDialog1->Execute())
{Memo1->Lines->LoadFromFile(OpenDialog1->FileName);}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
Memo1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Memo1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
Memo1->SetFocus();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -