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

📄 syntax.cs

📁 syntax check 语法分析器 简单
💻 CS
字号:
using System;
using System.Text;
using System.IO;

namespace Syntax_Analyzer
{

	
	class Syntax
	{
		StreamReader myStreamReader;
		int t;
		int[] lengh;
		
		int l =0;
		string[] grammar;
			
		int s=0;
		string[] Word;
			
		int w=0;
		int[] wordNum ;
			
		int n =0;
		int[,] LR;
		public Syntax()
		{
	         lengh = new int[16];
			 grammar=new string[16];
			 Word=new string[100];
			 wordNum = new int[100];
		     LR=new int[30,30];


		}

		public void analyzer()
		{
				
			//读入grammar
			Syntax myTextRead=new Syntax();
			Console.WriteLine("-----------------------------语法分析开始---------------------------------\n");
   
			//***************************
			//循环读取文法
			//***************************
			string strStart;
			strStart="grammar.txt";
			myTextRead.myStreamReader=new StreamReader(strStart);
			string strBufferStart;		
			int uu=0;		
	
			do
			{
				strBufferStart =myTextRead.myStreamReader.ReadLine();

				if(strBufferStart==null)
					break;
			
				foreach (String subString in strBufferStart.Split())
				{
					
					grammar[uu]=subString;      //每行文法存入grammar[]
					uu++;
					
				}
				
			}
			while (strBufferStart!=null);
			myTextRead.myStreamReader.Close();


	
			//***************************
			//循环读取lengh
			//***************************

			strStart="lengh.txt";
			myTextRead.myStreamReader=new StreamReader(strStart);
			uu=0;
			do
			{
				strBufferStart =myTextRead.myStreamReader.ReadLine();

				if(strBufferStart==null)
					break;
			
				foreach (String subString in strBufferStart.Split())
				{
					
					lengh[uu]=Convert.ToInt32(subString);      //每行文法存入grammar[]
					uu++;
					
				}
				
			}while (strBufferStart!=null);
			myTextRead.myStreamReader.Close();



			//****************************
			// 读入文件,进行语法分析
			//
			//****************************

			string strReadFile;
			strReadFile="input.txt";
			myTextRead.myStreamReader=new StreamReader(strReadFile);
			string strBufferText;
			int wid =0;
			Console.WriteLine("分析读入程序(记号ID):\n");
			do
			{	
				strBufferText =myTextRead.myStreamReader.ReadLine();

				if(strBufferText==null)
					break;
				
				foreach (String subString in strBufferText.Split())
				{
					if(subString!="")
					{
						int ll;
						if(subString!=null)
						{
							ll= subString.Length; //每一个长度
						}
						else
						{
							break;
						}

						int a=ll+1;
						
						char[] b = new char[a];
						
						StringReader sr = new StringReader(subString);
						
						sr.Read(b, 0, ll);            //把substring 读到char[]数组里
						
						int sort=(int)b[0];
	
						// word[i] 和 wordNum[i]对应
						//先识别出一整个串,再根据开头识别是数字还是字母
						Word[wid]=subString;

						if(subString.Equals("void"))
						{wordNum[wid]=0;}
						else 
						{
							if(subString.Equals("main"))
							{wordNum[wid]=1;}
							else 
							{
								if(subString.Equals("()"))
								{wordNum[wid]=2;}
								else 
								{
									if(subString.Equals("{"))
									{wordNum[wid]=3;}
									else 
									{
										if(subString.Equals("int"))
										{wordNum[wid]=4;}
										else 
										{
											if(subString.Equals("="))
											{wordNum[wid]=6;}
											else 
											{
												if(subString.Equals("}"))
												{wordNum[wid]=22;}
												else 
												{
													if(subString.Equals(";"))
													{wordNum[wid]=23;}
													else //识别变量和数字
													{
														if(sort>47&sort<58)
														{wordNum[wid]=7;}
														else 
														{wordNum[wid]=5;}
													}
												}
											}
										}
									}
								}
							}
						}
						Console.Write(subString+"("+wordNum[wid]+")"+" ");

						wid++;
					}
				}
				Console.WriteLine("\n");
			}while (strBufferText!=null);
			wordNum[wid]=24;
			myTextRead.myStreamReader.Close();

			//*********************************
			//读入LR分析表
			//
			//***********************************

			string strLR;
			strLR="LR-table.txt";
			myTextRead.myStreamReader=new StreamReader(strLR);
			string strBufferLR;
			int pp=0;
			do
			{
				
				strBufferLR =myTextRead.myStreamReader.ReadLine();
				if(strBufferLR==null)
					break;
				
				else
				{
					int j=0;
				
					foreach (String subString in strBufferLR.Split())
					{
					
					
						if(subString!=null)
						{
							int lllr=Convert.ToInt16(subString);
							LR[pp,j]=lllr;    //把行与列读入数组
							j++;
						}

					
					}
				}
				pp++;
				
			}
			while (strBufferLR!=null);
			myTextRead.myStreamReader.Close();


			int[] state = new int[100];
			string[] symbol =new string[100];
			state[0]=0;
			symbol[0]="#";
			int p1=0;
			int p2=0;
			Console.WriteLine("\n按文法规则归约顺序如下:\n");

			//***************
			//归约算法
			//***************
			while(true)
			{
				int j,k;
				
				j=state[p2];
				
				k=wordNum[p1];

				t=LR[j,k]; //当出现t为0的时候

				if(t==0)
				{
					//错误类型
					string error;
					if(k==0)
						error="void";
					else
						if(k==1)
						error="main";
					else
						if(k==2)
						error="()";
					else
						if(k==3)
						error="{";
					else
						if(k==4)
						error="int";
					else
						if(k==6)
						error="=";
					else
						if(k==22)
						error="}";
					else
						if(k==23)
						error=";";
					else
						error="其他错误符号";


					Console.WriteLine("\n检测结果:");
					Console.WriteLine("代码中存在语法错误");
					Console.WriteLine("错误状况:错误状态编号为 "+j+" 读头下符号为 "+error);
					break;
				}
				else
				{
					if(t==-100)                    //-100为达到接受状态
					{
						Console.WriteLine("\n");
						Console.WriteLine("\n检测结果:");
						Console.WriteLine("代码通过语法检测");
						break;
					}
					if(t<0&&t!=-100)                //归约
					{
						string m=grammar[-t];
						Console.Write(m+" ");      //输出开始符
						int length=lengh[-t];  
						p2=p2-(length-1);          
						Search mySearch=new Search();
						int right=mySearch.search(m);
						if(right==0)
						{
							Console.WriteLine("\n");
							Console.WriteLine("代码中有语法错误");
							break;
						}
						int a=state[p2-1];
						int LRresult= LR[a,right];
						state[p2]=LRresult;
						symbol[p2]=m;
					}
					if(t>0)
					{
						p2=p2+1;
						state[p2]=t;
						symbol[p2]=Convert.ToString(wordNum[p1]);
						p1=p1+1;
					}
				}

			}
			myTextRead.myStreamReader.Close();
			Console.WriteLine("-----------------------------语法分析结束---------------------------------\n");
			Console.Read();

		}

	}

	class Search
	{
		public int search(string x)
		{
			string[] mysymbol=new string[14];
			mysymbol[0]="S";
			mysymbol[1]="A";
			mysymbol[2]="B";
			mysymbol[3]="C";
			mysymbol[4]="D";
			mysymbol[5]="E";
			mysymbol[6]="F";
			mysymbol[7]="G";
			mysymbol[8]="H";
			mysymbol[9]="I";
			mysymbol[10]="J";
			mysymbol[11]="K";
			mysymbol[12]="L";
			mysymbol[13]="M";
			int r=0;
			for(int s=0;s<=13;s++)
			{
				if(mysymbol[s].Equals(x))
					r=s+8;
			}
			return r;
		}
	}

	
}

⌨️ 快捷键说明

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