form1.cs
来自「实现了此法分析器和语法分析器 有详细的代码和文档」· CS 代码 · 共 2,012 行 · 第 1/5 页
CS
2,012 行
for (u = 0; u < 16; u++)
for (v = 0; v < 2; v++)
{
string n_Data = n_SR.ReadLine();
strArray2[u, v] = n_Data;
}
n_SR.Close();
}
private void Form1_Load_1(object sender, EventArgs e)
{
initiate();
}
//语法分析器(递归下降)-----------------------------------------------------------------------------------------------------------------------------------
public string sym, sym1;
public int i1 = -1;
public int i2=0,i4=0;//变量/过程数组指针
public int i3 = -1;
public int pi;//存过程名在数组中的位置
public int pv;//过程中第一个变/参数在变量名表中的位置
public int vf=-1;//过程中有无变量的标志
public int countv = 0;//某一过程中参数+变量总个数
public int countpar = 0;//某一过程中参数个数
public string str3 = "";
public string sss = "";
public int acc = 0;
public int pd = 0;//过程计数器
public int bbb = 0;//填过程名表标志
public int cc = 0;//主过程与子过程的区别
public string[,] strArray3 = new string[100, 3];//变量名表
public string[,] strArray4 = new string[100, 6];//过程名表(第五列为过程调用结束时的号码)
/// <summary>
/// stringArray1存的词法分析分析出来的结果
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
initilize1();//使用变量i1,i2,i4
initilize2(); //给张凯用
getword();
PROG();//主程序开始
richTextBox3.Text = str3;
outtable();
OUT4();//输出四元式
}
public void getword()//从二元式文件读一个单词
{
i1 = i1 + 1;
sym=strArray1[i1,1];
}
public void PROG()//主程序开始和结尾
{
if (sym == "1")//program
{
str3 = strArray1[i1, 0];
getword();
if (sym == "17")//标识符
{
pi = i1;//暂存过程名
str3 = str3 + " " + strArray1[i1, 0];
getword();
if (sym == "33")//“;”
{
str3 = str3 + strArray1[i1, 0];
getword();
if (sym == "35")//Enter
{
str3 = str3 + "\n";
getword();
i3 = 0;//变量在主程序层
PP();//调<过程>
GEN(9, -1, -1, -1, -1, -1, -1);//停机
if (sym == "34")//结束符“.”
{
str3 = str3 + strArray1[i1, 0];
}
else
{
error1(4);
skip();
}
}
else
{
error1(3);
skip();
}
}
else
{
error1(2);
skip();
}
}
else
{
error1(1);
skip();
}
}
else
{
error1(0);
skip();
}
}
public void PP()//过程
{
if (sym == "2")//var
{
vf = 1;//过程中有变量的标志设为1
str3 = str3 + strArray1[i1, 0];
IDP();
}
while (sym == "3")//procedure,规定没有procedure的嵌套,循环判断是不是过程
{
vf = 0;
countv = 0;
countpar = 0;
cc = 1;
pv = -1;//当过程无参数无变量时,在变量名表中的位置为-1
str3 = str3 + strArray1[i1, 0];
pd = pd + 1;
pc = pd * 100;
PRP();
}
if (sym == "4")//begin
{
if (vf == 0)
{
if (cc == 1)//子程序的begin
{
enterp(pi, countpar, countv, pv);//填过程名表
GEN(8, -1, -1, i4, -1, -1, -3);//子过程申请空间
bbb = 1;
}
}
if (cc == 0)//是主程序的begin
{
GEN(22, -1, -1, -1, -1, -1, -1);//主程序开始的产生式
backpatch(0, 2);
}
str3 = str3 + strArray1[i1, 0] + "\n";
PL();//调用张凯的接口
if (sym == "5")//end
{
str3 = str3 + strArray1[i1, 0];
vf = -1;
getword();
}
else
error1(6);
}
else
{
error1(5);
error1(6);
}
}
public void PRP()//子程序开始和结尾
{
getword();
if (sym == "17")
{
pi = i1;//每次getword都加1
str3 = str3 + " " + strArray1[i1, 0];
getword();
if (sym == "30")//“(”
{
str3 = str3 + strArray1[i1, 0];
getword();
i3 = 1;//变量在子过程中
PART();//处理参数
}
if (sym == "33")//“;”
{
str3 = str3 + strArray1[i1, 0];
getword();
if (sym == "35")//Enter
{
str3 = str3 + "\n";
getword();
i3 = 1;//变量在子过程中
PP();
GEN(7, -1, -1, -1, -1, -1, -1);//返回,范一鹏调用
//pc = pc - 1;//回到前一条四元式号
//strArray4[i4 - 1, 5] = pc.ToString();//记录call调用结束后无条件跳转的号码
//pc = pc + 1;//还原
if (sym == "33")//;
{
str3 = str3 + strArray1[i1, 0];
vf = -1;
pc = 0;
cc = 0;
getword();
if (sym == "35")//Enter
{
str3 = str3 + "\n";
getword();
}
else
error1(3);
}
else
error1(2);
}
else
error1(3);
}
else
error1(2);
}
else
error1(1);
}
public void IDP()//识别变量
{
getword();
while (sym == "17")
{
countv = countv + 1;//变量的相对数,变量名表的第3列
if (countv == 1)
pv = i2;
enterv(i1,countv);//填表
str3 = str3 + " " + strArray1[i1, 0];
getword();
if (sym == "32")//“,”
{
str3 = str3 + strArray1[i1, 0];
getword();
if (sym == "35")
{
error1(8);
}
}
else if (sym == "33")//“;”
{
str3 = str3 + strArray1[i1, 0];
getword();
if (sym == "35")
{
str3 = str3 + "\n";
getword();
}
else
error1(3);
}
else
error1(2);
}
if (cc == 1)//是子过程
{
enterp(pi, countpar, countv, pv);//填过程名表
GEN(8, -1, -1, i4, -1, -1, -3);//
bbb = 1;
}
else//是主过程
{
enterp(pi, countpar, countv, pv);//填过程名表
strArray4[i4, 4] = "1";
i4 = i4 + 1;
}
i3 = -1;//回原始态
}
public void PART()//识别参数
{
countpar = 0;
while (sym == "17")
{
countpar = countpar + 1;
countv = countv + 1;
if (countv == 1)
pv = i2;
enterv(i1, countpar);
str3 = str3 + " " + strArray1[i1, 0];
getword();
if (sym == "32")//“,”
{
str3 = str3 + strArray1[i1, 0];
getword();
if (sym == "35")
{
error1(8);
}
}
else if (sym == "31")//“)”
{
str3 = str3 + strArray1[i1, 0];
getword();
}
}
}
public void PL()//可执行语句
{
int i;
getword();
PASERSTACK[0,0] = 0;
acc = 0;//
while (acc!=999)
{
if (sym == "35")
{
getword();
}
else
{
if (PASERSTACK[SP,0] == 1 && sym == "5")
{
acc = 999;
}
else
{
lookupaction(sym);
if (n3 == 0)
{
getword();
}
for (i = 0; i <= SP; i++)//显示栈的情况
{
sss = sss + PASERSTACK[i,0].ToString()+" ";
if (i == SP)
sss = sss + "\n";
}
}
}
}
richTextBox6.Text = richTextBox6.Text+sss;
SP = 0;//为下一次分析做准备
}
public void enterp(int k0,int k1,int k2,int k3)//填过程名表
{
strArray4[i4, 0] = strArray1[k0, 0];//过程名
strArray4[i4, 1] = k1.ToString(); ;//过程的参数个数
strArray4[i4, 2] = k2.ToString();//过程的变量个数+参数个数
strArray4[i4, 3] = k3.ToString();//过程的第一个变量(或参数)在变量名表的位置
}
public int lookupp()//查过程名表,范一鹏查表
{
int i;
for (i = 0; i <= i4-1; i++)
{
if (strArray4[i, 0] == strArray1[i1, 0])//过程名表的字符==当前读入字符
{
break;
}
}
return i;
}
public void enterv(int k,int k1)//填变量名表,k是当前读词法分析表数组的下标,getword一次,加1,k1是过程参数/变量的相对个数
{
strArray3[i2, 0] = strArray1[k, 0];//变量名
if (i3 == 0)
{
strArray3[i2, 1] = "0";//主过程变量
}
if (i3 == 1)
{
strArray3[i2, 1] = "1";//过程变量
}
strArray3[i2, 2] = k1.ToString();//变量相对数
i2 = i2 + 1;
}
public int lookupv()//查变量名表
{
int i;
for (i = 0; i <= i2-1; i++)
{
if (strArray3[i, 0] == strArray1[i1, 0])//变量名表的字符==当前读入字符
{
break;
}
}
return i;
}
public void skip()//跳过若干个单词
{
while(sym!="2" & sym!="3" & sym!="4")
getword();
PP();
}
public void error1(int e)//错误处理
{
if (e==0)
MessageBox.Show("缺少program");
else if (e==1)
MessageBox.Show("缺少标识符");
else if (e == 2)
MessageBox.Show("缺少;");
else if (e == 3)
MessageBox.Show("缺少Enter");
else if (e == 4)
MessageBox.Show("缺少.");
else if (e == 5)
MessageBox.Show("缺少begin");
else if (e == 6)
MessageBox.Show("缺少end");
else if (e == 7)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?