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

pan*_*skj 7 c++ compiler-construction parsing gcc clang

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

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

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

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

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

ric*_*ici 2

虽然当然可以使用GLR技术来解析C++(参见Ira Baxter的一些答案),但我相信gcc和clang等常用编译器中常用的方法正是推迟函数体的解析直到类定义完成。(由于 C++ 源代码在解析之前经过预处理器,因此解析器对标记流进行工作,而这正是重新解析函数体时必须保存的内容。我不认为重新解析源代码是可行的。 )

很容易知道函数定义何时完成,因为{}即使不知道尖括号如何嵌套,大括号 ( ) 也必须保持平衡。

C++ 并不是唯一一种将解析推迟到处理完声明之后有用的语言。例如,允许用户定义具有不同优先级的新运算符的语言将要求在已知运算符的名称和优先级后对所有表达式进行(重新)解析。一个更病态的例子是 COBOL,其中ORin的优先级a = b OR c取决于是c整数(a等于 或 之一bc还是布尔值(a等于bc为 true)。以这种方式设计语言是否是一个好主意是另一个问题。