|
5.8 Qualifizierte Ausdrücke
Weil Bezeichner oder Textzeichen in mehreren Typen gleichzeitig vorkommen
können, gibt es Situationen, in denen unklar ist, zu welchem Typ ein
Element gehören soll. Zur Auflösung dieser Mehrdeutigkeit kann
die Qualifizierung verwendet
werden.
Qualifizierte Ausdrücke (qualified_expression
<BNF>) sind Ausdrücke, denen explizit ein Typ zugewiesen
wurde, oder Ausdrücke, für die ein Untertyp
festgelegt werden soll. Der Operand kann entweder ein Ausdruck
oder ein Aggregat sein.
Qualifizierter_Ausdruck::=Untertyp'(Ausdruck)|Untertyp'Aggregat
with Text_IO; use Text_IO;
procedure Auto is
type Automarken is (unbekannt, BMW, Ford, Mercedes,
Opel, VW);
type Fahrzeug is tagged record
Marke : Automarken := unbekannt;
Alter : Natural := 0;
end record;
type PKW is new Fahrzeug with record
Personen : Positive := 4;
end record;
type LKW is new Fahrzeug with record
Gewicht : Natural := 0;
end record;
Mein_PKW : PKW;
Mein_LKW : LKW;
Standard_Fahrzeug : Fahrzeug;
begin
Standard_Fahrzeug := (Mercedes, Alter => 3);
Mein_PKW := (Standard_Fahrzeug with Personen =>
5);
-- Wenn bei der Erweiterung von Verbundtypen keine
Variable eines
-- Vorgaengertyps angegeben wurde, sondern ein
Aggregat, so muss
-- dieses mit dem Vorgaengertyp qualifiziert werden.
Mein_PKW := (Fahrzeug'(BMW, Alter => 1) with
Personen => 2);
Mein_LKW := (Fahrzeug'(Mercedes, Alter => 2)
with Gewicht => 3);
end;
|
Wenn aus dem Kontext, in dem ein Ausdruck (Wert) verwendet wird, der erwartete
Typ nicht eindeutig hervorgeht, so kann eine Qualifizierung verwendet werden,
um diesen Typ festzulegen.
Beispiel:
type Roemische_Ziffern is ('I', 'V', 'X', 'L',
'C', 'D', 'M');
...
Put ("ASCII: ");
if ('C') < ('V') then --
Vergleich auf ASCII-Ebene: 'C' ist kleiner als 'V',
Put_Line ("C < V"); --
da es in der ASCII-Tabelle
else
--
einen kleineren Wert hat.
Put_Line ("not C < V");
end if;
Put ("Roemisch: ");
if Roemische_Ziffern'('C') < ('V') then -- Durch die Qualifizierung
des ersten Wertes wird der gesamte
Put_Line ("C < V"); --
Vergleich auf der Ebene von
else --
Roemischen Ziffern vorgenommen.
Put_Line ("not C < V"); --
'C' ist somit jetzt groesser
end if; --
als 'V' gemaess der Definition in "Roemische_Ziffern"
... |
Im Gegensatz zur Konvertierung
erzeugt der Übersetzer bei der Qualifizierung keinen Code, sondern
untersucht nur, ob die verlangte Operation
für diesen Typ existiert und fügt diese, wenn vorhanden, ein.
Durch die Qualifizierung wird festgelegt, welche Funktionen
zur Verfügung stehen, wie mit der Variablen gerechnet werden kann und
welche Vergleiche möglich sind.
|