循环问题中的YACC / LEX yyparse()

时间:2015-05-12 18:27:01

标签: c++ loops yacc lex

我正在尝试在循环中解析输入,直到用户输入“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);

1 个答案:

答案 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);