c++ 到底什么是表达式?

7bsow1i6  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(241)

bounty将在6天后过期。回答此问题可获得+100声望奖励。tocic希望吸引更多人关注此问题。

请考虑宣告int x;中的x是否为运算式。
我曾经认为它肯定不是,但语法在这里将变量名称为an id-expression
人们可能会说只有 expression 是表达式,而不是 ??-expression。但是在1 + 2中,12都不匹配,因为它们分别是 additive-expressionmultiplicative-expression,而不是expression s。但是常识告诉我们,它们也应该被称为表达式。
我们可以确定任何 ??-expression(包括 expression)都是表达式,但是声明中的变量名也是匹配的。
我们可以将表达式定义为除 id-expression 之外的任何 *??-expression *,但这感觉相当随意。
表达式的正确语法定义是什么?声明中的变量名是否是表达式?

brccelvz

brccelvz1#

在查看了@LanguageLawyer(1,2)提供的链接后,我确信共识是 * id-expression * 是一个用词不当,并不总是一个表达式(例如,它不是声明中的表达式)。
然后,如果源子串在解析树中至少有一个父级被调用,则该源子串是表达式:

    • expression *、
    • *-expression *1但不包括 * id-expression *

,并且该父对象仅扩展到此子字符串。
这与n.m.提出的定义相同,只是我也允许 *-expression * 而不允许 * id-expression 节点。
1x 1 m6n1x是任何字符串的通配符。

e0bqpujr

e0bqpujr2#

x是一个表达式吗?”这个问题是什么意思?
当我们讨论表达式和标识符在一个特定程序中的具体出现时,我们必须考虑它的解析树。如果一个程序的解析树中的某个expression节点扩展到该子串,则该子串就是expression
因此,声明int x;中的x不是表达式,因为分析树中没有expression(包含int x;作为声明的任何有效程序的)。存在id-expression节点,但特定的id-expression不是expression节点的扩展,它是declaration节点扩展的一部分。
当孤立地谈论表达式和标识符时,“is a”意味着“根据语法中的一些规则扩展/收缩到”。因此,孤立地看,x是表达式。这意味着我们可以根据上面的定义构造一个程序,其中x是表达式。
这些定义是纯语法的,因此对任何语言和语法产品都有效。
表达式是指定计算的运算符和操作数的序列
并且在几个地方将子表达式作为表达式单独讨论。因此,标准中的术语“表达式”与语法元素expression并不一致。
然而,这并不是一个无法克服的问题。语法只是一个工具。标准可以对语法进行不同的定义:

expression:
    expression = expression
    expression + expression
    expression * expression
    ...
    ( expression )
    id-expression

并解决英语文本中的歧义。如果我们想要表达的概念与语法元素紧密对应,我们可能应该在心理上考虑以这种方式呈现的语法。
或者,正如你所建议的,我们可以把任何??-expression的扩展看作一个“表达式”,但是用一个新的符号替换某些id-expression的出现。

  • 注意:这个版本的答案是完全重写的。以前的版本是一个误解的结果。*

相关问题