我试图在循环中解析输入,直到用户输入“退出”。但是,当我通过参数传递查询时,yyparse() 有效,但当我在循环中执行相同的过程时,它显示错误。
我已经检查了“cmd”,它显示了准确输入的用户查询。
int main(int argc, char* argv[]) {
string cmd;
string terminate = ".q";
do
{
cout << endl << "Enter Query>";
std::getline(std::cin, cmd);
int parse = -1;
if (yyparse() == 0) {
cout << "OK!" << endl;
parse = 0;
}
else {
cout << "Error!" << endl;
parse = -1;
//continue;
}
} while (cmd != terminate);
最佳答案
这主要是一个 lex 问题,而不是 yacc 问题。
默认情况下,lex 词法分析器将从 stdin 读取,直到到达 EOF。一旦到达 EOF,就大功告成了——所有进一步从标准输入读取和调用 yylex 都会返回 EOF。
如果你想从其他地方(比如字符串)读取,你需要做一些其他的事情。 Flex 提供 yy_scan_string
来读取字符串,如果您使用它,yylex
会在您到达字符串末尾时调用返回 EOF,此时您可以调用 yy_scan_string
再次读取另一个字符串。所以像这样:
do
{
cout << endl << "Enter Query>";
std::getline(std::cin, cmd);
YY_BUFFER_STATE buf = yy_scan_string(cmd.c_str());
int parse = -1;
if (yyparse() == 0) {...
yy_delete_buffer(buf);
关于c++ - YACC/LEX yyparse() 循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30198761/