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这一层,看完恍然大悟!也可能是忘记了
shift
和reduce
的含义,也可能是深夜困了!
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;
}
}
}