这道题真毒瘤

虽然是本蒟蒻纯靠自己A的第一道紫题

不管怎么说,这道题也是编了3天的,交了差不多10次


好了,言归正传,这道题到底怎么做呢?

首先,这道题用C++肯定不方便,毕竟字符串处理题,所以目标选定pascal(会两种语言就是好)。

然后,我们来思考怎么构建这个程序。

你的第一个想法基本上是:一行一行做下来,然后用一些数组记录每个变量,然后每做到一个变量或每句话判断一下。

然而,很显然,只做一遍是很难实现的,至少在逻辑上不是很简单。

所以,我的方法是这样的:

  1. 将原来的代码简化成一些简单的符号表示,并计算出总行数
  2. 处理PARAM语句
  3. 依次从第行到第行做下来,这一遍只判断是否有unreachable的情况,在这一遍中,遇到的变量用一个判断
  4. 对于每一个而言,我们从头开始再做一遍

这是第一,二部分

这是第三部分

我们用来记录当前的级别

我们用数组来记录当前级别内是处于模式还是模式

我们用来记录是否可以出现错误1,即如果这句话没有被做到的话,

我们用数组来记录在该级别,该模式下是否存在过,若有,即为

值得注意的是,如果那么

这点相当于

第7行是不会被做到的

如果做一句话的时候,,且这句话不为,那么报告2错误。

记住,stack2不要打成stack,就因为这一点,我浪费了2个小时!

第四部分

同样用一个数组,一个数组(和相似)

用一个来表示这一句话是否可以被做到,如果不能做到,那么这一句赋值就是白搭(如果你想的话也可以再用一次数组哦)

注释1:

这里不该返回错误

注释2:

这里应该在第5行返回错误

还有一些容易出错的地方:

再次提醒:变量名不要弄混了!!!

完整代码