似乎GCC和LLVM-Clang使用手写递归下降解析器,而不是机器生成,基于Bison-Flex,自下而上解析.
请问有人请确认是这种情况吗?如果是这样,为什么主流编译器框架使用手写解析器?
更新:这里有关此主题的有趣博客
免责声明:以下问题可能非常简单,我可能会对第一个答案感到震惊.此外,我想为任何重复的问题道歉 - 句法问题并不总是容易识别是口头解释,因此搜索它们并不容易......
但足够了.我有两个模板化的类,其中一个有模板化的成员函数,另一个类试图调用该函数.最小的错误生成示例如下所示:
#include <iostream>
template <typename T>
class Foo {
public:
Foo() {
}
template <typename outtype>
inline outtype bar(int i, int j, int k = 1) {
return k;
}
};
template <typename T>
class Wrapper {
public:
Wrapper() {
}
double returnValue() {
Foo<T> obj;
return obj.bar<double>(1,2); // This line is faulty.
}
};
int main() {
Wrapper<char> wr;
double test = wr.returnValue();
std::cout << test << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译时,这会导致
expected primary-expression before 'double' …Run Code Online (Sandbox Code Playgroud) 为了更好地理解C++语言和语法的一些细节,我希望能够编写一个小的C++程序,并查看编译器从中生成的AST.
看起来clang过去有这个功能(-emit-asm),但它已经删除了.
今天有一个简单的方法吗?
我xxx is ambiguous在处理我的c ++项目时得到了.由于整个项目太大而无法在这里上传,我做了一个简单的例子,弹出相同的错误信息.
#include <string>
#include <memory>
namespace a {
template <typename T, typename Target>
inline std::shared_ptr<T> getShared(Target const& t)
{
return std::static_pointer_cast<T>(t->shared_from_this());
}
class A : public std::enable_shared_from_this<A>
{
};
}
namespace b {
template <typename T, typename Target>
inline std::shared_ptr<T> getShared(Target const& t)
{
return std::static_pointer_cast<T>(t->shared_from_this());
}
class A : public std::enable_shared_from_this<A>
{
};
void invoke()
{
// ERROR OCCURED!!!
a::A* a;
getShared<a::A>(a);
// But this is compiled without any problem :(
// A* a; …Run Code Online (Sandbox Code Playgroud) 在阅读完这个问题之后,我想知道当主要的C++编译器解析这样的代码时会发生什么(关于AST):
struct foo
{
void method() { a<b>c; }
// a b c may be declared here
};
Run Code Online (Sandbox Code Playgroud)
他们像GLR解析器一样处理它还是以不同的方式处理它?还有哪些方法可以解析这个和类似的案例?
例如,我认为可以推迟解析方法体,直到整个结构被解析,但这是否真的可行且实用?