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

📄 form1.cs

📁 用c#编写的c语言词法分析器,预处理注释,并使用数据库查询关键字. 注意数据库需要重新连接,使用microsoft jet 4.0,数据库文件为keytable.mdb
💻 CS
📖 第 1 页 / 共 2 页
字号:
		#endregion

		/// <summary>
		/// 应用程序的主入口点。
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}

		private void btnOK_Click(object sender, System.EventArgs e)
		{
			if(InCode.Text!="")
			{
				//inputCode=InCode.Text;					//输入代码字符
				string sw="";
				string[] line=InCode.Lines;				//按文本框的行取
				int h=0;int t=0;
				int k=0;int u=0;			

				while(h<line.Length)
				{
					for(h=k;h<line.Length;h++)
					{
						t=line[h].IndexOf("/*");
						if(t!=-1)
							break;
					}
					if(t!=-1)
					{
						for(k=h;k<line.Length;k++)
						{
							u=line[k].IndexOf("*/");
							if(u!=-1)
								break;
						}
						if(u==-1)
						{
							MessageBox.Show("找不到与'/*'匹配的'*/'"+"行"+(h+1)+"列"+(t+1));
							listBoxNo2++;
							listBox2.Items.Add(listBoxNo2.ToString()+" "+"错误#1"+" "+"/*");
							line[h]=line[h].Substring(0,t);h++;
							while(h<line.Length)
								line[h++]=" ";
						}
						else
						{
								int x1=h,y1=t,x2=k,y2=u+1;							
							if(x1==x2)
							{
								line[x1]=line[x1].Remove(y1,y2-y1+1);
								line[x1]=line[x1].Insert(y1," ");

							}
							else
							{
								line[x1]=line[x1].Substring(0,y1);
								x1++;
								while(x1<x2)
								{
									line[x1]=" ";
									x1++;
								}
								line[x1]=line[x1].Remove(0,y2+1);
							}
						}
						h++;
					}
				}
				

				for(int j=0;j<line.Length;j++)			//按行处理输入串
				{
					sw=line[j]+"$";					//第j行字符,$为终结符
					int i=0,start=0,record=0;
					while(i<sw.Length-1)
					{
						while(sw[i]==' '||sw[i]=='	')
							i++;
						start=i;
						if(IsLetter(sw[i]))
						{
							record=i;
							i++;
							while(IsLetter(sw[i])||IsDigit(sw[i]))
								i++;
							if(CheckLength(sw.Substring(record,i-record))&&CheckString(sw.Substring(record,i-record)))		//长度小于8并且在数据库查找到为关键字,复制到 cs,并且显示在输出框
							{
								//MessageBox.Show("关键字");
								listBoxNo2++;
								listBox2.Items.Add(listBoxNo2.ToString()+" "+"关键字"+" "+sw.Substring(record,i-record));
								listBoxNo++;
								listBox1.Items.Add(listBoxNo.ToString()+" "+"关键字"+" "+sw.Substring(record,i-record));
							}
							else
							{
								//MessageBox.Show("标识符");
								listBoxNo2++;
								listBox2.Items.Add(listBoxNo2.ToString()+" "+"标识符"+" "+sw.Substring(record,i-record));
								CodeListNo++;
								CodeList.Items.Add(CodeListNo.ToString()+" "+"标识符"+" "+sw.Substring(record,i-record));
								//标识符
							}
						}
						else if(IsDigit(sw[i]))
						{
							record=i;
							i++;
							while(IsDigit(sw[i]))
								i++;
							//MessageBox.Show("数字");
							listBoxNo2++;
							listBox2.Items.Add(listBoxNo2.ToString()+" "+"数字"+" "+sw.Substring(record,i-record));
							NumListNo++;
							NumList.Items.Add(NumListNo.ToString()+" "+"数字"+" "+sw.Substring(record,i-record));
							//数字
						}
						else if(sw[i]=='('||sw[i]==')'||sw[i]=='['||sw[i]==']'||sw[i]=='.'||sw[i]=='~'
							||sw[i]==','||sw[i]==';'||sw[i]=='{'||sw[i]=='}')
						{
							//MessageBox.Show("运算符");
							listBoxNo2++;
							listBox2.Items.Add(listBoxNo2.ToString()+" "+"运算符"+" "+sw[i]);
							listBoxNo++;
							listBox1.Items.Add(listBoxNo.ToString()+" "+"运算符"+" "+sw[i]);
							i++;
						}
						else if(sw[i]=='='||sw[i]=='%'||sw[i]=='^'||sw[i]=='!'||sw[i]=='*'||sw[i]=='/')
						{
							//MessageBox.Show("运算符");
							listBoxNo++;listBoxNo2++;
							if(sw[i+1]=='=')
							{
								listBox2.Items.Add(listBoxNo2.ToString()+" "+"运算符"+" "+sw[i]+sw[i+1]);
								listBox1.Items.Add(listBoxNo.ToString()+" "+"运算符"+" "+sw[i]+sw[i+1]);
								i++;
							}
							else
							{		
								listBox2.Items.Add(listBoxNo2.ToString()+" "+"运算符"+" "+sw[i]);						
								listBox1.Items.Add(listBoxNo.ToString()+" "+"运算符"+" "+sw[i]);
							}
							i++;
						}
						else if(sw[i]=='<'||sw[i]=='>'||sw[i]=='+'||sw[i]=='-'||sw[i]=='&'||sw[i]=='|')
						{
							//MessageBox.Show("运算符");
							listBoxNo++;listBoxNo2++;
							if(sw[i+1]==sw[i]||sw[i+1]=='=')
							{
								listBox2.Items.Add(listBoxNo2.ToString()+" "+"运算符"+" "+sw[i]+sw[i+1]);
								listBox1.Items.Add(listBoxNo.ToString()+" "+"运算符"+" "+sw[i]+sw[i+1]);
								i++;
							}
							else
							{
								listBox2.Items.Add(listBoxNo2.ToString()+" "+"运算符"+" "+sw[i]);
								listBox1.Items.Add(listBoxNo.ToString()+" "+"运算符"+" "+sw[i]);
							}
							i++;
						}
						else
						{ if(i==sw.Length-1)
							  break;
							if(i==start)
							MessageBox.Show("无法识别的符号"+"行"+(j+1)+"列"+(i+1));
							listBoxNo2++;
							listBox2.Items.Add(listBoxNo2.ToString()+" "+"错误#0"+" "+sw[i]);
							i++;//报错,无法识别的字符
						}
						start=i;
					}
				}//end for
			}//end if
			else
			{
				MessageBox.Show("什么都没有输入!");							//空输入
			}
			}

		private void btnExit_Click(object sender, System.EventArgs e)		//退出
		{
			Application.Exit();
		}

		private void Form1_Load(object sender, System.EventArgs e)
		{
			InCode.Focus();
			listBoxNo=0;
			CodeListNo=0;
			NumListNo=0;
		}

		private bool IsLetter(char c)
		{
			if((c<='z'&&c>='a')||(c<='Z'&&c>='A'))
				return true;
			else
				return false;
		}

		private bool IsDigit(char c)
		{
			if(!(c<='9'&&c>='0'))
				return false;
			else
				return true;
		}
		//判断字段是否小于8
		private bool CheckLength(string input)					//长度
		{
			if(input.Length<=8)
				return true;
			else
				return false;
		}
		//判断是否保留字、符号表保留字
		private bool CheckString(string input)			//字符串查找,判断是否为关键字
		{
			dbConnect.Open();
			string QuerySQL="SELECT * FROM tables WHERE char='"+input+"'";
			try
			{
				OleDbCommand myCommand=new OleDbCommand(QuerySQL,dbConnect);
				OleDbDataReader dr=null;
				dr=myCommand.ExecuteReader();
				if(dr.Read())
				{
					dbConnect.Close();
					return true;
				}
				else
				{
					dbConnect.Close();
					return false;
				}
				
			}
			catch(Exception ee)
			{
				MessageBox.Show(ee.ToString());
			}
			dbConnect.Close();
			return false;
		}

		private void btnClear_Click(object sender, System.EventArgs e)			//清除
		{
			InCode.Text="";
			CodeList.Items.Clear();
			NumList.Items.Clear();
			listBox1.Items.Clear();
			listBox2.Items.Clear();
			listBoxNo=0;
			listBoxNo2=0;
			CodeListNo=0;
			NumListNo=0;
		}

		private void menuItem2_Click(object sender, System.EventArgs e)
		{
			string Fname;
			//设置过滤器属性
			openFileDialog1.Filter="文本文件(*.txt)|*.txt|RTF格式文件(*.RTF)|*.RTF";
			openFileDialog1.FilterIndex=1;//设置当前文件过滤器
			openFileDialog1.Title="打开文件";//设置对话框的标题
			openFileDialog1.InitialDirectory=Application.StartupPath;//初始目录设为启动路径
			openFileDialog1.RestoreDirectory=true;//自动恢复初始目录
			openFileDialog1.ShowDialog();//弹出打开文件对话框
			Fname=openFileDialog1.FileName;//获取打开的文件名
			if(Fname!="")
			{
				
				if(openFileDialog1.FilterIndex==1)
					InCode.LoadFile(Fname,RichTextBoxStreamType.PlainText);//文本文件
				else
					InCode.LoadFile(Fname,RichTextBoxStreamType.RichText);//RTF文件
			}
		}

		private void menuItem3_Click(object sender, System.EventArgs e)
		{
			Application.Exit();
		}

		private void menuItem5_Click(object sender, System.EventArgs e)
		{
			string Fname;
			saveFileDialog1.Filter="文本文件(*.txt)|*.txt";
			saveFileDialog1.Title="保存文件";
			saveFileDialog1.InitialDirectory=Application.StartupPath;
			saveFileDialog1.RestoreDirectory=true;
			saveFileDialog1.ShowDialog();
			Fname=saveFileDialog1.FileName;
			if(Fname!="")
				InCode.SaveFile(Fname,RichTextBoxStreamType.PlainText);
		}

		private void button2_Click(object sender, System.EventArgs e)
		{
			InCode.Text="";
		}

		private void button1_Click(object sender, System.EventArgs e)
		{
			CodeList.Items.Clear();
			NumList.Items.Clear();
			listBox1.Items.Clear();
			listBox2.Items.Clear();
			listBoxNo=0;
			listBoxNo2=0;
			CodeListNo=0;
			NumListNo=0;
		}
	}
}

⌨️ 快捷键说明

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