bounty将在6天后过期。回答此问题可获得+100声望奖励。tocic希望吸引更多人关注此问题。
请考虑宣告int x;
中的x
是否为运算式。
我曾经认为它肯定不是,但语法在这里将变量名称为an id-expression
。
人们可能会说只有 expression
是表达式,而不是 ??-expression
。但是在1 + 2
中,1
和2
都不匹配,因为它们分别是 additive-expression
和 multiplicative-expression
,而不是expression
s。但是常识告诉我们,它们也应该被称为表达式。
我们可以确定任何 ??-expression
(包括 expression
)都是表达式,但是声明中的变量名也是匹配的。
我们可以将表达式定义为除 id-expression
之外的任何 *??-expression
*,但这感觉相当随意。
表达式的正确语法定义是什么?声明中的变量名是否是表达式?
2条答案
按热度按时间brccelvz1#
在查看了@LanguageLawyer(1,2)提供的链接后,我确信共识是 *
id-expression
* 是一个用词不当,并不总是一个表达式(例如,它不是声明中的表达式)。然后,如果源子串在解析树中至少有一个父级被调用,则该源子串是表达式:
expression
*、或*-expression
*1但不包括 *id-expression
*,并且该父对象仅扩展到此子字符串。
这与n.m.提出的定义相同,只是我也允许 ”
*-expression
* 而不允许 *id-expression
“ 节点。1x 1 m6n1x是任何字符串的通配符。
e0bqpujr2#
“
x
是一个表达式吗?”这个问题是什么意思?当我们讨论表达式和标识符在一个特定程序中的具体出现时,我们必须考虑它的解析树。如果一个程序的解析树中的某个
expression
节点扩展到该子串,则该子串就是expression
。因此,声明
int x;
中的x
不是表达式,因为分析树中没有expression
(包含int x;
作为声明的任何有效程序的)。存在id-expression
节点,但特定的id-expression
不是expression
节点的扩展,它是declaration
节点扩展的一部分。当孤立地谈论表达式和标识符时,“is a”意味着“根据语法中的一些规则扩展/收缩到”。因此,孤立地看,
x
是表达式。这意味着我们可以根据上面的定义构造一个程序,其中x
是表达式。这些定义是纯语法的,因此对任何语言和语法产品都有效。
表达式是指定计算的运算符和操作数的序列
并且在几个地方将子表达式作为表达式单独讨论。因此,标准中的术语“表达式”与语法元素
expression
并不一致。然而,这并不是一个无法克服的问题。语法只是一个工具。标准可以对语法进行不同的定义:
并解决英语文本中的歧义。如果我们想要表达的概念与语法元素紧密对应,我们可能应该在心理上考虑以这种方式呈现的语法。
或者,正如你所建议的,我们可以把任何
??-expression
的扩展看作一个“表达式”,但是用一个新的符号替换某些id-expression
的出现。