相关疑难解决方法(0)

GCC和Clang解析器真的是手写的吗?

似乎GCC和LLVM-Clang使用手写递归下降解析器,而不是机器生成,基于Bison-Flex,自下而上解析.

请问有人请确认是这种情况吗?如果是这样,为什么主流编译器框架使用手写解析器?

更新:这里有关此主题的有趣博客

c compiler-construction parsing compilation

84
推荐指数
5
解决办法
3万
查看次数

在模板类中调用模板函数

免责声明:以下问题可能非常简单,我可能会对第一个答案感到震惊.此外,我想为任何重复的问题道歉 - 句法问题并不总是容易识别是口头解释,因此搜索它们并不容易......

但足够了.我有两个模板化的类,其中一个有模板化的成员函数,另一个类试图调用该函数.最小的错误生成示例如下所示:

#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++ templates

27
推荐指数
2
解决办法
2万
查看次数

从c ++代码中获取人类可读的AST

为了更好地理解C++语言和语法的一些细节,我希望能够编写一个小的C++程序,并查看编译器从中生成的AST.

看起来clang过去有这个功能(-emit-asm),但它已经删除了.

今天有一个简单的方法吗?

c++ abstract-syntax-tree

20
推荐指数
3
解决办法
1万
查看次数

功能是模糊的,不是

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++ templates

8
推荐指数
1
解决办法
153
查看次数

在可以区分比较和模板实例之前,C++的解析器会做什么?

在阅读完这个问题之后,我想知道当主要的C++编译器解析这样的代码时会发生什么(关于AST):

struct foo 
{
  void method() { a<b>c; }

  // a b c may be declared here
};
Run Code Online (Sandbox Code Playgroud)

他们像GLR解析器一样处理它还是以不同的方式处理它?还有哪些方法可以解析这个和类似的案例?

例如,我认为可以推迟解析方法体,直到整个结构被解析,但这是否真的可行且实用?

c++ compiler-construction parsing gcc clang

7
推荐指数
1
解决办法
168
查看次数