为什么我们需要在“简单声明”中使用下面的第二个定义?

简单声明:
     decl-specifier-seq init-declarator-list opt ;
     attribute-specifier-seq decl-specifier-seq init-declarator-list ;                                          <====
     attribute-specifier-seq opt decl-specifier-seq ref-qualifier opt [标识符列表]初始值设定项 ;

请注意,此定义中需要attribute-specifier-seq。什么时候会发生?

回答

鉴于我们希望我们的语法接受:

DSS;
DSS IDL;
ASS DSS IDL;

(加上接受数组形式,这个答案将不再处理)

但不是

ASS DSS;

也就是说,如果提供了属性说明符,则需要init-declarator-list

问题中显示的语法产生式提供了这一点,重要的是仅以一种方式解析任何合法的简单声明

每个没有属性说明符序列的声明都使用第一种情况进行解析。使用第二种情况解析每个声明。这两种情况没有重叠。

如果第二种情况是

属性说明符-seq opt decl-specifier-seq init-declarator-list ;

那么相同的输入将被允许,但规则重叠——表单的输入DSS IDL;将匹配第一个和第二个,创建一个不明确的解析。

不需要重叠规则。

使用非重叠规则解决此问题的方法不止一种。以下也可以:

声明说明符序列 ;

属性说明符-seq opt decl-specifier-seq init-declarator-list ;

实际上,这来自于蕴涵算子的真值表的卡诺图(ASS 提供意味着 IDL 提供),它具有 L 模式中的三个 True 单元格。一种解决方案来自使用垂直圆,另一种解决方案来自使用水平圆。

在数字逻辑中,重叠可以防止故障(很好!)。在语言语法中,重叠会产生解析歧义(糟糕!)。


以上是为什么我们需要在“简单声明”中使用下面的第二个定义?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>