简单声明:
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 单元格。一种解决方案来自使用垂直圆,另一种解决方案来自使用水平圆。
在数字逻辑中,重叠可以防止故障(很好!)。在语言语法中,重叠会产生解析歧义(糟糕!)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句