如何导出C表达式“4 - 2 - 1”?

时间:2014-11-07 19:41:07

标签: c grammar c99

我正在开始编写一个关于编译理论的课程,我似乎无法从免费的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

1 个答案:

答案 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,那么在它适合语法的某个地方之前,您无法停止。你不是从单个角色开始,而是最终得到它们。