En la comprobación de tipos de una
expresión x[y1][y2]
que referencia a un elemento de un array
hay que tener en cuenta:
x
debe ser array (líneas 4-9 del código
que sigue)
x
es un array de tipo t
el tipo de x[2]
será t
.
Por ejemplo,
en la llamada g(x[y1][y2])
la variable x
deberá
haber sido declarada con al menos dos dimensiones. Si x
fué declarada int x[10][20][30]
el tipo de la expresión
x[y1][y2]
será A_30(INT)
.
CHAR
podrán
ser ahormados.
Sigue el código para la comprobación de tipos de expresiones de referencias a elementos de un array:
nereida:~/doc/casiano/PLBOOK/PLBOOK/code/Simple-Types/lib/Simple> \ sed -ne '97,125p' Trans.trg | cat -n 1 arrays: VARARRAY($x, INDEXSPEC(@y)) 2 => { 3 4 my $t = $VARARRAY->{t}; # Type declared for VARARRAY 5 type_error( # Must be an array type 6 " Variable '$x->{attr}[0]' was not declared as array", 7 $VARARRAY->line 8 ) 9 unless is_array($t); 10 11 my ($declared_dim, $used_dim, $ret_type) = compute_dimensionality($t, @y); 12 13 type_error( 14 " Variable '$x->{attr}[0]' declared with less than $used_dim dimensions", 15 $VARARRAY->line 16 ) 17 unless $declared_dim >= $used_dim; 18 19 for (0..$#y) { # check that each index is integer. Coherce it if is $CHAR 20 my $ch = char2int($INDEXSPEC, $_); 21 22 type_error("Indices must be integers",$VARARRAY->line) 23 unless ($ch->{t} == $INT); 24 } 25 26 $VARARRAY->{t} = $ret_type; 27 28 return 1; 29 }
La función compute_dimensionality
llamada en la línea 11
se incluye dentro de la sección de funciones de soporte en Trans.trg
:
96 { # support for arrays 97 98 sub compute_dimensionality { 99 my $t = shift; 100 my $i = 0; 101 my $q; 102 my $used_dim = scalar(@_); 103 for ($q=$t; is_array($q) and ($i < $used_dim); $q=$q->child(0)) { 104 $i++ 105 } 106 107 croak "Error checking array type\n" unless defined($q); 108 return ($i, $used_dim, $q); 109 } 110 111 sub is_array { 112 my $type = shift; 113 114 defined($type) && $type =~ /^A_\d+/; 115 } 116 117 sub array_compatible { 118 my ($a1, $a2) = @_; 119 120 return 1 if $a1 == $a2; 121 # int a[10][20] and int b[5][20] are considered compatibles 122 return (is_array($a1) && is_array($a2) && ($a1->child(0) == $a2->child(0))); 123 } 124 }
El siguiente ejemplo muestra la comprobacion de tipos de arrays en funcionamiento:
pl@nereida:~/Lbook/code/Simple-Types/script$ usetypes.pl prueba02.c 2 1 int a,b,e[10]; 2 3 g() {} 4 5 int f(char c) { 6 char d; 7 c = 'X'; 8 e[d][b] = 'A'+c; 9 { 10 int d; 11 d = a + b; 12 } 13 c = d * 2; 14 return c; 15 } 16 Type Error at line 8: Variable 'e' declared with less than 2 dimensionsEl siguiente ejemplo muestra la comprobacion de tipos de que los índices de arrays deben ser enteros:
pl@nereida:~/Lbook/code/Simple-Types/script$ usetypes.pl prueba06.c 2 1 int a,b,e[10][20]; 2 3 g() {} 4 5 int f(char c) { 6 char d[20]; 7 c = 'X'; 8 g(e[d], 'A'+c); 9 { 10 int d; 11 d = a + b; 12 } 13 c = d * 2; 14 return c; 15 } 16 Type Error at line 8: Indices must be integers