C++编译器如何区分用于二元运算符和模板的令牌>>

Ale*_*lex 6 c++ parsing c++11

我怀疑C++编译器的解析器是否为Clang,编译器如何处理运算符>>以了解何时它是二元运算符以及何时关闭模板如:std::vector<std::tuple<int, double>>我想这是在解析器时间内完成的,所以更好的方法是解决那个词汇或仅使用>作为标记,并解决语法分析器中的问题?

ric*_*ici 6

它实际上非常简单:如果有一个可见的打开模板支架,则>关闭它,即使>否则会形成>>操作员的一部分.(这不适用于>属于其他标记的字符,例如>=.)对C++语法的这种更改是C++ 11的一部分.

如果在>括号内嵌套语法中,则打开模板括号不可见.因此,>>在两个 T<sizeof a[x >> 1]>T<(x >> 1)>都是右移位运算符,虽然T<x >> 1>可能不按预期解析.

这两种实现策略都是可行的,具体取决于您希望将复杂性放在何处.如果词法分析器从不生成>>令牌; 解析器可以通过查看其源位置来检查>令牌expr '>' '>' expr是否相邻.将会出现一个转移 - 减少冲突,必须解决该冲突,以减少模板参数列表.这是有效的,因为通过>>分成两个令牌没有产生歧义,但这不是一般规则:a + ++ b不同于a ++ + b; 如果词法分析器只生成+令牌,那将是模棱两可的.

如果您准备好使用词法分析器跟踪括号深度,则使用词法分析器解决问题并不太复杂.这意味着词法分析器必须知道a <是模板括号还是比较运算符,但很可能它是.

这是一个更有趣的问题(至少是imho):如何将<公认为模板括号而不是小于运算符?这里确实存在语义反馈:如果它遵循指定模板的名称,则它是模板括号.

这不是一个简单的决定.名称可以是类或联合成员,甚至是模板化类或联合的特化成员.在后一种情况下,可能需要计算编译时常量表达式的值,然后进行模板推导以确定名称指定的内容.