我一直在使用Boost迷你编译器示例.以下是源代码的根目录:http://www.boost.org/doc/libs/1_59_0/libs/spirit/example/qi/compiler_tutorial/mini_c/
我感兴趣的片段在 statement_def.hpp
我遇到的问题是,如果你附加语义动作,例如像这样,
statement_ =
variable_declaration[print_this_declaration]
| assignment
| compound_statement
| if_statement
| while_statement
| return_statement
;
Run Code Online (Sandbox Code Playgroud)
然后mini_c在一个示例程序上运行编译器,如:
int foo(n) {
if (n == 3) { }
return a;
}
int main() {
return foo(10);
}
Run Code Online (Sandbox Code Playgroud)
它触发"compile.cpp"文件中的"重复功能错误"(使用上面的链接找到).以下是该片段的快速参考:
if (functions.find(x.function_name.name) != functions.end())
{
error_handler(x.function_name.id, "Duplicate function: " + x.function_name.name);
return false;
}
Run Code Online (Sandbox Code Playgroud)
对于我的生活,我无法弄清楚为什么.
我不确定如何表征这个问题,但似乎无论如何发送到标准输出的任何东西都被解析器选为解析的有效代码(但在这种情况下似乎不可能).
另一种可能性是语义动作以某种方式将外部数据绑定到符号表,其中它再次被认为是最初解析的输入文件的一部分(当它不应该是时).
最后也可能的选择是,我可能并不完全理解这个例子的细节(或者就此而言是Boost),并且当指针/引用/迭代器不应该转移到另一个内存位置时(如SA的结果,使整个迷你编译器陷入混乱.
我有一个异步运行的函数.不幸的是,它只会偶尔吐出正确的答案.futures[i].get()每次运行代码时由更改表示的值.我是多线程的新手.
double async_func() const {
vector<future<double>> futures;
double val = 0;
for (int i = 0; i < rows; i++) {
futures.push_back(std::async(std::launch::async, [&] {return minor(i,0).determinant();}) );
}
for (int i = 0; i < rows; i++)
val += futures[i].get();
return val;
}
Run Code Online (Sandbox Code Playgroud)