📄 doing.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
namespace LL1
{
class doing
{
private Grammar Gram;
private FenxiTable Fenxibiao;
private FirstFollow[] Ff;
private char[] Terminal;
private char[] NonTerminal;
private int NumOfWenfa;
private int NumOfTerminal;
private int NumOfNonTerminal;
public doing()
{
Terminal = new char[20];
NonTerminal = new char[30];
NumOfWenfa = 0;
NumOfTerminal = 0;
NumOfNonTerminal = 0;
Gram = new Grammar();
}
public void Get_Grammar()
{
Console.Write("请你输入文法的条数:");
NumOfWenfa =Convert.ToInt32(Console.ReadLine());
Console.WriteLine("\n请输入你的文法(如S→DE|a|e 终结符用小写,非终结符用大写,e表示空串):");
char[] st=new char[20];
for (int i = 0; i < NumOfWenfa; i++)
{
int j=i+1;
int k=0;
char[] temp=new char[20];
Console.Write(" "+j.ToString()+": ");
string aaa =Console.ReadLine();
st=aaa.ToCharArray();
NonTerminal[NumOfNonTerminal++]=st[0];
if (i == 0) { Gram.Set_StartSymbols(st[0]); }
for (int m = 3;m<aaa.Length; m++)
{
if (st[m] == '|')
{
Gram.Insert_Wenfa(st[0], temp);
temp = new char[20];
k=0;
}
else
{
temp[k]=st[m];
k++;
if (m == (aaa.Length - 1))
{
Gram.Insert_Wenfa(st[0],temp);
temp = new char[20];
k = 0;
}
}
}
for (int m = 3; m<aaa.Length;m++)
{
if ((!char.IsUpper(st[m])) && (st[m] != '|') && (st[m] != 'e'))
{
int n = 0;
for (; n < NumOfTerminal; n++)
{
if (st[m] == Terminal[n])
break;
}
if(n==NumOfTerminal)
{
Terminal[NumOfTerminal++]=st[m];
}
}
}
}
Console.Clear();
Console.WriteLine("你输入的文法是:");
Wenfa wf=new Wenfa();
for (int i = 0; i < Gram.Get_NumOfWenfa(); i++)
{
int j=i+1;
wf = Gram.Get_Wenfa(i);
char[] a = new char[20];
Console.Write(" "+j.ToString()+": "+wf.Wenfa_Left+"->");
Console.WriteLine(wf.Wenfa_Right);
}
Console.WriteLine("\n非终结符是:");
for (int i = 0; i < NumOfNonTerminal; i++)
{
Console.Write(" "+NonTerminal[i]);
}
Console.WriteLine("\n终结符是:");
for (int i = 0; i < NumOfTerminal; i++)
{
Console.Write(" "+Terminal[i]);
}
Terminal[NumOfTerminal++]='$';
}
public char[] First(char Symbols)
{
char[] ft = new char[20];
int NumOfFirst=0;
if (char.IsUpper(Symbols))
{
for (int j = 0; j < Gram.Get_NumOfWenfa(); j++)
{
Wenfa wff = new Wenfa();
wff = Gram.Get_Wenfa(j);
if (wff.Wenfa_Left == Symbols)
{
if (wff.Wenfa_Right[0] == 'e')
{
if (!IsInString('e', ft))
{
ft[NumOfFirst++] = 'e';
}
}
else
{
int h = 0;
for (; h < charlength(wff.Wenfa_Right); h++)
{
char[] dd = new char[20];
char[] aa = new char[20];
dd = First(wff.Wenfa_Right[h]);
for (int hh = 0; dd[hh] != '\0'; hh++)
{
if (!IsInString(dd[hh],ft))
{
ft[NumOfFirst++] = dd[hh];
}
}
if (ft[NumOfFirst-1]!='e')
{
break;
}
}
if (h == charlength(wff.Wenfa_Right))
{
if (!IsInString('e', ft))
{
ft[NumOfFirst++] = 'e';
}
}
}
}
}
}
else
{
if (!IsInString(Symbols, ft))
{
ft[NumOfFirst++] = Symbols;
}
}
return ft;
}
public char[] Follow(char Symbols)
{
int count=0;
int NumOfFollow=0;
Wenfa wf = new Wenfa();
char[] temp = new char[20];
char[] temp0 = new char[20];
char[] temp1 = new char[20];
char[] temp2 = new char[20];
if (Symbols == Gram.Get_StartSymbols())
{
temp[NumOfFollow++] = '$';
}
for(int i0=0;i0<Gram.Get_NumOfWenfa();i0++)
{
wf = Gram.Get_Wenfa(i0);
if (IsInString(Symbols, wf.Wenfa_Right))
{
for (int i1=0; wf.Wenfa_Right[i1] != '\0'; i1++)
{
if (wf.Wenfa_Right[i1] == Symbols)
{
for (int i2 = i1 + 1; wf.Wenfa_Right[i2] != '\0'; i2++)
{
temp0[count] = wf.Wenfa_Right[i2];
}
if (charlength(temp0) == 0)
{
if (wf.Wenfa_Left != Symbols)
{
for (int i3 = 0; i3 < NumOfNonTerminal; i3++)
{
if (Ff[i3].Symbols == wf.Wenfa_Left)
{
if (Ff[i3].follow[0] != '\0')
{
for (int i4 = 0; i4 < charlength(Ff[i3].follow); i4++)
{
if (!IsInString(Ff[i3].follow[i4], temp))
{
temp[NumOfFollow++] = Ff[i3].follow[i4];
}
}
}
else
{
temp1 = Follow(wf.Wenfa_Left);
for (int i4 = 0; i4 < charlength(temp1); i4++)
{
if (!IsInString(temp1[i4], temp))
{
temp[NumOfFollow++] = temp1[i4];
}
}
}
break;
}
}
}
}
else
{
int i5 = 0;
int i6=0;
bool bl=true;
if (char.IsUpper(temp0[0]))
{
while(bl)
{
for(;i5<NumOfNonTerminal;i5++)
{
if(Ff[i5].Symbols==temp0[i6])
{
for(int i7=0;Ff[i5].first[i7]!='\0';i7++)
{
if((!IsInString(Ff[i5].first[i7],temp))&&(Ff[i5].first[i7]!='e'))
{
temp[NumOfFollow++]=Ff[i5].first[i7];
}
}
break;
}
}
if (IsInString('e', Ff[i5].first))
{
i6 = i6 + 1;
if (!char.IsUpper(temp0[i6]))
{
if ((!IsInString(temp0[i6], temp))&&(temp0[i6]!='\0'))
{
temp[NumOfFollow++] = temp0[i6];
}
bl = false;
}
else
{
bl = true;
}
}
else
{
bl = false;
}
}
int i8 = 0;
bool bbll = true;
for (; temp0[i8] != '\0'; i8++)
{
if (!char.IsUpper(temp0[i8]))
{
bbll = false;
break;
}
}
if (i8 == charlength(temp0))
{
for (int i9 = 0; temp0[i9] != '\0'; i9++)
{
for (int i10=0; i10 < NumOfNonTerminal;i10++)
{
if (Ff[i10].Symbols == temp0[i9])
{
if (!IsInString('e', Ff[i10].first))
{
bbll = false;
}
break;
}
}
}
}
if (bbll)
{
if (wf.Wenfa_Left != Symbols)
{
for (int j0 = 0; j0 < NumOfNonTerminal; j0++)
{
if (Ff[j0].Symbols == wf.Wenfa_Left)
{
if (Ff[j0].follow[0] != '\0')
{
for (int j1 = 0;j1 < charlength(Ff[j0].follow); j1++)
{
if (!IsInString(Ff[j0].follow[j1], temp))
{
temp[NumOfFollow++] = Ff[j0].follow[j1];
}
}
}
else
{
temp2 = Follow(wf.Wenfa_Left);
for (int j1 = 0; j1 < charlength(temp1); j1++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -