试图了解C语法

时间:2019-05-01 04:55:59

标签: c parsing

我开始了递归解析器的旅程,一直在研究C语法,试图了解它如何在我的代码中复制它。

然后我看到了:

assignmentExpression
:   conditionalExpression
|   unaryExpression assignmentOperator assignmentExpression
|   DigitSequence // for
;

尤其是这部分:

unaryExpression assignmentOperator assignmentExpression

根据我的理解(很糟,可能是错误的),一元表达式可以是一个常数(如果遵循语法的其余部分),那么看起来1 = 1是有效的,这显然是错误的。我搜索了C解析器,甚至搜索了GCC源代码,并且assignmentExpression函数从没有真正与unaryExpression部分相关的代码。

所以我真的很困惑;我可能在这里错过了一些非常重要的东西。

1 个答案:

答案 0 :(得分:4)

C的语法没有完全描述。有效的C程序必须符合语法,但也必须符合许多其他规则,例如有关类型系统的规则。

因此,您是对的:1 = 1符合您引用的规则,但由于左侧不是左值,因此还是无效的。

(请注意,某些编译器可能实际上将1 = 1视为语法错误,因为它们可能会将其他一些限制纳入适用的语法中。这是允许的;规范为编译器提供了很大的灵活性只要能够正确处理有效程序,它们就可以实现。)