从C标准扩展“声明说明符”的语法后,我得到了一种语法,它允许语义上不合逻辑的说明符的许多组合。有没有人写出一种更精确的语法,允许更少的矛盾组合?看起来语法的无序性质(可能是可预期的,这样程序员就不必记住指定符的顺序)使这一过程变得复杂。如果有某种表示法来指定“选择符中的任何一个,但每个选择中只允许一个出现”,这将很有帮助(措辞不是特别好)。还是我吠错了树?例如,如果有一个很好的简洁的语义规则集,用于指定(不允许)一起使用哪些组合。根据我对C标准的解释,语法是
声明说明符:(存储类说明符|类型说明符|类型限定符|功能说明符|对齐说明符)+
storage-class-specifier:'typedef'|'extern'|'static'|'_Thread_local'|'auto'|'register'
类型说明符:'void'|'char'|'short'|'int'|'long'|'float'|'double'|'signed'|'unsigned'|'_Bool'|'__ Complex'| '_Atomic''('type-name')'| 结构或联合说明符| 枚举说明符| 类型定义名称
类型限定符:'const'|'restrict'|'volatile'|'__ Atomic'
功能说明符:“内联” | '_Noreturn'
对齐说明符:'_Alignas''('类型名称|常量表达式')'
语言定义中有单独的约束,用于指定声明说明符的哪些组合是合法的。它不在语法本身内指定。例如:
6.7.2类型说明符
...
约束
2每个声明中的声明说明符以及每个struct声明和类型名称的specifier-qualifier列表中应至少提供一个类型说明符。类型说明符的每个列表应为以下多个集合之一(当每个项目有多个集合时,用逗号分隔);类型说明符可以以任何顺序出现,并且可能与其他声明说明符混合使用。
—无效
— char
—带符号的char
—无符号的char
—短,带符号的short,short int或signed short int
—无符号的short或unsigned short int
— int,带符号的或signed int
—无符号的或unsigned int
— long,有符号long,long int或signed long int
— unsigned long或unsigned long int
— long long,有符号long long,long long int或signed long long int
—无符号long long或unsigned long long int
—浮点数
— double
— long double
— _Bool
— float _Complex
— double _Complex
— long double _Complex
—原子类型说明符
—结构或联合说明符
—枚举说明符
— typedef名称
尽管所有这些可能都可以在语法中进行编码,但这样做会很麻烦。我认为,将其设置为单独的约束可以使生活更轻松(并且还可以更轻松地引入新组合或弃用旧组合)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句