小小的GoTo语句

2024/11/18

1. goto语句示例

int parse()
{
	Token tok;
reading:
  tok = gettoken();
  if (tok == END)
    return ACCEPT;
shifting:
  if (shift(tok))
    goto reading;
reducing:
  if (reduce(tok))
    goto shifting;
  return ERROR;
}

2. 不使用goto语句情况

下面是来自ChatGPT的回答!脑袋笨,想不到ChatGPT这一层,看完恍然大悟!也可能是忘记了shiftreduce的含义,也可能是深夜困了!

2.1 示例1

int parse()
{
    Token tok;
    while (true)
    {
    		// Reading state
        tok = gettoken();
        if (tok == END)
            return ACCEPT;
        while (true)
        {
            // Shifting state
            if (shift(tok))
                break; // 回到外层循环继续读取 token
            // Reducing state
            if (reduce(tok))
                continue; // 继续尝试移位
            return ERROR; // 无法归约时返回错误
        }
    }
}

2.2 示例2

int parse()
{
    Token tok;
    enum State { READING, SHIFTING, REDUCING } state = READING;

    while (true)
    {
        switch (state)
        {
        case READING:
            tok = gettoken();
            if (tok == END)
                return ACCEPT;
            state = SHIFTING;
            break;

        case SHIFTING:
            if (shift(tok))
            {
                state = READING;
            }
            else
            {
                state = REDUCING;
            }
            break;

        case REDUCING:
            if (reduce(tok))
            {
                state = SHIFTING;
            }
            else
            {
                return ERROR;
            }
            break;
        }
    }
}

2.3 示例3

int parse()
{
    Token tok;
    auto reading = [&]() -> bool {
        tok = gettoken();
        return tok != END;
    };

    auto shifting = [&]() -> bool {
        return shift(tok);
    };

    auto reducing = [&]() -> bool {
        return reduce(tok);
    };

    while (true)
    {
        if (!reading())
            return ACCEPT;

        while (true)
        {
            if (shifting())
                break;

            if (!reducing())
                return ERROR;
        }
    }
}