📄 main.cs
字号:
}
xiayige();//下一个
}
shuchui(3); shuchus("endif ");//输出接口的基本块划分
}
else if (searchelse() == 1)//有else的情况 即为if then else endif
{
//textBox1.Text = searchelse().ToString();//测试用
yuxianpd = researchelse();//进行出口的判断
linshi_int2 = hangshu + yuxianpd+2;//计算出口
tiaozhuans(linshi_int2);//输出无条件天转的四元式
while (now != 2)//else 当now不为else的时候执行
{
if (now == 17) //=
{
fuzhis(); //赋值计算
}
xiayige();//下一个
}
xiayige();
shuchui(2); shuchus("else ");//输出接口的基本块划分
yuxianpd = researchif();//进行出口的判断
linshi_int2 = hangshu + yuxianpd + 1;//计算出口
tiaozhuans(linshi_int2);//输出无条件天转的四元式
while (now != 3)//endif 当now不为endif的时候执行
{
if (now == 17) //=
{
fuzhis(); //赋值计算
}
xiayige();//下一个
}
shuchui(3); shuchus("endif ");//输出接口的基本块划分
}
else return "error";
}
return "succeed";//返回
}
listBox1.Items.Add("错误 !");
return "error";//返回
}
//以下是while循环部分
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public string whiles()//while的功能【完成】
{
shuchui(6); shuchus("while ");//输出接口的基本块划分
xiayige(); xiayige();//下两个是bool式子的第一个id
switch (now)//判断now
{
case 32://如果是id(只可能是id)
xiayige();//下一个
linshi_int1 = hangshu;//先记录现在的行数然后在读到endwhile的时候产生一个无条件的跳转
if (now == 18 || now == 19 || now == 20 || now == 21 || now == 22 || now == 23) { bools(); }//判断产生bool式的条件
else { listBox1.Items.Add("错误 !while 后面应跟bool表达式"); break; }//如果不是bool式报错
//tiaozhuans(hangshu);//测试用
xiayige();//下一个取do
shuchui(7); shuchus("do ");//输出接口的基本块划分
if(now==7)//do
{
yuxianpd = research();//进行出口的判断
linshi_int2 = hangshu + yuxianpd + 2;//计算出口
tiaozhuans(linshi_int2);//输出无条件天转的四元式
while (now != 8)//endwhile 当now不为endwhile的时候执行
{
if (now == 17) //=
{
fuzhis(); //赋值计算
//tiaozhuans(hangshu);//测试用
}
xiayige();//下一个
}
}
if (now == 8) { tiaozhuans(linshi_int1); }//最后一个无条件跳转指向第一句
shuchui(8); shuchus("endwhile ");//输出接口的基本块划分
//tiaozhuans(hangshu);//测试用
//richTextBox3.Find("L5");//测试用
return "succeed";//返回
}
listBox1.Items.Add("错误 !");
return "error";//返回
}
//以下是判断部分
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public string bools()//bool判断的功能【完成】
{
shangyige();//当检测到=的时候,向前一个,由于赋值式的等号左边不能为多项式,所以直接赋出口
switch (now)//检测now
{
case 32://id的情况
{
siyuanshi[1] = shuru_s[tip];//取id1
xiayige();//下一个元素
siyuanshi[0] = shuru_s[tip];//取符号
xiayige(); //下一个元素
siyuanshi3[1] = siyuanshi[1];//存放于临时变量
siyuanshi3[0] = siyuanshi[0];//存放于临时变量
siyuanshi[2] = bools_fuzhu();//计算等号后面的式子的四元式
{
linshi_int = hangshu + 2;//跳转的行数=之中的四元式的行数+两个无条件jump
linshi = shuchu_hangshu(linshi_int);//产生行数
siyuanshi[3] = linshi;//加入四元式
}
siyuanshi[0] = siyuanshi3[0];//从临时变量中取出
siyuanshi[1] = siyuanshi3[1];//从临时变量中取出
printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]);//进行具体的输出
}
return "Error";//错误提示
}
return "Error";//错误提示
}
public string bools_fuzhu()//bool函数的辅助函数【完成】//计算等号后面的式子的四元式
{
while (now != 26)//当now的值不为;的时候
{
//textBox2.Text = shuru_s[tip];//测试用
if (now == 32)//当是简单赋值的情况
{
xiayige();//下一个
if (now == 26) { shangyige(); return shuru_s[tip]; }//检测是不是;如果是直接返回
}
if (now == 30)//当是常整数的时候执行
{
return shuru_s[tip];//返回常整数的值
}
if (now == 27)//当是字符常数的时候执行
{
xiayige();//跳过‘
linshi = "'" + shuru_s[tip] + " '";//输出字符常数
xiayige();//跳过’
return linshi;
}
if (now == 15 || now == 16)//如果是乘除的话执行
{
//textBox1.Text =" eeee";
chenchus();//调用chechu()
return huacunpdcuan();//测试用
}
if (now == 13 || now == 14)//如果是加减的话执行
{
jiajians();//调用jiajian()
//textBox1.Text = huacunpdcuan();//检测用
return huacunpdcuan();//测试用
}
xiayige();//下一个运算符
}
return "error";
//return huacunpdcuan();//返回
}
//以下部分是赋值的功能
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public string fuzhis()//赋值的功能【完成】
{
shangyige();//当检测到=的时候,向前一个,由于赋值式的等号左边不能为多项式,所以直接赋出口
switch (now)//检测now
{
case 32://id的情况
{
siyuanshi[3] = shuru_s[tip];//取出口
//textBox3.Text = shuru_s[tip];
xiayige();//下一个元素
siyuanshi[0] = shuru_s[tip];//取符号
//textBox2.Text = shuru_s[tip];
xiayige(); //下一个元素
siyuanshi3[3] = siyuanshi[3];//存放于临时变量
siyuanshi3[0] = siyuanshi[0];//存放于临时变量
//textBox1.Text = shuru_s[tip];//测试用
siyuanshi[1] = fuzhis_fuzhu();//计算等号后面的式子的四元式
siyuanshi[2] = "_";//id2 必定为空
siyuanshi[0] = siyuanshi3[0];//从临时变量中取出
siyuanshi[3] = siyuanshi3[3];//从临时变量中取出
printf(siyuanshi[0], siyuanshi[1], siyuanshi[2], siyuanshi[3]);//进行具体的输出
}
return "Error";//错误提示
}
return "Error";//错误提示
}
public string fuzhis_fuzhu()//赋值函数的辅助函数【完成】//计算等号后面的式子的四元式
{
//textBox3.Text = shuru_s[tip];
while (now != 26)//当now的值不为;的时候
{
//textBox2.Text = shuru_s[tip];//测试用
if (now == 32)//当是简单赋值的情况
{
xiayige();//下一个
if (now == 26) { shangyige(); return shuru_s[tip]; }//检测是不是;如果是直接返回
}
if(now==30)//当是常整数的时候执行
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -