我正在尝试在循环中解析输入,直到用户输入“quit”。但是,当我通过参数传递查询时,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);
答案 0 :(得分:1)
这主要是一个问题,而不是yacc问题。
默认情况下,lex词法分析器将从stdin读取,直到达到EOF。一旦你完成EOF,你就完成了 - 从stdin进一步读取并调用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);