You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译bison-doc的calc++示例后运行直接退出,如何解决?

问题分析与解决方法

你遇到的问题是这个calc++示例程序的默认行为是读取命令行指定的输入文件,如果没有传递任何文件参数,它不会主动读取标准输入,而是直接退出。下面给出两种解决思路:


方法1:临时测试(无需修改代码)

如果你只是想快速验证程序功能,可以通过管道或输入重定向给它提供输入:

  • 使用管道直接传递表达式:
    echo "3 + 5 * 2" | ./calc++
    
  • 或者创建一个包含表达式的文本文件(比如input.txt,内容写10 - 4 / 2),然后运行:
    ./calc++ input.txt
    
  • 也可以用输入重定向:
    ./calc++ < input.txt
    

方法2:修改代码让程序默认读取标准输入

如果希望程序在没有参数时自动等待终端输入,需要修改两处代码:

步骤1:修改calc++.cc的main函数

打开/tmp/calc++/calc++.cc,找到main函数,修改为以下内容:

int
main (int argc, char* argv[])
{
  calcxx_driver driver;
  bool has_input_file = false;

  for (int i = 1; i < argc; ++i) {
    if (argv[i] == string ("-p"))
      driver.trace_parsing = true;
    else if (argv[i] == string ("-s"))
      driver.trace_scanning = true;
    else {
      if (!driver.parse (argv[i]))
        return 1;
      has_input_file = true;
    }
  }

  // 如果没有指定输入文件,读取标准输入
  if (!has_input_file) {
    if (!driver.parse("-"))
      return 1;
  }

  return 0;
}

步骤2:修改calc++-scanner.ll的scan_begin函数

打开/tmp/calc++/calc++-scanner.ll,找到calcxx_driver::scan_begin函数,修改为:

void calcxx_driver::scan_begin ()
{
  if (file.empty() || file == "-") {
    // 使用标准输入
    yyin = stdin;
  } else {
    yyin = fopen(file.c_str(), "r");
    if (!yyin) {
      std::cerr << "Error: Could not open file '" << file << "'" << std::endl;
      exit(EXIT_FAILURE);
    }
  }
}

步骤3:重新编译运行

make clean
make
./calc++

现在你就可以直接在终端输入表达式(比如4 + 6),按回车就能看到计算结果了。


内容的提问来源于stack exchange,提问作者user10082400

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:51:56