gpt4 book ai didi

c++ - 这些句法正确的 C++ 语句有任何意义吗?

转载 作者:太空狗 更新时间:2023-10-29 23:24:42 25 4
gpt4 key购买 nike

在查看 C++ 语法时,我发现后缀的定义大致如下:

Postfix ::=  Primary
| Postfix '[' Expression ']'
| Postfix '(' Expression ')'
| Postfix '.' Identifier
| Postfix '->' Identifier
| Postfix '++'
| Postfix '--'

意思是foo.f++()在句法上是有效的——大概是因为函数是指针,它会引用定义的下一个函数,但如果它在语义解析期间没有被捕获为修改常量对象——就像foo.f()<true>;一样,我会感到震惊。这似乎根本没有任何意义,而 foo.++f()不会被允许,即使它或多或少与第一个相同。此外,一元表达式被定义为 ++*"hello world"在语法上是有效的,因为文字被认为与标识符相同。

相反的是:

postfix0 ::= ScopeResolution
| postfix0 '.' postfix2
| postfix0 '->' postfix2

postfix1 ::= postfix0
| postfix1 '<' expression '>'

postfix2 ::= postfix1
| postfix2 '[' expression ']'
| postfix2 '(' expression ']'

postfix3 ::= postfix2
| Literal
| postfix3 '++'
| postfix3 '--'

在解析的句法阶段会出现 catch 此类无效表达式。起初我以为它只是作为遗留的东西留在标准中,但是较新的语言,如 Java 和 D 做同样的事情,那么这些语句携带的某种含义是否导致以这种方式定义语法?

最佳答案

C++ 实际上并不是由它的语法产生式定义的。 BNF 语法作为语言规则的补充提供,以帮助理解,但语法错误语义错误 之间没有也不可能有区别在 C++ 中,因为它没有上下文无关语法。

因此,您试图将“语法有效...在语义解析期间捕获”更改为“在解析的语法阶段捕获此类无效表达式”所做的改进是完全没有意义的,因为这些实际上并没有作为独立的阶段存在。

C++ 编译的阶段可在标准的 [lex.phases] 部分 2.1 中找到。对此主题特别感兴趣的是第 7 阶段:

White-space characters separating tokens are no longer significant. Each preprocessing token is converted into a token. (2.7). The resulting tokens are syntactically and semantically analyzed and translated as a translation unit.

句法和语义分析是一起进行的,不可分割。语义错误解析的句法阶段(第 7 阶段)被捕获。

关于c++ - 这些句法正确的 C++ 语句有任何意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22977043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com