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

标签 c++ parsing gcc compiler-construction clang

看完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 cOR 的优先级取决于 c 是否为整数(a 等于 bc 之一)或 bool 值(a 等于 bc 为真)。以这种方式设计语言是否是一个好主意是另一个问题。

关于c++ - 在 C++ 解析器可以区分比较和模板实例化之前,它会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53011395/

相关文章:

python - 如何从一段或一堆段落中找到标题大写短语

c# - 在运行时将.h 头文件解析为c# 数据结构

debugging - 调试器如何跟踪 C 代码和汇编指令之间的映射?

c++ - 在十六进制编辑器中写入程序存储器并以编程方式读取

c++0x std::function 作为方法参数

c++ - 是否有用于多线程内存分配器的验证套件?

c++ - 从 win32 线程调用 TForm 的成员应该满足什么条件?

parsing - 在 Java 8 中解析时钟时间

c - 如何在 Code::Blocks 中添加另一个 C 文件

gcc - 为什么 gcc 需要 gmp?