词法分析器设计实验报告 联系客服

发布时间 : 星期五 文章词法分析器设计实验报告更新完毕开始阅读

String str1=\ int i = 0;

int[] a = new int[10]; while (stack.Count != 0) {

a[i] = stack.Pop(); i++; }

while (i != 0) {

i--;

str1 = str1 + a[i].ToString(); stack.Push(a[i]); }

return str1; }

private void mainControlProgram() {

String s=ACTION(S_Stack.Peek(),In_Stack[0]); int k = 1;

String data1 = k.ToString(), data2 = getStackString(S_Stack), data3 = Sym_Stack, data4 = In_Stack;

String action = \ k++;

while(s!=\ int s1 = getStringInt(ACTION(S_Stack.Peek(), In_Stack[0])); if (ACTION(S_Stack.Peek(), In_Stack[0])==null||ACTION(S_Stack.Peek(), In_Stack[0]).Length == 0) ;

else if (ACTION(S_Stack.Peek(),In_Stack[0])[0]=='s')//ACTION[s,a]为移进 {

action = \\状态\入栈\ S_Stack.Push(s1);//状态入栈

Sym_Stack = Sym_Stack + In_Stack[0];//符号入栈

In_Stack = Reverse(Reverse(In_Stack).Remove(In_Stack.Length - 1));//输入串出栈

}

else if (ACTION(S_Stack.Peek(),In_Stack[0])[0]=='r')//ACTION[s,a]为归约 {

String s_old = \

for (int i = 0; i < Production[s1-1].Production.Length; i++) {

S_Stack.Pop();//状态出栈

s_old = s_old + Sym_Stack[Sym_Stack.Length - Production[s1 -

1].Production.Length+i]; }

int s_top=S_Stack.Peek();

S_Stack.Push(GOTO(s_top,Production[s1-1].Nonterminal));//状态入栈 Sym_Stack = Sym_Stack.Remove(Sym_Stack.Length - Production[s1-1].Production.Length);//符号出栈

Sym_Stack = Sym_Stack + Production[s1-1].Nonterminal;//符号入栈 String s_new = Production[s1 - 1].Nonterminal.ToString();

action = s + \+ s_new + \+ s_old + \归约,\+ \+ s_top.ToString() + \- 1].Nonterminal).ToString()+\入栈\ }

if (k == 1) ; else

addData(data1, data2, data3, data4, action); data1 = k.ToString();

data2 = getStackString(S_Stack); data3 = Sym_Stack; data4 = In_Stack; action = \ k++;

s = ACTION(S_Stack.Peek(), In_Stack[0]); }

addData(data1, data2, data3, data4, \:分析成功 \ }

private void button1_Click(object sender, EventArgs e) {

error = 0;

dataGridView2.Rows.Clear(); InitAction(); InitGoto();

InitProduction(); addActionData(); addGotoData(); InitStack();

mainControlProgram(); } } }

七、实验总结

本次实验通过对LR(1)分析表的构造,实现了LR(1)分析器的设计。通过上次对C#的学

习,本次实验完全采用面向对象的思想对LR(1)分析器进行设计,包括类的构造和函数的封装。本次实验通过测试不同的输入串,程序均完美运行。通过本次实验,更加锻炼了动手编程的能力,和对LR(1)分析法的掌握。