阿达:为什么“A”......“F”“不是离散的?

时间:2014-09-14 00:20:30

标签: arrays types range ada

程序文本

type T is array ("A" .. "F") of Integer;

编译器控制台输出

hello.adb:4:22: discrete type required for range

问题

如果我的理解是正确的,Ada参考手册的chapter 3.6中的第9条是编译器引发编译错误的原因:

  

array_type_definition中的每个index_subtype_definition或discrete_subtype_definition定义索引子类型;它的类型(索引类型)应该是离散的。

因此,为什么"A" .. "F"不是discretediscrete到底意味着什么?

背景信息

下面引用了数组类型定义的语法要求。资料来源:Ada Reference Manual

array_type_definition ::= unconstrained_array_definition | constrained_array_definition

constrained_array_definition ::= array (discrete_subtype_definition {, discrete_subtype_definition}) of component_definition

discrete_subtype_definition ::= discrete_subtype_indication | range

range ::=  range_attribute_reference | simple_expression .. simple_expression

simple_expression ::= [unary_adding_operator] term {binary_adding_operator term}

term ::= factor {multiplying_operator factor}

factor ::= primary [** primary] | abs primary | not primary

primary ::= numeric_literal | null | string_literal | aggregate | name | qualified_expression | allocator | (expression)

2 个答案:

答案 0 :(得分:8)

此:

"A" .. "F"

确实满足range语法;它由simple_expression组成,后跟..,后跟另一个simple_expression。所以它不是语法错误。

它仍然无效;特别是它是语义错误。语法不是决定一块代码是否有效的唯一因素。例如,"foo" * 42是一个语法上有效的表达式,但它在语义上无效,因为字符串和整数没有*运算符(除非你自己编写)。 / p>

离散类型是整数类型或枚举类型。 IntegerCharacterBoolean是离散类型的示例。浮点类型,数组类型,指针类型,记录类型等不是离散类型,因此这些类型的表达式不能用于discrete_subtype_indication的范围。

此:

type T is array ("A" .. "F") of Integer;

可能应该是:

type T is array ('A' .. 'F') of Integer;

字符串文字的类型为String,这是一种数组类型。字符文字属于Character类型,它是枚举类型,因此是离散类型。

您在另一个答案的评论中写道:

  

不幸的是,我无法用字符文字替换字符串文字并重新编译代码......

如果是这样的话,那很不幸。您发布的代码无效;它不会编译。您唯一的选择是修改或不使用它。

答案 1 :(得分:4)

嗯...我认为它试图告诉你,你不能使用字符串文字来指定范围。你可能想要使用一个字符文字。

参考:


  

毕竟,上面引用的条款明确要求使用string_literal

您误解了Ada语法规范。具体来说,你错过了这个产品:

name ::= simple_name
   | character_literal  | operator_symbol
   | indexed_component  | slice
   | selected_component | attribute