繁体   English   中英

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

[英]What does a parser for C++ do until it can differentiate between comparisons and template instantiations?

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

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

  // a b c may be declared here
};

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

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

答案显然取决于编译器,但文章How Clang处理 Eli Bendersky 对C / C ++的类型/变量名称歧义解释了Clang是如何做到的。 我将简单地从文章中注意一些要点:

  • Clang不需要lexer hack:从词法分析器到解析器的信息单向

  • Clang通过使用符号表知道标识符何时是一种类型

  • C ++要求声明在整个类中都可见,即使在它之前出现的代码中也是如此

  • Clang通过对声明进行完整的解析/语义分析来解决这个问题,但是将该定义留待以后使用; 换句话说,它是lexed但在所有声明的类型可用后解析

尽管使用GLR技术解析C ++当然是可能的(参见Ira Baxter的一些答案),但我相信常用编译器(如gcc和clang)中常用的方法正是推迟了函数体的解析。直到类定义完成。 (由于C ++源代码在被解析之前通过预处理器,解析器在令牌流上工作,这是必须保存以便重新解析函数体。我不相信重新解析源代码是可行的。 )

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM