我正在开始编写一个关于编译理论的课程,我似乎无法从免费的C99文档中找到如何推导出这个表达式。
我的两个主要问题是:
1)遵循了多少规则?尽可能多?
例如' 4'可以停止数字,或整数常数,或常数。我认为它被解析为常数,但我似乎没有在文档中找到这个问题的答案。
2)如何从规则中推导出4 - 2 - 1:
additive-expression:
multiplicative-expression
additive-expression + multiplicative-expression
additive-expression – multiplicative-expression
由于其他规则,我不会为了简洁起见,常量是乘法表达式。
派生也是如此
(4 - (2 - 1)),或((4 - 2) - 1)?我知道它是后者,因为执行它时减法的结果,但C99文件中描述的这个概念在哪里?这个概念有多命名?这是左或右语法的意图吗?
作为参考,我使用了n1256。
答案 0 :(得分:2)
对于2),它不能是(4 - (2 - 1)),因为这是遵循规则的情况
additive-expression: additive-expression - multiplicative-expression
然后2 - 1
必须是一个乘法表达式,尝试解析这种方式(如果语法是明确的)将失败。这就是为什么你可以用括号强制解释的原因(如4 - (2 - 1)
,因为(2 - 1)
是一个乘法表达式,因为( expression )
是一个主表达式。
我认为这个概念是associativity。您可以在语法中看到右侧关联性的实例,例如6.5.16
assignment-expression: unary-expression assignment-operator assignment-expression
对于1),最终整个文件在预处理器到达之后被解析为translation-unit
,见5.1.1.1。如果您只是解析4
,那么在它适合语法的某个地方之前,您无法停止。你不是从单个角色开始,而是最终得到它们。