编译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
相关产品推荐
相关产品推荐

