-
  • EUKLID-Design
  • EUKLID-Design Classic
  • Dokumentation
  • Download
  • +49-991-2806945-0
  • info@eucad-software.de
AQL Einführung Programmiersprache
Ausgabeformatierung Symbole Ausdrücke
Übersicht Operatoren gemischte Arithmetik gemischte Vergleiche Zeichenketten Gruppen
Kontrollanweisungen Funktionen Dateibearbeitung Fehler
Kommandosprache Vordefinierte
Funktionen
Datenstruktur Beispielprogramme Syntaxdiagramme

Ausdrücke in AQL

In diesem Kapitel werden folgende Themen behandelt:

  • Operatoren
  • Ergebnisse gemischter Arithmetik
  • Ergebnisse gemischter Vergleiche
  • Operatoren für Zeichenketten
  • Ausdrücke mit Gruppen

Übersicht der Operatoren

Die folgende Tabelle gibt eine Übersicht der Operatoren:

Typ des Ausdrucks: Priorität* gültig für
expr1 and expr2 2 logical **, integer (bitwise and)
expr1 or expr2 1 logical **, integer (bitwise or)
expr1 + expr2 4 real, integer, string ***
expr1 - expr2 4 real, integer, string ***
expr1 << expr2 4 integer (bitshift)
expr1 >> expr2 4 integer (bitshift)
expr1 * expr2 5 real, integer ***
expr1 / expr2 5 real, integer ***
expr1 ** expr2 5 real, integer ***
expr1 in expr2 3 rechter Operand Gruppe
- expr 6 real, integer
expr1 < expr2 3 real, integer, string, date ***
expr1 ⇐ expr2 3 real, integer, string, date ***
expr1 = expr2 3 integer, string, date, real**** ***
expr1 >= expr2 3 real, integer, date, string ***
expr1 > expr2 3 real, integer, date, string ***
expr1 != expr2 3 real, integer, date, string, logical ***
not expr 6 logical, integer (bitwise not)
(expr) 7 all
function() 7 siehe Kapitel "Vordefinierte Funktionen" auf Seite 5-1, Online-Hilfe
. AQL-Funktionen für Objekte,
. AQL-Funktionen für Aktionen,
. Values
. Systemattribute

* Die bei der Spalte "Priorität" angegebene Zahl bezeichnet die Stärke der Bindung der Operanden an den Operator. Je höher die Zahl, desto stärker die Bindung. Steht ein Operand zwischen zwei Operatoren, so wird zuerst die Operation mit der stärkeren Bindung, bzw. der höheren Priorität ausgeführt. Haben benachbarte Operatoren die gleiche Priorität, so erfolgt die Abarbeitung von links nach rechts.

** Bei den logischen Ausdrücken and und or wird der zweite Operand nur dann bearbeitet, wenn es notwendig ist. Das ist der Fall bei:
true and <expression2>
false or <expression2>

*** Der Typ des Ergebnisses ist bei Operanden verschiedenen Typs der Tabelle "Ergebnisse gemischter Arithmetik" auf Seite 3-18 zu entnehmen.

**** Da die Prüfung auf Gleichheit bei real-Werten intern mit der maximalen Genauigkeit ausgeführt wird, ist es empfehlenswert, auf die Gleichheit innerhalb einer bestimmten Toleranz abzufragen.

Beispiel 9: priority.aql

PROGRAMM: [true or nix ] nl; [false and nix ] nl; [3-2-1] nl; [3-(2-1)] nl; [1+2*3] nl; [2<<2-1] nl; [32>>2-1] nl; [32>>2**2-1] nl; [(32>>2)**2-1] nl; [1+2**2*3] nl;
AUSGABE: true false 63 13

Ergebnisse gemischter Arithmetik

Die folgende Tabelle zeigt die Ergebnisse gemischter Arithmetik:

+ - * / ** erster Operand
zweiter Operand real integer string group
real real invalid invalid nur +, -
integer real integer invalid nur +, -
string invalid invalid nur +, - * nur +, -
group invalid invalid invalid nur +, - **
object invalid invalid invalid nur +, -

* (concat, substring)

** (siehe "Ausdrücke mit Gruppen" ) 

Es wird nicht geprüft, ob bei integer und real der Wertebereich überschritten wird (overflow).

Beispiel 10: mixed_arit.aql
PROGRAMM: [3/2;;f3] nl; [3/2*1.0;;f3] nl; [3.0/2;;f3] nl; ["Mein Hut der hat "+"drei Ecken"] nl;
AUSGABE: 001 1.000 1.500 Mein Hut der hat drei Ecken

Ergebnisse gemischter Vergleiche

Die folgende Tabelle zeigt die Ergebnisse gemischter Vergleiche:

< >
⇐ >=
= !=
real integer string logical date
real logical logical * ** ** **
integer logical * logical invalid ** **
string ** ** logical ** **
logical ** ** ** ** **
date ** ** ** ** logical

* Das Ergebnis des real-Ausdrucks wird vor dem Vergleich durch Abschneiden der Dezimalstellen in eine Integer umgewandelt. Falls dabei ein Bereichsüberlauf auftritt, wird "invalid" als Ergebnis zurückgeliefert.

** Vergleich ist nur für die Vergleichsoperatoren "=" und "!=" zulässig.
= Bei einem Vergleich, bei dem nur ein Wert "invalid" ist, ist das Ergebnis immer der logische Wert "false". Sind beide Werte "invalid", so hat das Ergebnis den logische Wert "true".
!= Bei einem Vergleich, bei dem nur ein Wert "invalid" ist, ist das Ergebnis immer der logische Wert "true". Sind beide Werte "invalid", so hat das Ergebnis den logischen Wert "false".

Operatoren für Zeichenketten

Folgende Operatoren für Zeichenketten können verwendet werden:

+ Verkettung von Zeichenketten (concatenation)
- Teilkettenbildung: Dabei muß der rechte Operand (nach dem Zeichen -) eine Zeichenkette sein, die mindestens ein Wildcard * enthält. Dieses Zeichen steht stellvertretend für eine beliebige Zeichenfolge. Das Ergebnis der Operation besteht aus den durch die Wildcards repräsentierten Zeichen. Kann die explizit angegebene Zeichenkette des rechten Operanden nicht im linken gefunden werden, so besteht das Ergebnis des Ausdrucks aus dem Wert "invalid".

Beispiel 11: string.aql

PROGRAMM: AUSGABE:
var string;
string = "inhalt "
delimiter = "mit Begrenzungszeichen \""
[string+delimiter] nl inhalt mit Begrenzungszeichen "
[string+(delimiter-"* Begrenzungszeichen*")] nl inhalt mit "

Ausdrücke mit Gruppen

Folgende Attribute können für Gruppen verwendet werden:

.first Dieses standardmäßig für jede Gruppe definierte Attribut liefert als Ergebnis das erste Gruppenelement.
.tail Dieses immer vorhandene Attribut jeder Gruppe liefert eine Gruppe mit allen Gruppenelementen außer dem ersten Element (Komplement zu .first).
.el_* Dieses Attribut liefert das n-te Element der Gruppe. Damit kann gezielt auf einzelne Gruppenelemente zugegriffen werden (Arrays in anderen Programmiersprachen).
or Ergebnis ist eine Gruppe, die alle Elemente der beiden beteiligten Gruppen enthält. Es wird dabei gewährleistet, daß in der Ergebnisgruppe kein Element doppelt auftritt.
* Ergebnis ist eine Gruppe, die nur die Elemente enthält, welche in beiden beteiligten Gruppen enthalten sind.
- Ergebnis ist eine Gruppe, die nur die Elemente enthält, welche jeweils nur in einer der beiden beteiligten Gruppen enthalten sind.
+ Die als linker Operand angegebene Gruppe bzw. das angegebene Gruppeneinzelelement wird um das nach dem Zeichen + angegebene Symbol erweitert. Falls es sich dabei um eine Gruppe handelt, werden beide Gruppen addiert (concatenation). Es wird nicht geprüft, ob das Ergebnis ein Element doppelt enthält. Falls es sich um ein Einzelement handelt, wird es je nach Schreibweise am Anfang oder Ende der Gruppe eingehängt.
in Falls der erste Operand in der als zweiter Operand aufgeführten Gruppe enthalten ist, hat der Ausdruck den logischen Wert "true", andernfalls "false".
where Dieser Operator verbindet eine Gruppe mit einem logischen Ausdruck. Ergebnis sind alle Elemente, die diese Bedingung erfüllen. Voraussetzung ist, daß jedes Element bezüglich seines Typs in diese Bedingung eingesetzt werden kann. In der Bedingung wird das zu untersuchende Gruppenelement durch einen Punkt dargestellt. Soll ein Attribut des zu untersuchenden Gruppenelements geprüft werden, wird es mit .<attributname> angegeben.
sort by Nach dem Operator sort by wird das Sortierkriterium angegeben.
Dabei wird das Gruppenelement oder ein Attribut davon in der gleichen Form notiert wie im logischen Ausdruck der where-Bedingung. Das Sortierkriterium kann durch folgende Schlüsselworte näher spezifiziert werden:
asc aufsteigende Sortierung (Voreinstellung)
desc absteigende Sortierung
and group Mit diesem Schlüsselwort werden Untergruppen von allen Elementen mit gleichem Attributwert gebildet. Es ist möglich, mehrere Sortierkriterien durch Komma getrennt anzugeben. Bei der Kombination mit where muß where den Sortierkriterien vorangestellt werden.
select from Mit diesem Schlüsselwort kann aus einer Gruppe attributgesteuert eine andere Gruppe erzeugt werden
Syntax: <group> = select <attribute> from <group_expression>

An Funktionen zur Behandlung von Gruppen stehen zur Verfügung:

len ( ) Ermitteln der Elemente einer Gruppe (siehe Kapitel "Stringlänge – len")
index ( ) Ermitteln eines Gruppenelements (siehe Kapitel "Ermitteln eines Gruppenelements bzw. Character aus String – index")
empty ( ) Test auf leere Gruppen (siehe Kapitel "Test auf leere Gruppen – empty")
pos ( ) Ermitteln des Aufrufwertes eines Gruppenelementes

Beispiel 12: group_op.aql

PROGRAMM: AUSGABE:
zahlen = { 1, 2, 3, 4, 5 }
gruppen_gruppe = {zahlen, zahlen, zahlen}
‘zahlen: ‘ [zahlen] nl zahlen: { 1, 2, 3, 4, 5 }
diverses = { 4, "gelb", 2, 34.5, "leicht", false }
‘diverses: ‘ [diverses] nl diverses: { 4, gelb, 2, 34.5, leicht, false }
gruppe_gesamt = zahlen + diverses
‘Erweiterung: ‘ [gruppe_gesamt] nl Erweiterung: { 1, 2, 3, 4, 5, 4, gelb, 2, 34.5, leicht, false }
kopf = gruppe_gesamt.first
‘Erstes Gruppenelement: ‘ [kopf] nl Erstes Gruppenelement: 1
‘Rest der Gruppe: ‘ [gruppe_gesamt.tail] nl Rest der Gruppe: { 2, 3, 4, 5, 4, gelb, 2, 34.5, leicht, false }
‘Durchschnitt: ‘ [zahlen and diverses] nl Durchschnitt: { 2, 4 }
‘Differenz 1-2: ‘ [zahlen - diverses] nl Differenz 1-2: { 1, 3, 5 }
‘Differenz 2-1: ‘ [diverses - zahlen] nl Differenz 2-1: { gelb, 34.5, leicht, false }
‘Bedingung: ‘ [zahlen where . >2 ] nl Bedingung: { 3, 4, 5 }
‘Sort aufsteigend: ‘ [zahlen sort by . ] nl Sort aufsteigend: { 1, 2, 3, 4, 5 }
‘Sort absteigend: ‘ [zahlen sort by . desc] nl Sort absteigend: { 5, 4, 3, 2, 1 }
‘Sort absteigend mit Bedingung: ‘
[zahlen where . > 1 sort by . desc] nl Sort absteigend mit Bedingung: { 5, 4, 3, 2 }
‘Einzelelement‘ ‘[zahlen.el_3] nl Einzelelement: 3
‘Gruppe von Gruppen: ‘[gruppen_gruppe] nl Gruppe von Gruppen: {{1,2,3,4,5} {1,2,3,4,5} {1,2,3,4,5}}
‘1.Auswahl: ‘[select .first from gruppen_gruppe] nl 1.Auswahl: {1,1,1}


◀ Symbole (Variable) Kontrollanweisungen ▶


Kontakt Impressum Datenschutz