看完this question我想知道当主要的 C++ 编译器像这样解析代码时会发生什么(关于 AST):
struct foo
{
void method() { a<b>c; }
// a b c may be declared here
};
他们是像 GLR 解析器那样处理它还是以不同的方式处理它?还有哪些其他方法可以解析这种情况和类似情况?
例如,我认为可以推迟解析方法体,直到解析完整个结构,但这真的可能和实用吗?
最佳答案
虽然肯定可以使用 GLR 技术来解析 C++(参见 Ira Baxter 的许多答案),但我相信 gcc 和 clang 等常用编译器中常用的方法恰恰是推迟解析函数体,直到类定义完成。 (由于 C++ 源代码在解析之前通过预处理器,解析器在标记流上工作,这是必须保存以便重新解析函数体的内容。我认为重新解析源代码是不可行的。 )
很容易知道函数定义何时完成,因为大括号 ({}
) 必须平衡,即使不知道尖括号是如何嵌套的。
C++ 并不是唯一一种在处理声明之前延迟解析有用的语言。例如,一种允许用户定义具有不同优先级的新运算符的语言将要求在已知运算符的名称和优先级后(重新)解析所有表达式。一个更病态的例子是 COBOL,其中 a = b OR c
中 OR
的优先级取决于 c
是否为整数(a
等于 b
或 c
之一)或 bool 值(a
等于 b
或 c
为真)。以这种方式设计语言是否是一个好主意是另一个问题。
关于c++ - 在 C++ 解析器可以区分比较和模板实例化之前,它会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53011395/