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

📄 unit1.~cpp

📁 最新的词法分析器啊
💻 ~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 + -