c++ - YACC/LEX yyparse() 循环问题

标签 c++ loops yacc lex

我试图在循环中解析输入,直到用户输入“退出”。但是,当我通过参数传递查询时,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/

相关文章:

c - yacc 中的左值语法不正确地归约

linux - 使用 lex 和 yacc

c++ - 如何在 Magick++ 中编写这些 `convert` 命令?

c++ - 为什么我得到 "Error: expected primary-expression before ' <<' token."

c - 在 C 中扫描文件

r - 用于查找每场比赛总和的矢量化替代方案

c++ - 我如何通过 Xcode 让项目在终端中运行?

C++ Eigen 稀疏矩阵乘法比 python scipy.sparse 慢得多

JQuery从列表框中获取选定的项目并以逗号分隔

python - yacc 无法归约 (Python Lex-Yacc)