📄 syntax.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 + -