📄 doing.cs
字号:
if (!IsInString(temp2[j1], temp))
{
temp[NumOfFollow++] = temp2[j1];
}
}
}
break;
}
}
}
}
}
else
{
if (!IsInString(temp0[0], temp))
{
temp[NumOfFollow++] = temp0[0];
}
}
}
}
}
}
}
return temp;
}
public void Made_FenxiTable()
{
bool bl=true;
Ff = new FirstFollow[NumOfNonTerminal];
Fenxibiao = new FenxiTable(Terminal,NonTerminal);
Wenfa wf = new Wenfa();
for (int i = 0; i < NumOfNonTerminal; i++)
{
Ff[i] = new FirstFollow();
Ff[i].Symbols = NonTerminal[i];
char[] aas = new char[1];
Ff[i].first = First(NonTerminal[i]);
}
for (int i = 0; i < NumOfNonTerminal; i++)
{
Ff[i].follow = Follow(NonTerminal[i]);
}
for (int i = 0; i < NumOfNonTerminal; i++)
{
Console.Write("\n非终结符"+NonTerminal[i]+"\n First 集是:");
for(int j=0;Ff[i].first[j]!='\0';j++)
{
Console.Write(" "+Ff[i].first[j]);
}
Console.Write("\n Follow集是:");
for (int j = 0; Ff[i].follow[j] != '\0'; j++)
{
Console.Write(" " + Ff[i].follow[j]);
}
}
for (int i0 = 0; i0 < Gram.Get_NumOfWenfa(); i0++)
{
wf = Gram.Get_Wenfa(i0);
{
if (!IsInString('e', Ff[GetPos(wf.Wenfa_Left)].first))
{
int len = charlength(Ff[GetPos(wf.Wenfa_Left)].first);
for (int i1 = 0; i1 < len; i1++)
{
bl = Fenxibiao.Add(Ff[GetPos(wf.Wenfa_Left)].first[i1], wf);
if (!bl)
{
Console.Write("\n 在分析表的M[" + wf.Wenfa_Left + ",");
Console.Write(Ff[GetPos(wf.Wenfa_Left)].first[i1] + "]项中已有产生式.");
Console.Write("\n " + wf.Wenfa_Left + "->");
print(wf.Wenfa_Right);
Console.Write("和现在要添进的M[" + wf.Wenfa_Left + ",");
Console.Write(Ff[GetPos(wf.Wenfa_Left)].first[i1] + "]的产生式发生冲突!");
Console.Write("\n 输入的文法不是LL1文法!Q");
break;
}
}
}
else
{
if (!IsInString('$', Ff[GetPos(wf.Wenfa_Left)].follow))
{
bl = Fenxibiao.Add('$', wf);
if (!bl)
{
Console.Write("\n 在分析表的M[" + wf.Wenfa_Left + ",$]项中已有产生式.");
Console.Write("\n " + wf.Wenfa_Left + "->");
print(wf.Wenfa_Right);
Console.Write("和现在要添进的M[" + wf.Wenfa_Left + ",$]的产生式发生冲突!");
Console.Write("\n 输入的文法不是LL1文法!W");
break;
}
}
else
{
int len = charlength(Ff[GetPos(wf.Wenfa_Left)].follow);
for (int i2 = 0; i2 < len; i2++)
{
bl = Fenxibiao.Add(Ff[GetPos(wf.Wenfa_Left)].follow[i2], wf);
if (!bl)
{
Console.Write("\n 在分析表的M[" + wf.Wenfa_Left + ",");
Console.Write(Ff[GetPos(wf.Wenfa_Left)].first[i2] + "]项中已有产生式.");
Console.Write("\n " + wf.Wenfa_Left + "->");
print(wf.Wenfa_Right);
Console.Write("和现在要添进的M[" + wf.Wenfa_Left + ",");
Console.Write(Ff[GetPos(wf.Wenfa_Left)].first[i2] + "]的产生式发生冲突!");
Console.Write("\n 输入的文法不是LL1文法!E");
break;
}
}
}
}
}
}
Fenxibiao.Output();
}
public void MoveSentence(char[] sentence)
{
char[] str=new char[20];
char[] temp0 = new char[50];
char[] temp1 = new char[50];
Stack<char> S0=new Stack<char>();
Stack<char> S1=new Stack<char>();
int len0 = charlength(str);
for (int ii = 0; ii < len0; ii++)
{
str[ii] = sentence[ii];
}
S0.Push('$');
Console.Write("\n 下面是对");
print(str);
Console.Write("进行分析所做的移动:");
Console.Write("\n ━━━━━━━┯━━━━━━━━━┯━━━━━━━━━");
Console.Write("\n STACK │ 输 入 │ 输 出 ");
Console.Write("\n ━━━━━━━┿━━━━━━━━━┿━━━━━━━━━");
str[len0++] = '$';
temp0 = str;
for (int i = len0 - 1; i >= 0; i--)
{
S1.Push(str[i]);
}
int len1 = 0;
temp1[len1++] = '$';
temp1[len1++] = Gram.Get_StartSymbols();
S0.Push(Gram.Get_StartSymbols());
Console.Write("\n ");
print(temp1);
for (int j = 0; j < 13 - charlength(temp1); j++)
{
Console.Write(" ");
}
Console.Write("│");
for (int j = 0; j < 18 - S1.Count; j++)
{
Console.Write(" ");
}
print(temp0);
Console.Write("│");
bool flag = false;
char ch = S0.Peek();
int k = 0;
while (str[k] != '$' && ch != '$')
{
char ip = str[k];
ch = S0.Peek();
if (IsInString(ch, Terminal) || ch == '$')
{
if (ch == ip)
{
S0.Pop();
S1.Pop();
k++;
for (int k0 = 0; k0 < S1.Count; k0++)
{
temp0[k0] = str[k0 + k];
}
temp1[len1 - 1] = '\0';
len1--;
Console.Write("\n ");
print(temp1);
for (int k1 = 0; k1 < 13 - charlength(temp1); k1++)
{
Console.Write(" ");
}
Console.Write("│");
for (int k2 = 0; k2 < 18 - S1.Count; k2++)
{
Console.Write(" ");
}
print(temp0);
Console.Write("│");
}
else
{
flag = true;
break;
}
}
else
{
if(!Fenxibiao.IsEmpty(ch,ip))
{
Wenfa wf = new Wenfa();
wf = Fenxibiao.Get(ch,ip);
S0.Pop();
temp1[len1 - 1] = '\0';
len1--;
for (int j = charlength(wf.Wenfa_Right) - 1; j >= 0; j--)
{
S0.Push(wf.Wenfa_Right[j]);
temp1[len1++] = wf.Wenfa_Right[j];
}
Console.Write("\n ");
print(temp1);
for (int k0 = 0; k0 < 13 - charlength(temp1); k0--)
{
Console.Write(" ");
}
Console.Write("│");
for (int k0 = 0; k0 < 18 - S1.Count; k0++)
{
Console.Write(" ");
}
print(temp0);
Console.Write("│");
Console.Write(" "+wf.Wenfa_Left+"->");
print(wf.Wenfa_Right);
}
else
{
flag = true;
break;
}
}
}
if (flag)
{
Console.Write("\n ━━━━━━━┷━━━━━━━━━┷━━━━━━━━━");
Console.Write("\n 检测出现错误! 你输入的字符串不是LL1文法。");
Console.Write("\n 请按任意键继续......");
}
else
{
Console.Write("\n ━━━━━━━┷━━━━━━━━━┷━━━━━━━━━");
Console.Write("\n 检测成功! ");
Console.Write("\n");
}
}
public void Run()
{
char bl='y';
char[] sentence=new char[20];
Get_Grammar();
Made_FenxiTable();
while(bl=='y')
{
Console.Write("\n\n请输入要验证的字符串:");
string a=Console.ReadLine();
sentence = a.ToCharArray();
MoveSentence(sentence);
Console.Write("\n是否继续进行验证(y or n)?");
bl =Convert.ToChar(Console.ReadLine());
}
}
public int charlength(char[] a)
{
int i = 0;
for (; i<a.Length; i++)
{
if (a[i] == '\0')
{
break;
}
}
return i;
}
public bool IsInString(char a,char [] b)
{
for (int i = 0; b[i] != '\0'; i++)
{
if (b[i] == a)
{
return true;
}
}
return false;
}
public int GetPos(char ch)
{
int j = 0;
for (int i=0; i < NumOfNonTerminal; i++)
{
if (ch == Ff[i].Symbols)
{
j = i;
break;
}
}
return j;
}
public void print(char[] a)
{
for (int i = 0; i < charlength(a); i++)
{
Console.Write(a[i]);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -