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

📄 form1.cs

📁 编译原理 词法分析器 识别标识符
💻 CS
📖 第 1 页 / 共 4 页
字号:
							charTemp = getch[i];
							if (charTemp == '\n')
							{
								//stringSave = stringSave + charTemp.ToString();
								//col++;
								col=0;
								row++;
								//i = i + 1;
								test = 1;
							}
							else
							{
								i = i + 1;
								col++;
							}
							
						}
					}
					else
						i = i - 1;
					//stringToArrayString(ref stringArrange, stringSave);

					if(charTemp == '*')//由/*,*/括起的注释语句
					{
						//判断循环是否结束,1 为结束。
						col++;
						while (test == 0&&i<getch.Length -1)
						{   
							i = i + 1;
							col++;
							charTemp = getch[i];
							if(charTemp == '*')
							{
								i = i + 1;
								col++;
								charTemp = getch[i];
								if(charTemp == '/')
								{   
									test = 1;
									i++;
								}
							}
							if(charTemp == '\n')
							{
								col = 0;
								row++;
							}
						}	
					}	

				}
				//stringSave = "";
				
				//由界符(:,,,',",;,(,),.)组成的单词。
				if (charTemp == ':'
					||
					charTemp == ','
					||
					charTemp == '\''
					||
					charTemp == '"'
					||
					charTemp == ';'
					||
					charTemp == '('
					||
					charTemp == ')'
					||
					charTemp == '.')
				{   
					col++;
					stringSave.word =charTemp.ToString();
					stringSave.col = col;
					stringSave.row = row;
					stringToArrayString(ref stringArrange,stringSave);
				}
			    zero(stringSave);


				//由运算符(+,-,*,/)组成的单词。
				charTemp = getch[i];
				if (charTemp == '+'
					||
					charTemp == '-'
					||
					charTemp == '*'
					||
					charTemp == '/'
					||
					charTemp == '=')
				{   
					col++;
					stringSave.word = charTemp.ToString();
					stringSave.col = col;
					stringSave.row = row;
					stringToArrayString(ref stringArrange,stringSave);
				}
				zero(stringSave);			
			}
            ///////////////////////////////////////////////////////////////////////////
            /*
		   DataTable dt = new DataTable();
            
		   dt.Columns.Add("错误提示",System.Type.GetType("System.String"));
		   dt.Columns.Add("错误单词",System.Type.GetType("System.String")); 
		   dt.Columns.Add("行",System.Type.GetType("System.String")); 
		   dt.Columns.Add("列",System.Type.GetType("System.String"));
			    
		   for(int k=1;k<errors.Length;k++)
		   {
			   System.Data.DataRow dr=dt.NewRow(); 
			   dr["错误提示"]=errors[k].type;
			   dr["错误单词"]=errors[k].word; 
			   dr["行"]=errors[k].row; 
			   dr["列"]=errors[k].col; 
			   dt.Rows.Add(dr); 
		   }
		   this.dataGrid_error.SetDataBinding(dt,"");
		   dataGrid_error.ForeColor=System.Drawing.Color.Red;
		   */
		    ///////////////////////////////////////////////////////////////////////////
			return stringArrange;
			//return stringArrange[];			
		}
        #endregion
		//
		#region 错误处理
		
		private words[] stringArrayToError(char[] getch)
		{           
			words[] errors = new words[1];
			char charTemp;
			words stringSave = new words();//存放一个分析得到的单词
			zero(stringSave);
			int ipos = 0;
			int col = 0;//记录行数
			int row = 1;
			int count1 = 0;
			int count2 = 0;
			//一次循环因得到一个单词
			for (int i = 0; i < getch.Length; i++)
			{
				charTemp = getch[i];
				if (charTemp == '\n')
				{
					col = 0;
					row++;
				}
          
				//由数字开头的字母数字组成的错误单词。
				if (charTemp >= '0' &&	charTemp <= '9')
				{  
					col++;
					i = i + 1;
					charTemp=getch[i];
					int test = 0;//判断循环是否结束,1为结束
					if (charTemp >= 'a'&& charTemp <= 'z'||	charTemp >= 'A'&& charTemp <= 'Z')
					{   
						stringSave.word = getch[i-1].ToString();
						stringSave.col = col;
						stringSave.row = row;
						stringSave.type = "非法字符:变量必须为以字母开头的字母或字母数字组合!";
						col++;
						stringSave.word =stringSave.word + charTemp.ToString();	
						i++;
						while (test == 0)
						{
							charTemp = getch[i];
							if (charTemp >= 'a' && charTemp <= 'z'|| charTemp >= 'A' && charTemp <= 'Z')
							{   
								col++;
								stringSave.word = stringSave.word + charTemp.ToString();
								i = i + 1;
							}
							else
							{
								test = 1;
							}
							if(charTemp == '\n' )
								row++;
						}
						stringToErrorsArrayString(ref errors, stringSave);
					}
					else 	
					{
						i = i - 1;
						col --;
					}
					zero(stringSave);//置空
				}
				
                
				//不成对的双引号
				else 
				if (getch[i] == '"')
				{   
					int flag = 1;
					int test = 0;
					count1++;
					col++;
					stringSave.word =charTemp.ToString();
					stringSave.col = col;
					stringSave.row = row;
					stringSave.type = "不正确的字符串表达:双引号不成对!";
					ipos = i;
					i++;
					
					while (test == 0 && i<getch.Length)
					{   
						charTemp = getch[i];
						if(charTemp!='"')
						{   
							//stringSave.word = stringSave.word + charTemp.ToString();
							i++;
						}
						else 
						{
							//flag = 0;
							test = 1;
						}
						
					}
					if (i == getch.Length)
						flag = 0;
					if(flag==0&&count1%2!=0)
						stringToErrorsArrayString(ref errors, stringSave);

					zero(stringSave);
					i = ipos;
				}
				
                
				//不成对的单引号
				//charTemp = getch[i];
				else 
				if (getch[i] == '\'')
				{   
					int flag = 0;
					int test = 0;
					count2++;
					col++;
					stringSave.word =charTemp.ToString();
					stringSave.col = col;
					stringSave.row = row;
					stringSave.type = "不正确的字符表达:单引号不成对!";
					i++;
					ipos = i;
					
					while (test == 0 && i<getch.Length)
					{   
						charTemp = getch[i];
						if(charTemp!='\'')
						{   
							//stringSave.word = stringSave.word + charTemp.ToString();
							i++;
						}
						else 
						{
							flag = 1;
							test = 1;
						}
						
					}
					if (flag == 0&&count2%2!=0)
						stringToErrorsArrayString(ref errors, stringSave);

					zero(stringSave);
					i = ipos;
				}

					//不成对的括号
					//charTemp = getch[i];
				else 
					if (getch[i] == '(')
				{   
					int flag = 0;
					int test = 0;
					col++;
					stringSave.word =charTemp.ToString();
					stringSave.col = col;
					stringSave.row = row;
					stringSave.type = "缺少括号:括号不成对!";
					i++;
					ipos = i;
					
					while (test == 0 && i<getch.Length)
					{   
						charTemp = getch[i];
						if(charTemp!=')')
						{   
							//stringSave.word = stringSave.word + charTemp.ToString();
							i++;
						}
						else 
						{
							flag = 1;
							test = 1;
						}
						
					}
					if (flag == 0)
						stringToErrorsArrayString(ref errors, stringSave);

					zero(stringSave);
					i = ipos;
				}
					//注释丢失
				    else
					if (getch[i] == '/')
				{
					col++;
					i = i + 1;
					ipos = i;
					int flag=1;
					stringSave.word =charTemp.ToString();
					stringSave.col = col;
					stringSave.row = row;
					stringSave.type = "注释丢失!";
					int test = 0;
					charTemp = getch[i];//提前判断下一字符,如果为‘/’,则该行为注释语句

					if(charTemp == '*')//由/*,*/括起的注释语句
					{
						//判断循环是否结束,1 为结束。
						stringSave.word = stringSave.word +charTemp.ToString();
						col++;
						while (test == 0&&i<getch.Length-1)
						{   
							i = i + 1;
							col++;
							charTemp = getch[i];
							if(charTemp == '*')
							{
								i = i + 1;
								col++;
								charTemp = getch[i];
								if(charTemp == '/')
								{   
									test = 1;
								}
							}
						}	
					}
					if(i==getch.Length-1)
						flag=0;
					if(flag==0)
						stringToErrorsArrayString(ref errors, stringSave);
                    zero(stringSave);
					i = ipos;

				}

⌨️ 快捷键说明

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