【问题标题】:How is `>>>` lexed in C++0x?`>>>` 如何在 C++0x 中进行词法分析?
【发布时间】:2011-06-04 09:28:49
【问题描述】:

>>> 被定义为>> >。但是如果第一个> 关闭了一个模板参数列表会发生什么,结果应该等于> > > 还是> >>

在下面的代码中确实很重要:

template<class T> struct X { };

void operator >>(const X<int>&, int) { }

int main() {
    *new X<int>>> 1;
}

【问题讨论】:

  • 我认为这取决于语言的版本,我认为 C++0x lexes >>> 与旧版本不同。
  • &lt;/&gt; 用于模板参数是语言定义中犯的众多错误之一。
  • @6502:你有更好的建议吗?通过 Pascalifying 和 LALRing 使 C++ 语法“更漂亮”的所有建议对我来说都很难看。

标签: c++ c++11


【解决方案1】:

FDIS 的文本说

同样,第一个非嵌套的 >> 被视为两个连续但不同的 > 标记

它不能解除标记和 relex。所以这将是一个&gt; &gt; &gt;。请注意,C++ 实现的输入首先被转换为预处理标记,然后这些标记被转换为 C++ 标记。因此,首先您的输入是 C++ 标记 &gt;&gt; &gt;,然后 C++ 解析器将这些标记更改为 &gt; &gt; &gt;

每个预处理标记都转换为一个标记。 (2.7)。生成的标记在句法和语义上进行分析,并作为翻译单元进行翻译。 [注意:分析和翻译标记的过程可能偶尔会导致一个标记被一系列其他标记替换(14.2)。 ——尾注]

您不可能合并这两个尾随 &gt; &gt; 标记。

【讨论】:

    【解决方案2】:

    在那段特定的代码中,我的理解是它将是&gt; &gt;&gt;。解析器是贪婪的,并且会尝试尽可能多地捆绑到每个单独的令牌中,当遇到第一个 &gt; 时,上下文规则将指示它是一个完整的令牌并且它不应该尝试解析更多,但是一次它在模板参数的上下文之外,它将按照一般规则解析其余部分,就好像它是X&lt;int&gt; &gt;&gt;,或者

    typedef X<int> X_int;
    X_int >> 1;
    

    【讨论】:

    • 你在这里混合了解析器和词法分析器。解析器不会将任何东西绑定到令牌。
    • @ybungalobill:您在不需要它的情况下过于迂腐。但是这里的词法分析器(如果 lr1)在没有帮助的情况下无法确定第一个 '>' 是模板的一部分。所以术语解析器是有效的。
    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多