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

📄 lrsyntax.cs

📁 简单的词法分析器 利用vc编程 功能 可以打开任意位置和名称的原文件进行词法分析
💻 CS
字号:
using System;
using System.Collections;

namespace Analyzer
{
	/// <summary>
	/// LRSyntax 的摘要说明。
	/// </summary>
	public class LRSyntax
	{
		private int[,] LR;
		private ArrayList symbolTable;

		public LRSyntax(ArrayList symbolTable,int[,] LR)
		{
			this.LR = LR;
			this.symbolTable = symbolTable;
		}

		public void analyzer()
		{
			int[] state = new int[100];
			string[] symbol =new string[100];
			state[0]=0;
			symbol[0]="#";

			string[] start = new string[16];
			start[0] = "Z";
			start[1] = "S";
			start[2] = "A";
			start[3] = "C";
			start[4] = "D";
			start[5] = "E";
			start[6] = "B";
			start[7] = "F";
			start[8] = "F";
			start[9] = "G";
			start[10] = "H";
			start[11] = "I";
			start[12] = "K";
			start[13] = "L";
			start[14] = "M";
			start[15] = "J";

			int[] lengh = new int[16];
			//读入lengh
			lengh[0]=1;
			lengh[1]=2;
			lengh[2]=3;
			lengh[3]=1;
			lengh[4]=1;
			lengh[5]=1;
			lengh[6]=3;
			lengh[7]=2;
			lengh[8]=1;
			lengh[9]=3;
			lengh[10]=1;
			lengh[11]=3;
			lengh[12]=1;
			lengh[13]=1;
			lengh[14]=1;
			lengh[15]=1;

			ArrayList tokenArray = new ArrayList();
			//tokenArray=(ArrayList)symbolTable[0];

			int [] wordNum = new int[100];
			int offset = 0;
			for(int temp=0;temp<symbolTable.Count-1;temp++)
			{
				tokenArray=(ArrayList)symbolTable[temp];
	
				if(tokenArray[1].ToString().Equals("int"))
				{
					wordNum[offset]=4;
					offset++;
				}
				else if(tokenArray[1].ToString().Equals("void"))
				{
					wordNum[offset]=0;
					offset++;
				}
				else if(tokenArray[1].ToString().Equals("main"))
				{
					wordNum[offset]=1;
					offset++;
				}
				else if(tokenArray[1].ToString().Equals("("))
				{
					tokenArray=(ArrayList)symbolTable[temp+1];
					if(tokenArray[1].ToString().Equals(")"))
					{
						wordNum[offset]=2;
					}
					offset++;
				}
				else if(tokenArray[1].ToString().Equals(")"))
				{
					continue;
				}
				else if(tokenArray[1].ToString().Equals("{"))
				{
					wordNum[offset]=3;
					offset++;
				}
				else if(tokenArray[1].ToString().Equals("="))
				{
					wordNum[offset]=6;
					offset++;
				}
				else if(tokenArray[1].ToString().Equals("}"))
				{
					wordNum[offset]=22;
					offset++;
				}
				else if(tokenArray[1].ToString().Equals(";"))
				{
					wordNum[offset]=23;
					offset++;
				}
				else if(tokenArray[0].ToString().Equals("ID"))
				{
					wordNum[offset]=5;
					offset++;
				}
				else if(tokenArray[0].ToString().Equals("NUM"))
				{
					wordNum[offset]=7;
					offset++;
				}
			}

			wordNum[offset] = 24;//终止符号

//			for(int ttt = 0;ttt<11;ttt++)
//			{
//				Console.WriteLine(wordNum[ttt].ToString());
//			}

			int p1=0;
			int p2=0;

			Console.WriteLine("//------------------------------------------------------//");
			Console.WriteLine("//------------------------语法分析结果------------------//");
			Console.WriteLine("//------------------------------------------------------//");

			Console.WriteLine("\n过程中规约的顺序如下(给出表达式左部):\n");

			int t;
			while(true)
			{
				int j,k;
				j=state[p2];
				k=wordNum[p1];

				t=LR[j,k];
				if(t==0)
				{
					//找到报错处,报错
					tokenArray=(ArrayList)symbolTable[p1];
					fail(tokenArray);
					break;
				}
				else
				{
					if(t==-100)
					{
						Console.WriteLine("\n");
						Console.WriteLine("\n检测结果:");
						Console.WriteLine("代码通过语法检测");
						break;
					}
					if(t<0&&t!=-100)
					{
						string m=start[-t];
						Console.Write(m+" ");
						int length=lengh[-t];
						p2=p2-(length-1);
						
						int right = Search.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;
					}
				}
			}
		}

		//失败时调用的函数
		private void fail(ArrayList eArray) 
		{
			//System.out.println(eArray.get(0)+" \""+eArray.get(1)+"\" ("+eArray.get(2)+","+eArray.get(3)+")"+"附近有语法错误");
			Console.WriteLine("错误:");
			Console.WriteLine(eArray[0]+" \""+eArray[1]+"\" (行:"+eArray[2]+",列:"+eArray[3]+")"+"附近有语法错误");
		}
	}

	class Search
	{
		public static 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 + -