BASIC-Compiler

Ausdrücke

Ausdrücke sind Kombinationen aus Literalen (im BASIC-Programm stehende Zahlen und Zeichenketten), Variablen, Funktionsaufrufen, Operatoren und Klammern, die als Ergebnis einen numerischen Wert oder eine Zeichenkette liefern. Ausdrücke, die einen numerischen Wert liefern, sind numerische Ausdrücke. Ausdrücke, die eine Zeichenkette liefern, werden String-Ausdrücke genannt.


1. Numerische Ausdrücke

Numerische Ausdrücke liefern einen numerischen Wert mit dem Datentyp Integer, Long oder Decimal.

1.1. Zahlen

Der Compiler versteht Dezimalzahlen mit und ohne Dezimalpunkt, Hexadezimalzahlen sowie Binärzahlen. Dezimalzahlen beginnen mit einer Ziffer 0 bis 9, Hexadezimalzahlen mit &H und Binärzahlen mit &B.

Der Datentyp der Zahl wird automatisch ermittelt, indem aus Integer, Long und Decimal der kleinste passende Datentyp ausgewählt wird. Bei Bedarf können Sie aber auch durch Anhängen eines Buchstaben einen Typ erzwingen:

Angehängter BuchstabeErzwungener Datentyp
DDecimal (nur bei Dezimalzahlen möglich)
LLong

Ein Buchstabe für den Datentyp Integer existiert nicht und ist auch nicht notwendig, da Integer automatisch eingenommen wird, wenn es möglich ist.

Beispiele:

LiteralDezimalwertDatentyp
123123Integer
123D123.0Decimal
123L123Long
123.0123.0Decimal
123.45123.45Decimal
123.45D123.45Decimal
123.45L Fehler: Kommazahl als Long nicht möglich
12345671234567Long
1234567.81234567.8Decimal
&HA2BD41661Integer
&HA2BDL41661Long
&H89A2BD9020093Long
&H89A2BDL9020093Long
&B100101175Integer
&B1001011L75Long
&B1001011010010110177101Long

Achtung! Wenn Sie keinen Datentyp erzwingen, kann es aber durchaus vorkommen, dass der Compiler aus Optimierungsgründen intern einen anderen Datentyp erzeugt. So wird z.B. beim Zuweisen einer Long-Variable mit einem Integer-Literal das Literal intern gleich als Long compiliert, um den sonst notwendigen Aufruf einer entspechenden Konvertierungsroutine zur Laufzeit einzusparen.

1.2. Variablen

Variablen werden in einem Ausdruck verwendet, um den in einer Variable gespeicherten Wert zu lesen. Bei Feldvariablen muss immer ein konkretes Feldelement angegeben werden, da ein Audruck nur einen Wert liefern kann. Der Zugriff auf ein einzelnes Element erfolgt mit einem hinter dem Feldnamen in runden Klammern stehenden Index bzw. einer Indexliste.

1.3. Funktionen

Eine Liste der Funktionen finden Sie hier. Funktionen, deren Namen mit einem $-Zeichen enden, sind String-Funktionen. Diese liefern eine Zeichenkette zurück.

1.4. Operatoren mit einem Operanden

OperatorBedeutung
+ positives Vorzeichen (Wert wird nicht geändert.)
- negatives Vorzeichen (mathematische Negation)
NOT bitweise Negation (nur Integer und Long),
Beispiel: A = NOT B

Das Ergebnis hat den gleichen Datentyp wie der Operand.

1.5. Operatoren mit zwei Operanden

Operator Bedeutung Unterstützte Datentypen für den linken Operanden Unterstützte Datentypen für den rechten Operanden
= Test auf Gleichheit alle ¹) alle ¹)
<> Test auf Ungleichheit alle ¹) alle ¹)
< Test auf kleiner alle ¹) alle ¹)
<= Test auf kleiner oder gleich alle ¹) alle ¹)
> Test auf größer alle ¹) alle ¹)
>= Test auf größer oder gleich alle ¹) alle ¹)
+ Addition alle ¹) ²) alle ¹) ²)
- Subtraktion Integer, Long, Decimal Integer, Long, Decimal
* Multiplikation Integer, Long, Decimal Integer, Long, Decimal
/ Division Integer, Long, Decimal Integer, Long, Decimal
ADD Addition ohne Überlaufprüfung Integer Integer
SUB Subtraktion ohne Überlaufprüfung Integer Integer
MOD Modulo (Rest einer Division) Integer, Long Integer, Long
AND bitweises UND Integer, Long Integer, Long
OR bitweises ODER Integer, Long Integer, Long
XOR bitweises Exklusiv-ODER Integer, Long Integer, Long
SHL links schieben ohne Überlaufprüfung,
Beispiel (B um zwei Bits nach links schieben): B = B SHL 2
Integer, Long Integer
SHR rechts schieben ohne Überlaufprüfung Integer, Long Integer

Anmerkungen:
¹) Wenn der linke Operand einen numerischen Datentyp hat (Integer, Long oder Decimal), muss der rechte Operand ebenfalls einen numerischen Datentyp haben, jedoch nicht zwingend den gleichen. Wenn der linke Operand ein String-Ausdruck ist, muss der rechte Operand ebenfalls vom Typ String sein.
²) Beim Datentyp String lassen sich mit dem Plus-Operator komplexe String-Ausdrücke bilden. Lesen Sie dazu bitte auch die Hinweise zur Zeichenkettenverarbeitung, insbesondere zur den String-Ausdrücken!

1.5.1. Vergleichsoperatoren

Vergleichsoperatoren (=, <>, <, <=, > und >=) liefern als Ergebnis immer einen Integer-Wert, und zwar entweder  0 (Vergleich fehlgeschlagen, alle Bits zurückgesetzt) oder -1 (Vergleich erfolgreich, alle Bits gesetzt). Dadurch, dass immer alle Bits gesetzt oder zurückgesetzt werden, können die bitweise wirkenden Operatoren AND und OR sowie die bitweise Negation NOT auch als logische Operatoren zum Verknüpfen von Vergleichen verwendet werden. Anhand des folgenden Beispiels soll das verdeutlicht werden:

10 A$="ABC"
20 B$="XYZ"
30 C=1
40 D=2
50 PRINT (A$<B$) AND (C<D)

In Zeile 50 wird eine -1 ausgeben. Und das kommt folgendermaßen: Die Teilausdrücke A$<B$ und C<D liefern jeweils den Wert -1, d.h., es sind alle Bits gesetzt. Die UND-Verknüpfung (AND-Operator) zwischen alle Bits gesetzt und alle Bits gesetzt bleibt bei alle Bits gesetzt, was den numerischen Wert -1 darstellt.

1.5.2. Mathematische Operatoren

Die mathematischen Operatoren sind: + - * / ADD SUB MOD. Haben beide Operanden den gleichen Datentyp, wird auch die Operation mit diesem Datentyp ausgeführt. Haben dagegen die Operanden unterschiedliche Datenypen, wird zuerst der Operand, dessen Typ den kleineren Wertebereich hat, in den Datentyp des anderen Operanden umgewandelt (automatische Datentypkonvertierung). Das Ergebnis hat dann den Datentyp mit dem größeren Wertebereich.

Das Ergebnis muss in den Ergebnisdatentyp passen. Ist das nicht der Fall, kommt es zu einem numerischen Überkauf und das Programm bricht mit einer entsprechenden Fehlermeldung ab.

Die Operatoren ADD und SUB führen dagegen eine Integer-Addition bzw. -Subtraktion ohne Überlaufprüfung aus. Das ist z.B. sinnvoll bei der Berechnung von Speicheradressen. Folgendes Beispiel soll das verdeutlichen:

10 A=&H7F00
20 N=0
30 FOR I=0 TO 999
40 IF PEEK(A+I)=0 THEN N=N+1
50 NEXT
60 PRINT N

Ab der Adresse 7F00h sollen in den folgenden 1000 Bytes die Anzahl der Nullbytes gezählt werden. Bei der Adresse 8000h bricht das Programm mit einem numerischen Überlauf ab, da der größtmögliche vorzeichenbehaftete Wert von 32767 (7FFFh) überschritten wurde. Mit dem ADD-Operator bricht das Programmm nicht ab:

10 A=&H7F00
20 N=0
30 FOR I=0 TO 999
40 IF PEEK(A ADD I)=0 THEN N=N+1
50 NEXT
60 PRINT N

1.5.3. Bitweise wirkende Operatoren

Die Operatoren AND, OR und XOR führen bitweise Verknüpfungen durch und sind nur mit den Datentypen Integer und Long möglich. Haben beiden Operanden den Datentyp Integer, wird auch Integer zurückgeliefrt. In allen anderen Fällen, d.h. wenn mindestens ein Operand den Typ Long hat, wird die gesamte Operation als Long ausgeführt.

1.5.4. Schiebeoperatoren

Die Operatoren SHL und SHR schieben den 16-Bit-Integer- bzw. 32-Bit-Long-Wert des linken Operanden um soviele Bits nach links (SHL) bzw. rechts (SHR), wie durch den rechten Operanden angegeben wurde. Es werden immer Nullbits hineingeschoben. Die herausgeschobenen Bits gehen verloren. Eine Überlaufprüfung findet nicht statt. Das Ergebnis hat den gleichen Datentyp wie der linke Operand.

1.6. Vorrangregeln

Die verschiedenen Operatoren haben eine unterschiedliche Bindungskraft. Operatoren mit einer höheren Bindungskraft werden vor den Operatoren mit einer niedrigeren Bindungskraft ausgeführt. Innerhalb der gleichen Bindungskraft erfolgt die Ausführung von links nach rechts.

Die Tabelle zeigt die Rangfolge der einzlnen Operatoren. Je weiter oben ein Operator steht, desto höher ist die Bindungskraft.

RangOperatorBemerkung
1 (...) in Klammern eingeschlossener Ausdruck
2 +
-
Operatoren mit einem Operanden
(Vorzeichen, Inkrement und Dekrement)
3 *
/
Multiplikation und Division
4 +
-
ADD
SUB
Addition und Subtraktion
5 SHL
SHR
Schiebeoperationen
6 <
<=
>
>=
=
<>
Vergleiche
7 NOT bitweise Negation
8 AND
OR
XOR
bitweise binäre Operationen

2. String-Ausdrücke

String-Ausdrücke sind entweder ein String-Literal (Zeichenkettenkonstante), eine String-Variable oder der Aufruf einer String-Funktion. Das Zusammenketten von String-Ausdrücken mit dem Plus-Zeichen ist nur bei der Zuweisung einer String-Variable (LET-Anweisung) und bei den Anweisungen LABEL und PRINT erlaubt.

Lesen Sie bitte die Hinweise zur String-Verarbeitung.

3. Grammatik

Folgende Grammatik beschreibt die Syntax der Ausdrücke:

Ausdruck:
  Negationsausdruck
  Ausdruck AND Negationsausdruck
  Ausdruck OR Negationsausdruck
  Ausdruck XOR Negationsausdruck

Negationsausdruck:
  Vergleichsausdruck
  NOT Vergleichsausdruck

Vergleichsausdruck:
  Verschiebeausdruck
  Vergleichsausdruck Vergleichsoperator Verschiebeausdruck
  Einfacher_String-Ausdruck Vergleichsoperator Einfacher_String-Ausdruck

Vergleichsoperator:
  <
  <=
  =
  =>
  >
  <>

Verschiebeausdruck:
  Additionsausdruck
  Verschiebeausdruck Verschiebeoperator Additionssausdruck

Verschiebeoperator:
  SHL
  SHR

Additionsausdruck:
  Multiplikationsausdruck
  Additionsausdruck Additionsoperator Multiplikationsausdruck

Additionsoperator:
  ADD
  SUB
  +
  -

Multiplikationsausdruck:
  Unärer_Ausdruck
  Multiplikationsausdruck Multiplikationsoperator Unärer_Ausdruck

Multiplikationsoperator:
  *
  /
  MOD

Unärer_Ausdruck:
  Primärausdruck
  Numerische_Feldvariable
  Vorzeichen Primärausdruck

Vorzeichen:
  +
  -

Primärausdruck:
  ( Ausdruck )
  Zahlenliteral
  Zeichenliteral
  Einfache_numerische_Variable
  Numerische_Feldvariable
  Numerischer_Funktionsaufruf

Singuläre_Ganzzahlvariable:
  Einfache_Integer_oder_Long-Variable
  Integer_oder_Long_Feldvariable

Zahlenliteral:
  Folge_von_Ziffern_0...9
  Folge_von_Ziffern_0...9 Dezimalpunkt Folge_von_Ziffern_0...9
  &B Folge_von_Ziffern_0_oder_1
  &H Folge_von_Hexadezimalziffern

Dezimalpunkt:
  .

Zeichenliteral:
  ' 8-Bit-Zeichen '

Einfache_numerische_Variable:
  numerischer_Bezeichner

Numerische_Feldvariable:
  numerischer_Bezeichner ( Ausdruck )
  numerischer_Bezeichner ( Ausdruck , Ausdruck )

Numerischer_Funktionsaufruf:
  numerischer_Bezeichner
  numerischer_Bezeichner ( Argumentliste )

numerischer_Bezeichner:
  Buchstabe_A...Z
  Buchstabe_A...Z Folge_von_Buchstaben_A...Z_und_Zifferrn_0...9

Argumentliste:
  Argument
  Argumentliste , Argument

Argument:
  Ausdruck
  Einfacher_String-Ausdruck

Einfacher_String-Ausdruck:
  String-Literal
  String-Variable
  String-Feldvariable
  String-Funktion

String-Literal:
  " Folge_von_8-Bit-Zeichen "

String-Variable:
  String-Bezeichner $

String-Feldvariable:
  String-Bezeichner $ ( Ausdruck )
  String-Bezeichner $ ( Ausdruck , Ausdruck )

String-Funktion:
  String-Bezeichner
  String-Bezeichner ( Argumentliste )

String-Bezeichner:
  Buchstabe A...Z $
  Buchstabe A...Z Folge_von_Buchstaben_A...Z_und_Zifferrn_0...9 $