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 im Bereich von -32768 bis +32767.

1.1. Zahlen

Der Compiler versteht ganze Dezimalzahlen, Hexadezimalzahlen und Binärzahlen. Hexadezimalzahlen beginnen mit &H... (z.B. &HA2BD), und Binärzahlen beginnen mit &B (z.B. &B1001011).

1.2. Variablen

Es gibt einfache Variablen und Feldvariablen. Der Variablenname ist frei wählbar. Er muss mit einem Buchstaben beginnen und kann, sofern er länger als ein Zeichen ist, ab der zweiten Stelle Buchstaben und Ziffern enthalten. Groß-/Kleinschreibung wird nicht unterschieden. Der Variablenname darf kein reserviertes Schlüsselwort sein.

Feldvariablen müssen mit der DIM-Anweisung deklariert werden und können eine oder zwei Dimensionen aufweisen. Der Zugriff auf ein einzelnes Element erfolgt mit einem hinter dem Variablennamen in runden Klammern stehenden Index bzw. Indexliste.

1.3. Funktionen

Eine Liste der Funktionen finden Sie hier. Funktionen, deren Name mit einem $-Zeichen endet, 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,
Beispiel: A = NOT B


1.5. Operatoren mit zwei Operanden

OperatorBedeutung
ANDbitweises UND
ORbitweises ODER
XOR bitweises Exklusiv-ODER
=Test auf Gleichheit
<> Test auf Ungleichheit
<Test auf kleiner
<= Test auf kleiner oder gleich
> Test auf größer
>= Test auf größer oder gleich
ADD Addition ohne Überlaufprüfung
SUB Subtraktion ohne Überlaufprüfung
+Addition
-Subtraktion
*Multiplikation
/Division
MOD Modulo (Rest einer Division)
SHL links schieben ohne Überlaufprüfung,
Beispiel (B um zwei Stellen nach links schieben): B = B SHL 2
SHR rechts schieben ohne Überlaufprüfung

Vergleichsoperatoren liefern als Ergebnis 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, OR und 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.

Die Operatoren ADD und SUB führen eine 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.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 *
/
Multiplikation und Division
3 +
-
ADD
SUB
Addition und Subtraktion
4 SHL
SHR
Schiebeoperationen
5 <
<=
>
>=
=
<>
Vergleiche
6 NOT bitweise Negation
7 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
  Vorzeichen Primärausdruck

Vorzeichen:
  +
  -

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

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

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 $