Allgemeine Syntaxbeschreibung der Konfigurationsdateien und der Zeichenkettendatei   [1/3]
18xx/PC V2.22g - Dirk Clemens - 2004-05-07

  Seite 1    Seite 2    Seite 3 
page up top page
next page top
next page bottom
down bottom
 Homepage 
 Start 
 Neuigkeiten 
 Download 
 Hauptseiten 
 Überblick 
 18xx Spiele 
 kleine 1x8 
 18xx/PC 
 Geschichte 
 Links 
 Index 
 Programme 
 Überblick 
 18xx.exe 
 18config.exe 
 18export.exe 
 18string.exe 
 18check.exe 
 18list.exe 
 Varianten 
 18xx 
 1825 
 1826 
 1828 
 1829 
 1830 
 1835 
 1837 
 1839 
 1841 
 1842 
 1844 
 1847 
 1849 
 1851 
 1853 
 1856 
 1862 
 1869 
 1870 
 1895 
 1898 
 2038 


Inhaltsverzeichnis


page up top page
up top
next page top
next page bottom
down bottom

1.   Einführung

Diese Datei beschreibt die generelle Syntax der Konfigurationsdateien und der Zeichenkettendateien, die von den Programmen 18CONFIG und 18STRING eingelesen und verarbeitet werden. (Stand vom 15. Mai 2001)

Diese ganze Verwaltung übernimmt ein so genannter Preprozessor, der dem eigentlichen Programm einen Strom von Zeichen (Stream) übermittelt und dabei Kommentare und ganze Bereiche ausläßt, weitere Dateien einfügt und numerische oder textuelle Ausdrücke auswertet. Dabei können sowohl Schleifen als auch Macros verwendet werden. Dieser Preprozessor ist als C++ Klassenbibliothek implementiert.

Auch bei der Auswertung von einzelnen Formeln werden die in dieser Datei beschriebene Syntax angewendet.



page up top page
up top
next page top
next page bottom
down bottom

1.1   Letzten Änderungen

??? 2004

Januar 2004

September 2003

Juli 2003

April 2003




page up top page
up top
next page top
next page bottom
down bottom

2.   Allgemeine Syntax-Regeln

Eine einzelne Zeile inklusive Kommentare darf nicht länger als 1000 Zeichen sein, mehrere Fortsetzungszeilen zusammen dürfen aber beliebig lang sein. Bei einzelnen Programmen können längere Zeilen explizit erlaubt sein.

Ein '!' leitet einen Kommentar bis zum Zeilenende ein. Eine '{' leitet einen Kommentar bis zum Zeilenende oder bis zur nächsten '}' ein. Kommentare werden durch ein Leerzeichen ersetzt. Durch '#IF 0' und '#ENDIF' lassen sich auch ganze Blöcke auskommentieren.

Steuerzeichen (ASCII-Kode<32, z.B. TAB, ESC, CR, LF, FF, ... ) werden durch Leerzeichen ersetzt. Mehrfache Leerzeichen werden außerhalb von Zeichenketten (siehe unten) durch ein Leerzeichen ersetzt. Leerzeichen oder Tabulatoren am Zeilenanfang oder Zeilenende und auch ganze Leerzeilen werden ignoriert. Zeilen, die mit einem Graphikzeichen beginnen, werden ebendso ignoriert.

Ein '\' als letztes Zeichen einer Zeile nach der Entfernung von Kommentaren leitet eine Fortsetzungszeile ein. Eine Basiszeile wird zusammen mit einer oder mehreren Fortsetzungszeilen logisch wie eine Zeile betrachtet.

Zeilen, die mit '#' beginnen (z.B. '#IF', '#DEFINE'), sind Steuerzeilen für den Preprozessor oder leiten programmabhängige Kommandos ein. Groß- und Kleinschreibung ist bei den Preprozessor-Befehlen unerheblich. Zeilen, die nur aus einem '#' bestehen oder mit '##' oder '#!' beginnen, werden vollständig ignoriert.



page up top page
up top
next page top
next page bottom
down bottom

3.   Preprozessor-Anweisungen

Preprozessor-Anweisungen beginnen alle mit einem '#' innerhalb einer Zeile. Es dürfen beliebig viele Leerzeichen vor und nach dem '#' stehen, aber keine Kommentare. Groß-/Kleinschreibung der Kommandos ist unerheblich.



page up top page
up top
next page top
next page bottom
down bottom

3.1   Alphabetische Übersicht

Die Preprozessor Anweisungen sind in mehrere funktionale Gruppen eingeteilt worden. Daher zuerst eine alphabetische Liste aller Preprozessor Anweisungen.
#!, #>, #IFNOT, #ENDIF, #DOIF, #DEF, #DEF, #UNDEF, #GDEF, #GDEF, #PDEF, #PDEF, #PUNDEFINE, #ERROR, #CHAIN, #LABEL, #GOTO, #LOOP, #WHILE, #ENDW, #FOR, #ENDFOR, #BREAK, #MACRO, #ENDM, #:, #PARAMETERS, #PARAMS, #END, #EXIT, #CALL, #ENDMACRO, #CONTINUE, #ENDF, #ENDWHILE, #ENDR, #ENDREPEAT, #REPEAT, #ENDL, #ENDLOOP, #GOSUB, #INCLUDE
#WARNING #MESSAGE, #ECHO, #ECHO, #MESSAGE, #WARNING, #ERROR, #PUNDEF, #PDEFINE, #PDEF, #PDEF, #GUNDEFINE, #GUNDEF, #GDEFINE, #XDEF, #XDEF, #XDEFINE, #XUNDEF, #XUNDEFINE, #XDEF, #XDEF, #GDEF, #GDEF, #UNDEFINE, #DEFINE, #DEF, #DEF, #FI, #ELSE, #ELIF*, #ELSE IF*, #IFUNDEF, #IFNDEF, #IFDEF, #IF, ##, #



page up top page
up top
next page top
next page bottom
down bottom

3.2   Kommentare

3.2.1   #

  Syntax:   '#'

Zeilen, die nur aus einem '#' bestehen, werden ignoriert.


3.2.2   #!

  Syntax:   '#! Kommentar'

Das das '!' Zeichen selber einen Kommentar einleitet, bleibt nach Entfernung dieses Kommentares nur ein einfachen '#' übrig. Damit leitet auch '#!' einen Kommentar ein.


3.2.3   ##

  Syntax:   '## Kommentar'

Zeilen, die mit '##' beginnen, werden ignoriert. Zwischen den beiden Zeichen dürfen sich Leerzeichen befinden. Somit können Preprozessor Anweisungen durch das Voranstellen eines weiteren '#' auskommentiert werden. Im Gegensatz zu '#!', werden auch Fortsetzungszeilen ignoriert.


page up top page
up top
next page top
next page bottom
down bottom

3.3   Berechnete Zeilen

3.3.1   #>

  Syntax:   '#> <Text.Ausdruck>'

Der Ausdruck wird ausgewertet und in eine Zeichenkette verwandelt. Diese Zeichenkette wird dann als neue Eingabezeile verwendet, die vollständig inklusive Kommentare und Kommandos abgearbeitet wird. Damit sind berechnete Eingabezeilen möglich.


page up top page
up top
next page top
next page bottom
down bottom

3.4   Bedingte Ausführung (IF THEN ELSE)

  Syntax:   '#IF*' ... '#ELSE IF*' ... '#ELIFDEF' ... '#ELSE' ... '#ENDIF'

Diese IF-THEN-ELSE-Struktur ermöglicht das bedingte Auslassen von bestimmten Zeilen bei der Analyse der Datei. '#ELSE IF', '#ELSEIFDEF' und '#ELSE' sind optional. Diese Struktur kann auch geschachtelt werden.

Falls der Ausdruck hinter '#IF' WAHR ist, dann werden die folgenden Zeilen bis zu einem '#ELSE IF*', '#ELIF*', '#ELSE' oder '#ENDIF' bearbeitet und anschließend alle Zeilen bis zum zugehörigen '#ENDIF' ignoriert.

Ist der Ausdruck hinter '#IF' FALSCH, dann werden die Zeilen bis zum nächsten '#ELSE IF', '#ELIF*', '#ELSE' oder '#ENDIF' ignoriert und ggf. wird der Ausdruck hinter '#ELSE IF*' bzw. '#ELIF*' bearbeitet und es wird wie bei '#IF*' verfahren. '#ELSE' ist wie '#ELSE IF*', nur das es keinen Ausdruck benötigt und immer WAHR angenommen wird.

Innerhalb einer IF-Struktur wird maximal ein Block bearbeitet. IF-Strukturen können geschachtelt werden. Es existieren verschiedene '#IF*'-Befehle:

3.4.1   #IF

  Syntax:   '#IF <logischer.Ausdruck>'

Damit die folgenden Zeilen bearbeitet werden, muß der numerische Ausdruck WAHR, d.h. eine Nummer ungleich '0' oder eine Zeichenkette mit mindestens einem Zeichen, sein. Dieser <logischer.Ausdruck> ist der Programmiersprache 'C' nachempfunden und ist weiter unten beschrieben.


3.4.2   #IFNOT

  Syntax:   '#IFNOT <logischer.Ausdruck>'

Wie '#IF', nur das Ergebnis des numerischen Ausdruckes muß FALSCH ergeben, damit die folgenden Zeilen ausgeführt werden.


3.4.3   #IFDEF

  Syntax:   '#IFDEF <Variablen.Ausdruck>'

Damit die folgenden Zeilen bearbeitet werden, muß der <Variablen.Ausdruck> WAHR sein. Ein <Variablen.Ausdruck> besteht aus einer Liste von Variablennamen, die durch '|' oder '&' getrennt sind. Vor jedem Variablenname kann ein '-' stehen. Genaueres ist im Abschnitt <Variablen.Ausdruck> genau beschrieben.


3.4.4   #IFNDEF

  Syntax:   '#IFNDEF <Variablen.Ausdruck>'
'#IFUNDEF <Variablen.Ausdruck>'

Wie '#IFDEF', nur das Ergebnis des <Variablen.Ausdruck> muß FALSCH sein.


3.4.5   #ELSE IF*

  Syntax:   '#ELSE IF* ...'
'#ELIF* ...'

Ist das Ergebnis aller vorherigen '#IF' und '#ELIF' Anweisungen FALSCH, dann wird diese Anweisung wie eine '#IF' Anweisung behandelt. Ist jedoch eine der vorherigen '#IF' oder '#ELIF' Anweisungen WAHR, dann werden die folgenden Zeilen bis zum passenden '#ENDIF' ignoriert. Anstatt '#ELIF*' kann auch '#ELSE IF*' verwendet werden. Zu jedem '#IF*' existiert ein '#ELSE IF*' und ein '#ELIF*'.


3.4.6   #ELSE

  Syntax:   '#ELSE'

Ist das Ergebnis aller vorherigen '#IF*' und '#ELIF*' Anweisungen FALSCH dann werden die folgenden Anweisungen bearbeitet. Ist jedoch eine der vorherigen '#IF*' oder '#ELIF*' Anweisungen WAHR, dann werden die folgenden Zeilen bis zum passenden '#ENDIF' ignoriert.


3.4.7   #ENDIF

  Syntax:   '#ENDIF'
'#FI'

'#ENDIF' schließt eine '#IF' Struktur ab. Anstatt '#ENDIF' kann auch '#FI' verwendet werden.


3.4.8   #DOIF

  Syntax:   '#DOIF ( <logischer.Ausdruck> ) Kommando_oder_Textzeile'

Die Kommando oder Textzeile wird genau dann verarbeitet, wenn der <logischer.Ausdruck> WAHR ist. Die runden Klammern um den Ausdruck sind zwingend erforderlich.


page up top page
up top
next page top
next page bottom
down bottom

3.5   Definition von Variablen

3.5.1   #DEF

  Syntax:   '#DEF Variable [ = <Ausdruck> ]   [; ...]'
'#DEF "Zeichenkette" [ = <Ausdruck> ]  [; ...]'
'#DEF 'Zeichenkette' [ = <Ausdruck> ]  [; ...]'
'#DEF ( Text_Ausduck ) [ = <Ausdruck> ]  [; ...]'
'#DEFINE Variable [ = <Ausdruck> ]  [; ...]'

'#DEF' ist eine Kurzform für '#DEFINE'. Beide definieren ein oder mehrere lokale Variablen. Variablen sind Zeichenketten, die aus Buchstaben, Ziffern und den Sonderzeichen '$', '_' und '.' bestehen, wobei Groß-/Kleinschreibung keine Rolle spielt.

Durch die Angabe einer Zeichenkette können auch Variablen mit Sonderzeichen definiert werden. Es kann auch ein Text-Ausdruck in runden Klammern angegeben werden. Das Ergebnis dieses Ausdruckes wird dann als Variablenname verwendet.

Auf Variablen mit Sonderzeichen kann nur mit der Funktion 'var()' zugegriffen werden. Die Existenz einer solchen Variable kann mit 'def()' überprüft werden.

Die einzelnen Variablen werden durch Komma oder Semikola voneinander getrennt. Um einer Variable einen Wert zuzuweisen, muß nach dem Variablennamen ein '=', ':' oder ':=' und ein <Ausdruck> folgen. Die Definition und die Zuweisung eines Wertes erfolgt erst nach der Berechnung des Ausdruckes, so dass Selbstbezüge möglich sind. Sollen nach einem solchen Ausdruck weitere Definitionen folgen, so ist das Semikolon als Trennzeichen zwingend. Bereits definierte Variblen erhalten einen neuen Wert.

Beispiel:   '#DEFINE acht = 8; fünf : 5; drei := acht - fünf; count = count + 1'


3.5.2   #UNDEF

  Syntax:   '#UNDEF Variablenname "Zeichenchenkette" (Ausdruck) ...'
'#UNDEFINE Variablenname "Zeichenchenkette" (Ausdruck) ...'

'#UNDEF' ist eine Kurzform für '#UNDEFINE'. Beide löschen die Definition eines oder mehrerer lokaler Variablen. Nicht existierende Variablen erzeugen keine Fehlermeldung. Variablen können auch durch Komma oder Semikolon voneinander getrennt werden.

Durch die Angabe einer Zeichenkette können auch Variablen mit Sonderzeichen definiert werden. Es kann auch ein Text-Ausdruck in runden Klammern angegeben werden. Das Ergebnis dieses Ausdruckes wird dann als Variablenname verwendet.


3.5.3   #GDEF

  Syntax:   '#GDEF Variable [ = <Ausdruck> ]   [; ...]'
'#GDEF "Zeichenkette" [ = <Ausdruck> ]  [; ...]'
'#GDEF 'Zeichenkette' [ = <Ausdruck> ]  [; ...]'
'#GDEF ( Text_Ausduck ) [ = <Ausdruck> ]  [; ...]'
'#GDEFINE Variable [ = <Ausdruck> ]  [; ...]'

'#GDEF' ist eine Kurzform für '#GDEFINE'. Diese Kommandos arbeiten fast genauso wird die Kommandos ohne das führende 'G'. ('#DEFINE' und '#DEF') Diese 'G' steht für GLOBAL. Durch '#GDEFINE' werden globale Variablen erzeugt.


3.5.4   #GUNDEF

  Syntax:   '#GUNDEF Variablenname "Zeichenchenkette" (Ausdruck) ...'
'#GUNDEFINE Variablenname "Zeichenchenkette" (Ausdruck) ...'

'#GUNDEF' ist eine Kurzform für '#GUNDEFINE'. Beide löschen die Definition eines oder mehrerer globaler Variablen. Nicht existierende Variablen erzeugen keine Fehlermeldung.


3.5.5   #XDEF

  Syntax:   '#XDEF Variable [ = <Ausdruck> ]   [; ...]'
'#XDEF "Zeichenkette" [ = <Ausdruck> ]  [; ...]'
'#XDEF 'Zeichenkette' [ = <Ausdruck> ]  [; ...]'
'#XDEF ( Text_Ausduck ) [ = <Ausdruck> ]  [; ...]'
'#XDEFINE Variable [ = <Ausdruck> ]  [; ...]'

'#XDEF' ist eine Kurzform für '#XDEFINE'. Diese Kommandos arbeiten fast genauso wird die Kommandos ohne das führende 'X'. ('#DEFINE' und '#DEF') Durch '#XDEFINE' werden gleichzeitig lokale und globale Variablen erzeugt.


3.5.6   #XUNDEF

  Syntax:   '#XUNDEF Variablenname "Zeichenchenkette" (Ausdruck) ...'
'#XUNDEFINE Variablenname "Zeichenchenkette" (Ausdruck) ...'

'#XUNDEF' ist eine Kurzform für '#XUNDEFINE'. Beide löschen die Definition eines oder mehrerer lokaler und globaler Variablen. Nicht existierende Variablen erzeugen keine Fehlermeldung.


3.5.7   #PDEF

  Syntax:   '#PDEF [ [n] ] Variable [ = <Ausdruck> ]   [; ...]'
'#PDEF [ [n] ] "Zeichenkette" [ = <Ausdruck> ]  [; ...]'
'#PDEF [ [n] ] 'Zeichenkette' [ = <Ausdruck> ]  [; ...]'
'#PDEF [ [n] ] ( Text_Ausduck ) [ = <Ausdruck> ]  [; ...]'
'#PDEFINE [ [n] ] Variable [ = <Ausdruck> ]  [; ...]'

'#PDEF' ist eine Kurzform für '#PDEFINE'. Diese Kommandos arbeiten fast genauso wird die Kommandos ohne das führende 'P'. ('#DEFINE' und '#DEF') Diese 'P' steht für PARAMETER. Durch '#PDEFINE' werden Parameter-Variablen erzeugt.


3.5.8   #PUNDEF

  Syntax:   '#PUNDEF Variablenname "Zeichenchenkette" (Ausdruck) ...'
'#PUNDEFINE Variablenname "Zeichenchenkette" (Ausdruck) ...'

'#PUNDEF' ist eine Kurzform für '#PUNDEFINE'. Beide löschen die Definition eines oder mehrerer Parameter-Variablen. Nicht existierende Variablen erzeugen keine Fehlermeldung.


page up top page
up top
next page top
next page bottom
down bottom

3.6   Kontrollmeldungen

3.6.1   #ECHO, #MESSAGE, #WARNING, #ERROR

  Syntax:   '#ECHO <Text.Ausdruck>'
'#MESSAGE <Text.Ausdruck>'
'#WARNING <Text.Ausdruck>'
'#ERROR <Text.Ausdruck>'

Der folgende Text wird über die Fehlerausgabe ausgegeben. Durch '#WARNING' und '#ERROR' wird eine Standardfehlermeldung erzeugt und der Fehlerzähler erhöht. Bei '#MESSAGE', '#WARNING' und '#ERROR' wird neben einem Textkopf eine Referenz der aktuellen Zeile ausgegeben. '#ECHO' gibt nur den Text aus.


page up top page
up top
next page top
next page bottom
down bottom

3.7   Einfügen von Dateien

3.7.1   #INCLUDE

  Syntax:   '#INCLUDE (Dateiname)'
'#INCLUDE [Dateiname]'
'#INCLUDE <Dateiname>'

Der Inhalt der angegebenen Datei wird an dieser Stelle eingefügt. Der Unterschied der drei Varianten untereinander liegt nur in der Fehlerbehandlung, falls die Datei nicht existiert: Bei '()' wird keine Fehlermeldung ausgegeben. Bei '[]' erfolgt die Ausgabe einer Warnung und bei '<>' erfolgt nach der Ausgabe einer Fehlermeldung der Abbruch der Bearbeitung. Dateien, die mittels '#INCLUDE' eigelesen werden, können wiederum einen oder mehrere '#INCLUDE' Befehle enthalten.

Eine Datei wird zuerst im aktuellen Verzeichnis, dann im Verzeichnis der übergeordneten (aufrufenden) Datei und danach im Verzeichnis des Auswertungsprogramms gesucht.

Ist INCLUDE erfolgreich, dann wird sowohl beim Aufruf als auch beim Verlassen der neuen Datei die Variable '$INCLUDE' definiert. Nach einem Fehler ist diese Variable undefiniert.


3.7.2   #CHAIN

  Syntax:   '#CHAIN (Dateiname)'
'#CHAIN [Dateiname]'
'#CHAIN <Dateiname>'

Die Abarbeitung der aktuellen Datei wird beendet und es wird bei der angegebenen Datei fortgesetzt, falls diese existiert. Die Fehlerbehandlung ist die gleiche wie bei '#INCLUDE'.


page up top page
up top
next page top
next page bottom
down bottom

3.8   Sprünge mit GOTO und GOSUB

3.8.1   #LABEL

  Syntax:   '#LABEL Namen...'

Für jede Textdatei und jedes Macro wird eine seperate interne Liste mit Symbolen aufgebaut, in denen Dateipositionen für die Befehle '#GOTO' und '#GOSUB' festgehalten werden. Wird eine '#LABEL' Anweisung erreicht, werden alle folgenden Symbole mit der aktuellen Dateiposition gesichert. Bereits definierte Symbole werden überschrieben.

Wird nun aufgrund des '#GOTO' oder '#GOSUB' Befehles eine Marke gesucht, dann wird zuerst vom Programm kontrolliert, ob die Marke schon definiert ist. Ist dieses der Fall, dann wird das Programm an der angegebenen Stelle fortgesetzt. Ist die Marke jedoch noch nicht definiert, dann wird ab der aktuellen Dateiposition die erste Definition der Marke gesucht. Wird uberhaupt keine passende Marke gefunden, dann erfolgt eine Fehlermeldung.


3.8.2   #GOTO

  Syntax:   '#GOTO Label'
'#GOTO Label #IF* ...'

Die Fortsetzung des Texteinlesens wird an der Stelle fortgeführt, an der das angegebene Symbol mittels '#LABEL' definiert worden ist. In der zweiten Form wird die Anweisung jedoch nur dann ausgeführt, wenn die Bedingung WAHR ist. (siehe '#IF*')


3.8.3   #GOSUB

  Syntax:   '#GOSUB Label'
'#GOSUB Label #IF* ...'

Die Fortsetzung des Texteinlesens wird an der Stelle fortgeführt, an der das angegebene Symbol mittels '#LABEL' definiert worden ist. In der zweiten Form wird die Anweisung jedoch nur dann ausgeführt, wenn die Bedingung WAHR ist. (siehe '#IF*') Nach dem Erreichen des Dateiendes oder der Anweisung '#END' wird die Textanalyse in der Zeile nach dem '#GOSUB' fortgesetzt.


page up top page
up top
next page top
next page bottom
down bottom

3.9   Schleifen

Schleifen ermöglichen eine Wiederholung von Anweisungen. Es werden vier verschiedene Schleifen unterstützt: '#LOOP', '#REPEAT', '#WHILE' und '#FOR'



3.9.1   #LOOP

  Syntax:   '#LOOP'

Mit '#LOOP' wird eine Endlos-Schleife begonnen, die durch '#ENDLOOP' syntaktisch wieder beendet wird. Ein Abbruch der Ausführung Schleife ist nur durch '#BREAK' möglich.


3.9.2   #ENDLOOP

  Syntax:   '#ENDLOOP'
'#ENDL'

'#ENDL' ist eine Kurzform für '#ENDLOOP'. Mit diesen Kommandos wird eine durch '#LOOP' eingeleitete Schleife beendet.


3.9.3   #REPEAT

  Syntax:   '#REPEAT <Ganzzahl.Ausdruck, 32 Bit>'

Mit '#REPEAT' wird eine Schleife begonnen, die durch '#ENDREPEAT' syntaktisch wieder beendet wird.

Der Ganzzahlige Parameter legt fest, wie häufig die Schleife wiederholt werden soll. Ist dieser 'Parameter <= 0', dann wird die Schleife nicht ausgeführt.


3.9.4   #ENDREPEAT

  Syntax:   '#ENDREPEAT'
'#ENDR'

'#ENDR' ist eine Kurzform für '#ENDREPEAT'. Mit diesen Kommandos wird eine durch '#REPEAT' eingeleitete Schleife beendet.


3.9.5   #WHILE

  Syntax:   '#WHILE <logischer.Ausdruck>'

Mit '#WHILE' wird eine Schleife begonnen, die durch '#ENDWHILE' syntaktisch wieder beendet wird. Vor jedem Schleifendurchlauf wird der Wert der While-Bedingung neu berechnet. Ist diese Bedingung WAHR, dann wird die Schleife nochmals ausgeführt.


3.9.6   #ENDWHILE

  Syntax:   '#ENDWHILE'
'#ENDW'

'#ENDW' ist eine Kurzform für '#ENDWHILE'. Mit diesen Kommandos wird eine durch '#WHILE' eingeleitete Schleife beendet.


3.9.7   #FOR

  Syntax:   '#FOR Variable [:][=] VON ; BIS [ ; SCHRITTWEITE ]'

Mit '#FOR' wird eine Schleife begonnen, die durch '#ENDFOR' syntaktisch wieder beendet wird. Der VARIABLEN wird der Wert VON zugewiesen. Bei jedem folgenden Durchlauf wird der Wert SCHRITTWEITE addiert.

Ist SCHRITTWEITE > 0, dann wird die Schleife solange durchgeführt, wie VARIABLE < BIS ist. Ist SCHRITTWEITE < 0, dann wird die Schleife solange durchgeführt, wie VARIABLE > BIS ist. Ist SCHRITTWEITE == 0, dann wird die Schleife keinmal ausgeführt.


3.9.8   #ENDFOR

  Syntax:   '#ENDFOR'
'#ENDF'

'#ENDF' ist eine Kurzform für '#ENDFOR'. Mit diesen Kommandos wird eine durch '#FOR' eingeleitete Schleife beendet.


3.9.9   #BREAK

  Syntax:   '#BREAK'
'#BREAK #IF* ...'

Die aktuelle Schleife wird beendet und die Ausführung nach dem entsprechenden '#ENDLOOP', '#ENDREPEAT', '#ENDWHILE' oder '#ENDFOR' fortgesetzt. In der zweiten Form wird die Anweisung jedoch nur dann ausgeführt, wenn die Bedingung WAHR ist. (siehe '#IF*')


3.9.10   #CONTINUE

  Syntax:   '#CONTINUE'
'#CONTINUE #IF* ...'

Die aktuelle Durchlauf der Schleife wird beendet und die Ausführung mit dem entsprechenden '#ENDLOOP', '#ENDREPEAT', '#ENDWHILE' oder '#ENDFOR' fortgesetzt. In der zweiten Form wird die Anweisung jedoch nur dann ausgeführt, wenn die Bedingung WAHR ist. (siehe '#IF*')


page up top page
up top
next page top
next page bottom
down bottom

3.10   Makros

3.10.1   #MACRO

  Syntax:   '#MACRO name'

Es wird ein Macro definiert. Die Definition wird durch '#ENDMACRO' beendet. Die Zeilen zwischen 'MACRO' und 'ENDMACRO' werden nur bei dem Ausführen den Macros analysiert. Innerhalb einer Macrodefinition darf sich keine andere Macrodefinition befinden. Macros werden durch '#CALL' aufgerufen.


3.10.2   #ENDMACRO

  Syntax:   '#ENDMACRO'
'#ENDM'

'#ENDM' ist eine Kurzform für '#ENDMACRO'. Beide schließen die Definition eines Macros durch '#MACRO' ab.


3.10.3   #CALL

  Syntax:   '#CALL name'
'#CALL name ( parameter, ... )'
'#CALL name ( parameter, ... ) [N]'
'#CALL ? ...'
'#: name'
'#: name ( parameter, ... )'
'#: name ( parameter, ... ) [N]'
'#: ? ...'

'#:' ist eine Kurzform für '#CALL'. Ein vorher duch '#MACRO' definiertes Makro wird aufgerufen. Dem Makro können Parameter übergeben werden. Diese Parameter werden nacheinander den Variablen $1, $2, ... übergeben. Die Variablen $1 bis $20 sind immer definiert, die Variablen ab $21 bei Bedarf.

Die Variable $N enthält die Anzahl der übergebenen Parameter an. Der Wert der Variablen $N kann auch direkt durch die Angabe '[N]' festgelegt werden.

Bei Aufruf eines nicht definierten Makros erfolgt eine Fehlermeldung. Diese kann unterdrückt werden, indem vor dem Makronamen ein '?' steht.


3.10.4   #PARAMETERS

  Syntax:   '#PARAMETERS variable1,variable2,...'
'#PARAMETERS [index] variable1,variable2,...'
'#PARAMS variable1,variable2,...'
'#PARAMS [index] variable1,variable2,...'

'#PARAMS' ist eine Kurzform für '#PARAMETERS'. Den angegebenen Variablen werden nacheinander die Werte der Variablen $1, $2, ... übergeben. Bei Angabe von INDEX wird der ersten Variable der Wert von '$<index>' übergeben.


page up top page
up top
next page top
next page bottom
down bottom

3.11   Terminierung

3.11.1   #END

  Syntax:   '#END'
'#END <Ausdruck>'

Die Abarbeitung der aktuellen Datei bzw. des aktuelles Makros wird beendet. Dieses geschieht auch automatisch am Dateiende bzw. Makroende. Während am Dateiende der korrekte Abschluß aller '#IF' Strukturen kontrolliert wird, entfällt dieses bei '#END'. Hierdurch kann '#END' auch bedingt erfolgen. Der Ausdruck wird berechnet und das Ergebnis in der Variablen '$STATUS' gespeichert. Ist kein Ausdruck vorhanden, so ist die Variable '$STATUS' undefiniert.


3.11.2   #EXIT

  Syntax:   '#EXIT'
'#EXIT <Ausdruck>'

Die Abarbeitung aller Dateien und Makros wird beendet. Offene '#IF' Befehle werden ignoriert. Der numerische Ausdruck wird berechnet und an das Programm übergeben.


page up top page
up top
next page top
next page bottom
down bottom

4.   Variablen

Variablen werden auf vier Ebenen verwaltet: Parameter Variablen, lokale Variablen, globale Variablen, unveränderbare Variablen (Konstanten).

Bei Abfrage einer Variable wird zuerst kontrolliert, ob die Variable als Parameter definiert ist. Bei erfolgloser Suche wird sie als lokale Variable, danach als globale und zuletzt als Konstante gesucht.

  • Parameter Variablen
    Parameter Variablen sind nur innerhalb der jeweiligen Include-Datei oder des jeweiligen Macros gültig. Bei jedem '#INCLUDE', '#GOSUB', '#CALL' und '#:' wird eine neuer Variablen Bereich eingerichtet. Nach Beendigung des Macro's, Include's oder Gosub's werden die zugehörigen Parametervariablen wieder gelöscht.

    Parameter Variablen können durch die Kommandos '#PDEF' und '#PARAMETERS' definiert werden.

  • lokale Variablen
    Lokale Variablen sind während der gesamten Ausführung gültig. Sie können durch die Kommandos '#DEF' und '#XDEF' definiert werden.

  • globale Variablen
    Globale Variablen sind ähnlich wie lokale Variablen. Sie können durch die Kommandos '#GDEF' und '#XDEF' definiert werden. In manchen Programmen haben globale Variablen noch eine besondere Bedeutung.

  • unveränderbare Variablen (Konstanten)
    Unveränderbare Variablen sind nicht veränderbar oder löschbar. Die vordefinierten Konstanten werden im nächsten Abschnitt beschrieben.



page up top page
up top
next page top
next page bottom
down bottom

4.1   Vordefinierte Konstanten

Die folgenden Konstanten sind immer definiert:

 Name   Wert/Dezimal   Wert/Hexadezimal   Funktion 
 _SYSTEM_LINUX   1 unter Linux, sonst undefiniert   --
 _SYSTEM_UNIX   1 unter Unix (auch Linux), sonst undefiniert   --
 _SYSTEM_WINDOWS   1 unter Windows, sonst undefiniert   --
 _SYSTEM_DOS   1 unter DOS, sonst undefiniert   --
 @N   ohne Wert   --
 @NONE   ohne Wert   --
 NONE   ohne Wert (obsolete)   --
 E    2.718281828459  'e()'
 PI    3.141592653590  'pi()'
 _FALSE   0   0x0   --
 _TRUE   1   0x1   --
 @L   leere Liste   --
 @LIST   leere Liste   --
 @M   leere Map   --
 @MAP   leere Map   --
 _ERR_NONE   1   0x1  'GetError()' 'SetError()'
 _ERR_INT32   2   0x2   --
 _ERR_INT64   4   0x4   --
 _ERR_FLOAT   8   0x8   --
 _ERR_STRING   16   0x10   --
 _ERR_LIST   32   0x20   --
 _ERR_MAP   64   0x40   --
 _ERR_VALUE   128   0x80   --
 _ERR_DIV0   256   0x100   --
 _NONE   0   0x0  'Type()'
 _INT32   1   0x1   --
 _INT64   2   0x2   --
 _FLOAT   3   0x3   --
 _TEXT   4   0x4   --
 _STRING   4   0x4   --
 _LIST   5   0x5   --
 _MAP   6   0x6   --
 _META   805306368   0x30000000  'filename()' 'printfilename()'
 _DOS   805371904   0x30010000   --
 _WIN   805437440   0x30020000   --
 _UNIX   805502976   0x30030000   --
 _URL   805568512   0x30040000   --
 _LOCAL   Systemabhängig ( _DOS | _WIN | _UNIX )   --
 _WORKING   Systemabhängig ( _WIN | _UNIX )   --
 _SERV   268435457   0x10000001  'filename()' 'printfilename()'
 _HOST   268435458   0x10000002   --
 _PORT   268435460   0x10000004   --
 _DEV   268435464   0x10000008   --
 _DIR   268435472   0x10000010   --
 _NAME   268435488   0x10000020   --
 _EXT   268435520   0x10000040   --
 _TYPE   268435584   0x10000080   --
 _LABEL   268435712   0x10000100   --
 _PATH   268435487   0x1000001f   --
 _FILE   268435680   0x100000e0   --
 _IAM_NONE   0   0x0  'InclAccessMode()'
 _IAM_RESTRICTED   1   0x1   --
 _IAM_ALL   2   0x2   --
 _FAM_NONE   0   0x0  'FileAccessMode()'
 _FAM_STAT   2   0x2   --
 _FAM_FIND   3   0x3   --
 _FAM_READ   4   0x4   --
 _FAM_WRITE   5   0x5   --
 _FAM_ALL   7   0x7   --
 _ATT_DIR   1   0x1  'FileInfo()' ' FileAttrib()'
 _ATT_FILE   2   0x2   --
 _ATT_SPECIAL   4   0x4   --
 _ATT_VOLUME   8   0x8   --
 _ATT_EXEC   16   0x10   --
 _ATT_WRITE   32   0x20   --
 _ATT_READ   64   0x40   --
 _ATT_NONEXIST   128   0x80   --
 _ATT_HIDDEN   256   0x100   --
 _ATT_SYSTEM   512   0x200   --
 _ATT_ARCHIVE   1024   0x400   --
 _ATT_VIA_SYMLINK   2048   0x800   --
 _FT_NONE   0   0x0  'filetype()'
 _FT_DIR   1   0x1   --
 _FT_FILE   2   0x2   --
 _FT_SPECIAL   4   0x4   --
 _FT_UNKNOWN   8   0x8   --
 _FT_CHAR   16   0x10   --
 _FT_BLOCK   32   0x20   --
 _FT_PIPE   64   0x40   --
 _FT_SOCKET   128   0x80   --
 _FT_LINK   256   0x100   --
 _TRIM_BEGIN   1   0x1  'trim()'
 _TRIM_END   2   0x2   --
 _TRIM_MULTI   4   0x4   --
 _TRIM_STRING   8   0x8   --
 _TRIM_BOTH   3   0x3   --
 _TRIM_STD   7   0x7   --
 _TRIM_STD_STRING   15   0xf   --
 _EXP_LEFT   1   0x1  'expand()'
 _EXP_RIGHT   2   0x2   --
 _EXP_BOTH   3   0x3   --
 _EXP_WHOLE   4   0x4   --
 _EXP_FILL   8   0x8   --
 _EXP_ADJUST   16   0x10   --
 _EXP_TRUNCATE   32   0x20   --
 _CONV_LT   1   0x1  'text2xml()'
 _CONV_GT   2   0x2   --
 _CONV_AMP   4   0x4   --
 _CONV_PERCENT   8   0x8   --
 _CONV_APOS   16   0x10   --
 _CONV_QUOT   32   0x20   --
 _CONV_CDATA   64   0x40   --
 _CONV_CDATA_DELIM   128   0x80   --
 _CONV_SPECIAL   256   0x100   --
 _CONV_CODENUM   512   0x200   --
 _CONV_CONTROL   1024   0x400   --
 _CONV_TAB_CR_LF   2048   0x800   --
 _CONV_DECIMAL   4096   0x1000   --
 _CONV_LT_GT   3   0x3   --
 _CONV_ALL_CHARS   319   0x13f   --
 _CONV_HTML_ATTRIB   293   0x125   --
 _CONV_HTML_TEXT   261   0x105   --
 _CONV_XML_ATTRIB   3621   0xe25   --
 _CONV_XML_TEXT   1541   0x605   --
 _CONV_XML_CDATA   192   0xc0   --
 _CONV_STD_HTML   1280   0x500   --
 _CONV_STD_XML   1536   0x600   --
 _DUMP_TERM_CR   1   0x1  'hexdump()'
 _DUMP_TERM_LF   2   0x2   --
 _DUMP_TERM_CRLF   3   0x3   --
 _DUMP_TERM_NULL   4   0x4   --
 _DUMP_NO_TEXT   8   0x8   --
 _DUMP_NO_EXTRA_SPACE   16   0x10   --
 _DUMP_DOUBLE_WIDE   32   0x20   --
 _DUMP_MULTI_LINES   64   0x40   --
 _DUMP_TERMINATE   128   0x80   --
 _DUMP_ALIGN_2   256   0x100   --
 _DUMP_ALIGN_4   512   0x200   --
 _DUMP_ALIGN_5   1024   0x400   --
 _DUMP_ALIGN_8   2048   0x800   --
 _DUMP_ALIGN_10   4096   0x1000   --
 _DUMP_ALIGN_16   8192   0x2000   --
 _DUMP_ALIGN_20   16384   0x4000   --
 _DUMP_ALIGN_32   32768   0x8000   --
 _DUMP_NO_ADDR   65536   0x10000   --
 _DUMP_FULL_ADDR   131072   0x20000   --
 _DUMP_AUTO_ADDR_FW   262144   0x40000   --
 _DUMP_DECIMAL_ADDR   1048576   0x100000   --
 _DUMP_DECIMAL_VAL   2097152   0x200000   --
 _DUMP_STD   194   0xc2   --
 _NO_LANGUAGE   0   0x0  'language()'
 _ENGLISH   1   0x1   --
 _GERMAN   2   0x2   --
 _UNKNOWN_LANGUAGE   3   0x3   --
 _NSEC100   0   0x0  'selecttime()' ' splittime()'
 _SEC   1   0x1   --
 _MIN   2   0x2   --
 _HOUR   3   0x3   --
 _DAY   4   0x4   --
 _MONTH   5   0x5   --
 _YEAR   6   0x6   --
 _WEEKOFYEAR   7   0x7   --
 _WYEAR   8   0x8   --
 _WEEK   9   0x9   --
 _WDAY   10   0xa   --
 _YDAY   11   0xb   --
 _TDAY   12   0xc   --
 _DSEC   13   0xd   --
 _ISGREGOR   15   0xf   --
 _GREGORDAY   16   0x10   --
 _RED   268435456   0x10000000  'color()'
 _REDORANGE   268435457   0x10000001   --
 _ORANGERED   268435457   0x10000001   --
 _ORANGE   268435458   0x10000002   --
 _ORANGEYELLOW   268435459   0x10000003   --
 _YELLOWORANGE   268435459   0x10000003   --
 _YELLOW   268435460   0x10000004   --
 _YELLOWGREEN   268435461   0x10000005   --
 _GREENYELLOW   268435461   0x10000005   --
 _GREEN   268435462   0x10000006   --
 _GREENCYAN   268435463   0x10000007   --
 _CYANGREEN   268435463   0x10000007   --
 _CYAN   268435464   0x10000008   --
 _CYANBLUE   268435465   0x10000009   --
 _BLUECYAN   268435465   0x10000009   --
 _BLUE   268435466   0x1000000a   --
 _BLUEMAGENTA   268435467   0x1000000b   --
 _MAGENTABLUE   268435467   0x1000000b   --
 _MAGENTA   268435468   0x1000000c   --
 _MAGENTARED   268435469   0x1000000d   --
 _REDMAGENTA   268435469   0x1000000d   --
 _GREY   268435470   0x1000000e   --
 _BLACKWHITE   268435471   0x1000000f   --
 _USER0   268435472   0x10000010   --
 _USER1   268435473   0x10000011   --
 _USER2   268435474   0x10000012   --
 _USER3   268435475   0x10000013   --
 _USER4   268435476   0x10000014   --
 _USER5   268435477   0x10000015   --
 _USER6   268435478   0x10000016   --
 _USER7   268435479   0x10000017   --
 _USER8   268435480   0x10000018   --
 _USER9   268435481   0x10000019   --
 _COLORSCHEME   268435456   0x10000000   --
 _N_COLORS   14   0xe   --
 _NN_COLORS   16   0x10   --
 _NNN_COLORS   26   0x1a   --
 _FONT_L1   0   0x0   --
 _FONT_L2   1   0x1   --
 _FONT_L3   2   0x2   --
 _FONT_D1   3   0x3   --
 _FONT_D2   4   0x4   --
 _FONT_D3   5   0x5   --
 _BG_L1   6   0x6   --
 _BG_L2   7   0x7   --
 _BG_L3   8   0x8   --
 _BG_L4   9   0x9   --
 _BG_L5   10   0xa   --
 _BG_L6   11   0xb   --
 _BG_L7   12   0xc   --
 _BG_L8   13   0xd   --
 _BG_L9   14   0xe   --
 _BG_D1   15   0xf   --
 _BG_D2   16   0x10   --
 _BG_D3   17   0x11   --
 _BG_D4   18   0x12   --
 _BG_D5   19   0x13   --
 _BG_D6   20   0x14   --
 _BG_D7   21   0x15   --
 _BG_D8   22   0x16   --
 _BG_D9   23   0x17   --
 _ROMAN_LOWER   0   0x0  'roman()'
 _ROMAN_UPPER   1   0x1   --
 _ROMAN_ZERO   2   0x2   --
 _ROMAN_SHORT   4   0x4   --
 _ROMAN_SIGNED   8   0x8   --
 _ROMAN_STD   4   0x4   --
 _NO_KEYWORD   -2   0xfffffffe  'keyword()'
 _KEYWORD_NOTFOUND   -1   0xffffffff   --
 _KEYWORD_FOUND   0   0x0   --
 _MSG_OK   1   0x1  'message()'
 _MSG_INFORMATION   2   0x2  'message()'
 _MSG_WARNING   3   0x3  'message()'
 _MSG_ERROR   4   0x4  'message()'
 _MSG_SYSTEM_ERROR   5   0x5  'message()'
 _MSG_INTERNAL_ERROR_CODE   6   0x6  'message()'
 _MSG_INTERNAL_ERROR_FILE   7   0x7  'message()'
 _MSG_INTERNAL_ERROR_CODE_FILE   8   0x8  'message()'
 _MSG_TO_MANY_INFOS   9   0x9  'message()'
 _MSG_TO_MANY_WARNINGS   10   0xa  'message()'
 _MSG_TO_MANY_ERRORS   11   0xb  'message()'
 _MSG_DIVISION_BY_NULL   12   0xc  'message()'
 _MSG_NON_TERM_STRING   13   0xd  'message()'
 _MSG_CANT_OPEN_TCP_SOCKET   14   0xe  'message()'
 _MSG_CANT_OPEN_UDP_SOCKET   15   0xf  'message()'
 _MSG_CANT_OPEN_FILE   16   0x10  'message()'
 _MSG_CANT_CREATE_FILE   17   0x11  'message()'
 _MSG_FILE_NOT_FOUND   18   0x12  'message()'
 _MSG_READ_ERROR   19   0x13  'message()'
 _MSG_WRITE_ERROR   20   0x14  'message()'
 _MSG_EOP_EXPECTED   21   0x15  'message()'
 _MSG_EOL_EXPECTED   22   0x16  'message()'
 _MSG_EOF_EXPECTED   23   0x17  'message()'
 _MSG_IF_LEVEL   24   0x18  'message()'
 _MSG_TO_MANY_IF   25   0x19  'message()'
 _MSG_ILL_ELSE   26   0x1a  'message()'
 _MSG_ILL_ENDIF   27   0x1b  'message()'
 _MSG_UNKNOWN_MACRO   28   0x1c  'message()'
 _MSG_ILL_MACRO   29   0x1d  'message()'
 _MSG_ILL_ENDM   30   0x1e  'message()'
 _MSG_MIS_ENDM   31   0x1f  'message()'
 _MSG_MIS_ENDL   32   0x20  'message()'
 _MSG_MIS_ENDR   33   0x21  'message()'
 _MSG_MIS_ENDW   34   0x22  'message()'
 _MSG_MIS_ENDF   35   0x23  'message()'
 _MSG_ILL_ENDL   36   0x24  'message()'
 _MSG_ILL_ENDR   37   0x25  'message()'
 _MSG_ILL_ENDW   38   0x26  'message()'
 _MSG_ILL_ENDF   39   0x27  'message()'
 _MSG_ILL_BREAK   40   0x28  'message()'
 _MSG_ILL_CONT   41   0x29  'message()'
 _MSG_TO_FEW_ELEMENTS   42   0x2a  'message()'
 _MSG_TO_MANY_ELEMENTS   43   0x2b  'message()'
 _MSG_TO_MANY_LOOPS   44   0x2c  'message()'
 _MSG_TO_MANY_OPEN_REFERENCES   45   0x2d  'message()'
 _MSG_ILL_ESCAPE   46   0x2e  'message()'
 _MSG_ILL_DELIM   47   0x2f  'message()'
 _MSG_ILL_PARAMETER   48   0x30  'message()'
 _MSG_ILL_KEYWORD   49   0x31  'message()'
 _MSG_MIS_KEYWORD   50   0x32  'message()'
 _MSG_MIS_THE_KEYWORD   51   0x33  'message()'
 _MSG_MIS_PARAMETER   52   0x34  'message()'
 _MSG_MIS_ALPHANUM_ID   53   0x35  'message()'
 _MSG_MIS_NUMBER   54   0x36  'message()'
 _MSG_MIS_FNAME   55   0x37  'message()'
 _MSG_MIS_CHAR   56   0x38  'message()'
 _MSG_MIS_CHAR2   57   0x39  'message()'
 _MSG_AMBIGUOUS_KEYWORD   58   0x3a  'message()'
 _MSG_ABBREV_KEYWORD   59   0x3b  'message()'
 _MSG_KEYWORD_COMBINATION   60   0x3c  'message()'
 _MSG_UNKNOWN_KEYWORD   61   0x3d  'message()'
 _MSG_UNKNOWN_SYMBOL   62   0x3e  'message()'
 _MSG_UNKNOWN_FUNCTION   63   0x3f  'message()'
 _MSG_UNKNOWN_LABEL   64   0x40  'message()'
 _MSG_FORBIDDEN_FUNCTION   65   0x41  'message()'
 _MSG_SOCKET_ACCESS_FORBIDDEN   66   0x42  'message()'
 _MSG_READ_ACCESS_FORBIDDEN   67   0x43  'message()'
 _MSG_WRITE_ACCESS_FORBIDDEN   68   0x44  'message()'
 _MSG_INCLUDE_FORBIDDEN   69   0x45  'message()'
 _MSG_INCLUDE_FILE_FORBIDDEN   70   0x46  'message()'
 _MSG_UNKNOWN_OPTION_CHAR   71   0x47  'message()'
 _MSG_UNKNOWN_OPTION_STR   72   0x48  'message()'
 _MSG_OPTION_COMBINATION   73   0x49  'message()'
 _MSG_MIS_OPTION   74   0x4a  'message()'
 _MSG_SYNTAX_ERROR   75   0x4b  'message()'
 _MSG_UNKNOWN_ERROR_NUM   76   0x4c  'message()'
 _MSG_UNKNOWN_ERROR   77   0x4d  'message()'
 _MSG_USER   78   0x4e  'message()'
 _MSG__MAX   78   0x4e   --

Alle Variablen beginnen mit einem Unterstrich. Eine Besonderheit nimmt die obsolete Variable 'NONE' ein, die keinen Unterstrich hat: Sie enthält den Wert ''undefiniert''.



page up top page
up top
next page top
next page bottom
down bottom

5.   Ausdrücke

Im folgenden werden Ausdrücke beschrieben; man könnte Ausdrücke auch als Formeln bezeichnen. Dabei wird zwischen Ausdruck, numerischen Ausdruck, logischen Ausdruck, Ganzzahlausdruck, Fließkommaausdruck, Textausdruck und Variablenausdruck unterschieden.

Der Variablenausdruck ist eine Besonderheit, die im Abschnitt Variablen Ausdruck genau beschrieben wird.

Die anderen Ausdrücke werden identisch ausgewertet, nur das Ergebnis wird angepaßt.

  • Ausdruck
    Der folgende Ausdruck wird berechnet; das Ergebnis bleibt erhalten.

  • numerischer Ausdruck
    Das Ergebnis des Ausdruckes wird mittels der Funktion 'Num()' in eine Zahl gewandelt.

  • logischer Ausdruck
    Das Ergebnis des Ausdruckes wird mittels der Funktion 'Bool()' in WAHR oder FALSCH gewandelt.

  • Ganzzahlausdruck
    Das Ergebnis des Ausdruckes wird mittels der Funktion 'Int()' in eine Ganzzahl gewandelt.

  • Fließkommausdruck
    Das Ergebnis des Ausdruckes wird mittels der Funktion 'Float()' in eine Fließkommazahl gewandelt.

  • Textausdruck
    Das Ergebnis des Ausdruckes wird mittels der Funktion 'String()' in eine Zeichenkette gewandelt.

Ein Ausdruck ist:

Bei der Auswertung wird der gesamte Ausdruck compiliert, d.h. in ein optimiertes internes Format übersetzt. Teilausdrücke der Operanden '? :', '&&' und '||' werden nur ausgewertet, wenn sie noch relevant für den Gesammtausdruck sind.

Bei der Compilierung werden konstante Teilausdrücke optimiert; dieses gilt auch für alle Funktionen. So wird z.B. 'sqrt(4)*3*A' zu '2*3*A' und anschließend weiter zu '6*A' optimiert. Da gleichwertige Operatoren streng von links nach rechts berechnet werden, können Ausdrücke wie z.B. '2*A*3' nicht optimiert werden. Dazu müßten die Faktoren umgestellt und evtl. geklammert werden: 'A*(2*3)'. Optimierungen werde insbesondere dort eingesetzt, wo ein Ausdruck mehrfach zu Berechnung herangezogen wird.

Der Abschnitt Optimierungen befaßt sich näher mit den Optimierungsmöglichkeiten.



page up top page
up top
next page top
next page bottom
down bottom

5.1   Typen und Wertebereiche

Variablen und Ausdrücken können fünf verschiedene Typen annehmen:

  • NONE (undefiniert)
    Variablen, die zwar definiert sind, denen aber noch kein Wert zugewiesen wurde, sind von Typ NONE. Ausdrücke, die ein nicht definiertes Ergebnis haben, sind ebenfalls vom Typ NONE. So liefert z.B. ' 3 + "Hallo" ' den Wert NONE, da eine Zahl und eine Zeichenkette nicht addiert werden können.

  • INT32 (Ganzzahl/32 Bit)
    Ganzzahlen mit 32 Bit sind positive und negative natürliche Zahlen aus dem Bereich -2.147.483.648 bis 2.147.483.647.

  • INT64 (Ganzzahl/64 Bit)
    Ganzzahlen mit 64 Bit sind positive und negative natürliche Zahlen aus dem Bereich -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807.

  • FLOAT (Fließkommazahl)
    Fließkommazahlen haben eine Genauigkeit von 15,9 Dezimalstellen. Es können Zahlen aus dem Bereich -1,79769 * 10308 bis +1,79769 * 10308 dargestellt werden. Die kleinste positive Zahl ist +2,22507 * 10-308.

  • STRING (Zeichenkette)
    Zeichenketten sind Texte, die aus Null bis 2.147.483.647 Zeichen bestehen.

  • LIST (Liste/Array)
    Eine Liste von Werten. Die einzelnen Werte werden über einen numerischen Index beginnend ab Null angesprochen, der in eckigen Klammern '[]' steht. Jedes Listenelement kann wieder ein Objekt jeglichen Typs, also auch LIST oder MAP sein. Die Liste wird intern durch ein dynamisches Array verwaltet. (Details)

  • MAP (Map/Baum)
    Eine Map von Werten. Die einzelnen Werte werden über eine Zeichenkette als Selektor angesprochen, der in eckigen Klammern '[]' steht. Jedes Map-Element kann wieder ein Objekt jeglichen Typs, also auch LIST oder MAP sein. Die Map wird intern durch einen AVL-Baum verwaltet. (Details)




page up top page
up top
next page top
next page bottom
down bottom

5.1.1   Der Datentyp LIST

Mit dem Datentyp LIST können Daten in dynamischen Arrays gespeichert werden. Die einzelnen Werte werden über einen numerischen Index beginnend ab Null angesprochen, der in eckigen Klammern '[]' steht. Beispiel: var[3] = x[2*b] + y["map"][length(str)].

Wie in dem Beispiel gezeigt, kann ein LISTEN-Element wieder eine LISTE oder MAP enthalten.

Die Indexverwatlung ist robust. Um ein Element abzufragen, kann ein beliebiger numerische Index angegeben werden. Diese Index wird zunächst in eine Ganzzahl gewandelt. Existiert das Element mit dieses Index, dann wird es als Ergebnis geliefert; anderfalls wird @NONE geliefert.

Bei einer Zuweisung wird die LISTE automatisch erweitert, so dass das indizierte Element gespeichert werden kann. Alle anderen neu erzeugten Element erhalten den Wert @NONE. So werden z.b. durch var[1000] = 1 bis zu 1001 neue Elemente erzeugt.

Durch LIST oder L (Groß-/Kleinschreibung unerheblich) kann eine KONSTANTE LISTE angegeben werden. Die eigentliche Liste wird in eckigen Klammern '[]' eingeschlossen. Die einzelnen Werte werden durch Kommata getrennt. Ein leeres Element wird automatisch als @NONE interpretiert. Die Liste kann rekursiv LISTEN und MAPS enthalten.

Wichtig: Mittels @LIST wird eine Konstante definiert, die ihrerseits auch nur Konstanten enthalten darf. Alternativ lann die Funktion 'list()' verwendet werden.

Beispiele:

 Konstante   Beschreibung 
 @LIST   Leere Liste 
 @L   Kurzform für 'Leere Liste' 
 @LIST[]   Liste mit einem Element (@NONE) 
 @LIST[1]   Liste mit einem Element (@NONE) 
 @LIST[1,'a']   Liste mit zwei Elementen 
 @LIST[,1,,'a',]   Liste mit fünf Elementen 
 @LIST[@LIST[1,2],@MAP[a=1]]   Liste die eine LISTE und eine MAP enthält. 



page up top page
up top
next page top
next page bottom
down bottom

5.1.2   Der Datentyp MAP

Mit dem Datentyp MAP können Daten in AVL-Bäumen gespeichert werden. Die einzelnen Werte werden über einen textuellen Schlüsseln angesprochen, der in eckigen Klammern '[]' steht. Die Schlüssel sind Null-Terminiert unbd Groß-/Kleinschreibung ist relevant. Beispiel: var['x1'] = x["B"] + y[list_index]["x2"].

Wie in dem Beispiel gezeigt, kann ein LISTEN-Element wieder eine LISTE oder MAP enthalten.

Die Indexverwatlung ist robust. Um ein Element abzufragen, kann ein beliebiger Textschlüssel angegeben werden. Existiert das Element mit diesem Schlüssel, dann wird es als Ergebnis geliefert; anderfalls wird @NONE geliefert.

Bei einer Zuweisung wird die MAP automatisch erweitert, wenn das Element nicht schon existiert. Feine Kontrollen bieten die Funktionen 'm$insert()', 'm$replace()' und 'm$store()'

Durch MAP oder ML (Groß-/Kleinschreibung unerheblich) kann eine KONSTANTE MAP angegeben werden. Die Elemente werden in eckigen Klammern '[]' eingeschlossen. Die einzelnen Werte werden durch Kommata getrennt und haben das Format: "key_string"=wert. Solange der Schlüssel nur aus Buchstaben, Ziffern, '$' und '.' besteht, können die Anführungszeichen weggelassen werden. Die MAP kann rekursiv LISTEN und MAPS enthalten.

Beispiele:

 Konstante   Beschreibung 
 @MAP   Leere Map 
 @M   Kurzform für 'Leere Map' 
 @MAP[]   Leere Map 
 @MAP['name'=1]   Map mit einem Element namens 'name' 
 @MAP["name"=1]   Map mit einem Element namens 'name' 
 @MAP[name=1]   Map mit einem Element namens 'name' 
 @MAP['na me'=1]   Map mit einem Element namens 'na me' 
 @MAP[a=1,b=2.2]   Map mit zwei Elementen 
 @MAP[a=@MAP[1,2],b=@MAP[a=1]]   MAP, die eine LISTE und eine MAP enthält. 



page up top page
up top
next page top
next page bottom
down bottom

5.1.3   FALSCH oder WAHR

Die Vergleichsoperatoren, die logischen Operatoren und einige Funktionen liefern als Ergebnis einen Wahrheitswert: 'WAHR' oder 'FALSCH'.

Tatsächlich wird für den Wert 'WAHR' die Ganzzahl '1' und für den Wert 'FALSCH' die Ganzzahl '0' als Ergebnis geliefert.

Muß ein Ausdruck oder Wert in einen Wahrheitswert gewandelt werden, so erfolgt die Umwandlung abhängig von dem Typ des Ausdruckes oder Wertes. Diese wird für die logischen Verknüpfungen und die Funktion 'bool()' benötigt.

  • NONE (undefiniert)
    Es wird immer der Wert 'FALSCH' angenommen.

  • INT32 (Ganzzahl/32 Bit)
    Der Wert '0' wird als 'FALSCH' interpretiert. Alle anderen Werte werden als 'WAHR' interpretiert.

  • INT64 (Ganzzahl/64 Bit)
    Der Wert '0' wird als 'FALSCH' interpretiert. Alle anderen Werte werden als 'WAHR' interpretiert.

  • FLOAT (Fließkommazahl)
    Der Wert '0.0' wird als 'FALSCH' interpretiert. Alle anderen Werte werden als 'WAHR' interpretiert.

  • STRING (Zeichenkette)
    Eine leere Zeichenkette (keine Zeichen) wird als 'FALSCH' interpretiert. Alle Zeichenketten mit mindestens einem Zeichen werden als 'WAHR' interpretiert.

  • LIST (Liste/Array)
    Eine leere Liste (kein Element) wird als 'FALSCH' interpretiert. Alle anderen Lsiten mit mindestens einem Element werden als 'WAHR' interpretiert.

  • MAP (Map/Baum)
    Eine leere Map (kein Element) wird als 'FALSCH' interpretiert. Alle anderen Maps mit mindestens einem Element werden als 'WAHR' interpretiert.




page up top page
up top
next page top
next page bottom
down bottom

5.2   Operanden, Zahlen, Zeichenketten


Vorzeichen von Operanden
 Zeichen   Beschreibung 
 +   Identität: Der Wert der folgenden Zahl wird beibehalten. 
 -   Negation: Der Wert der folgenden Zahl wird negiert. 
 ^ , ~   Invertierung: Jedes einzelne Bit der folgenden Zahl wird negiert. 
 /   Logische Negation: Ist der Wert der folgenden Zahl WAHR, so ist das Ergebnis '1', sonst '0'. 

Operanden haben das folgende Format:

  1. Vor dem eigentlichen Operanden (Zahlenwert, Zeichenkette oder Ausdruck) dürfen beliebig viele Vorzeichen stehen, die durch die obige Tabelle erklärt sind. Diese Vorzeichen werden von rechts nach links abgearbeitet.

  2. Beginnt der Operand mit einem einfachen (') oder doppelten (") Hochkomma, dann handelt es sich um eine Zeichenkette. Der allgemeine Aufbau von Zeichenketten ist im nächsten Abschnitt beschrieben.

  3. Beginnt der Operand mit einer Ziffer, so handelt es sich um eine Zahl. Folgt auf einer Ziffernfolge ein Dezimalpunkt oder eine 'E', dann handelt es sich um eine Fließkommazahl. Wird die Zahl von '0x' geführt und enthält sie ein 'p' mit einer folgenden Dezimalzahl, dann handelt es sich um eine Fließkommazahl im Hexadezimalformat.

    In den anderen Fällen handelt es sich um eine Ganzzahl. Die Wandlungen von Text in Ganzzahlen werden im übernächsten Abschnitt beschrieben.

    Klein- und Großschreibung sind beim Einlesen von Zahlen unerheblich.

  4. Das '*' anstatt einer Zahl bedeutet die größtmögliche 32 Bit Ganzzahl2.147.483.647 ). '*q' bedeutet die größtmögliche 64 Bit Ganzzahl9.223.372.036.854.775.807 ).

    Um die kleinstmöglichen Ganzzahlen zu erhalten, kann man das Negationsvorzeichen ( '~' oder '^' ) verwenden. Diese kleinsten Zahlen sind -2.147.483.648 bzw. -9.223.372.036.854.775.808.

  5. In einer Liste werden die einzelnen Zahlen durch Leerzeichen oder Kommata voneinander getrennt. Innerhalb einer solchen Liste kann ein Bereich der Form 'a:b' oder 'a-b' definiert werden, wobei der Doppelpunkt als Kennzeichnung eines Bereiches verwendet werden sollte, da das Minuszeichen nicht eindeutig ist. Ein Bereich ist gleichbedeutend mit der Aufzählung 'a,a+1,...,b-1,b'. Eine Liste kann auch Bitmasken enthalten (siehe nächsten Punkt).

    Möchte man die Zahlen z.B. '3' und '-5' innerhalb einer Liste angeben, dann muß unbedingt das Komma als Trennzeichen verwenden und '3,-5' angeben, da '3 -5' als Bereich und gleichbedeutend mit '3,4,5' interpretiert wird.

  6. Eine in spitzen Klammern ('<' und '>') eingeschlossene Liste wird als Bitmaske interpretiert. Innerhalb einer solchen Liste müssen die Operanden untereinander durch Kommata getrennt werden. Jeder Operand definiert ein Bit, welches in der Ganzzahl gesetzt wird. Soll ein Operand ein numerischer Ausdruck sein, dann muß er in Klammern gesetzt werden.

    Folgt dem Größerzeichen '>' ein 'q' oder 'Q', dann wird die resultierende Zahl als 64 Bit Ganzzahl, sonst als 32 Bit Ganzzahl interpretiert.

    Beispiele: <0> == 1, <1> == 2, <2> == 4, <0,2> == 5, <0:2> == 7,
    <(6/3-2),(1+2)> == <0,3> == 9

  7. Ein in runden Klammern '()' eingeschlossener Ausdruck wird berechnet und danach als ein einzelner Operand betrachtet.

  8. Bei Operanden innerhalb von Ausdrücken können auch Variablen verwendet werden. Dabei sind nur definierte Variablen erlaubt, die mit einem Buchstaben, '_' oder '$' beginnen und im weiteren zusätzlich noch Ziffern enthalten können (siehe aber auch nächsten Punkt). Variablen werden durch ihren Wert ersetzt und können u.a. durch '#define' definiert werden.

  9. Wird ein Name von einer Klammer '(' gefolgt, dann handelt es um eine interne Funktion. Das allgemeine Format einer solchen internen Funktion ist: 'Funktionsname(Parameterliste)'. Die Parameterliste ist abhängig von der Funktion. Die einzelnen Funktionen werden unten beschrieben.

  10. @none ???

  11. @list[] ???

  12. @map[] ???



page up top page
up top
next page top
next page bottom
down bottom

5.2.1   Ganzzahlen (32 und 64 Bit)

Werden Texte in eine Zahl gewandelt, z.B. beim Einlesen der Datei oder durch Funktionen, dann werden die folgenden Regeln angewendet. Wichtig hierbei ist die Basis (das Zahlensystem), in der die einzulesende Zahl vorliegt. Klein- und Großschreibung spielen sind beim Einlesen von Zahlen unerheblich.

  • Wird die Zahl von '0x', '0d', '0o' oder '0b' (oder mit Großbuchstaben) angeführt, so handelt es sich zwangsweise um eine Hexadezimalzahl, Dezimalzahl, Oktalzahl oder Binärzahl und es wird eine Basis von 16, 10, 8 oder 2 verwendet.

  • Anderenfalls wird, falls eine gültige Basis ( von 2 bis 36 ) angegeben wurde, diese angegebene Basis für die Wandlung verwendet.

  • Anderenfalls wird die Basis 10 verwendet.

Die Buchstaben 'A' bis 'Z' (auch Kleinschreibung) werden als Ziffern mit den Wertigkeiten 10 bis 35 verwendet. Das Einlesen der Zahl wird beendet, wenn eine ungültige Ziffer oder ein anderes Zeichen erkannt wird.

Folgt der Ganzzahl ein 'q' (wie Quad), dann handelt es sich um eine 64 Bit Ganzzahl, anderenfalls um eine 32 Bit Ganzzahl. Dieses führt aber zu Problemen bei Zahlen mit einer Basis >26, da dort 'q' eine normale Ziffer ist.



page up top page
up top
next page top
next page bottom
down bottom

5.2.2   Zeichenketten (Strings)

Zeichenketten haben den folgenden Aufbau:

  • Eine Folge von Zeichen bis ausschließlich zum ersten Leerzeichen, Steuerzeichen (ASCII<32), Komma (,) oder Semikolon (;).

  • Eine Folge von Zeichen, die mittels " oder ' eingeschlossen sind ("..." oder '...'). Mehrere solche Zeichenketten hintereinander werden als eine Zeichenkette ausgewertet. So können solche Zeichenketten zusammen mit dem Fortsetzungszeichen auf mehrere Zeilen verteilt werden. Innerhalb einer Zeichenkette sind `Escape Sequenzen' erlaubt, die ein einziges Zeichen darstellen. Diese beginnen alle mit '\'.
     Zeichen   Bedeutung   # 
     \a   bell   7, 0x07 
     \b   backspace   0, 0x00 
     \e   esc   27, 0x1b 
     \f   form feed   12, 0x0c 
     \n   new line   10, 0x0a 
     \r   carrige return   13, 0x0d 
     \t   horizontal tab   9, 0x09 
     \v   vertikal tab   11, 0x0b 
     \\   \   92, 0x5c 
     \'   '   39, 0x27 
     \"   "   34, 0x22 
     \nnn   mit nnn als Oktalzahl für das Zeichen 
     \dnnn   mit nnn als Dezimalzahl für das Zeichen 
     \xnn   mit nn als Hexadezimalzahl für das Zeichen 

  • Ein in Klammern '()' eingeschlossener Ausdruck, der als Resultat eine Zeichenkette liefert.



page up top page
up top
next page top
next page bottom
down bottom

5.3   Operatoren

Die folgende Tabelle zeigt Operatoren, die zwischen zwei Operanden stehen und diese miteinander verknüpfen:

Operatoren
 Prio   Operator   Beschreibung 
 1   a ** b   Potenzierung: ab 
 2   a * b   Multiplikation 
 a / b   Division 
 a % b   Modulo (Rest bei der Ganzzahldivision von a/b) 
 3   a + b   Addition 
 a - b   Subtraktion 
 4   a << b   left-shift: a wird um b Bits nach links verschoben. 
 a >> b   right-shift: a wird um b Bits nach rechts verschoben. 
 5   a < b   Ergebnis := '1', falls a kleiner b, sonst '0' 
 a <= b   Ergebnis := '1', falls a kleiner oder gleich b, sonst '0' 
 a > b   Ergebnis := '1', falls a größer b, sonst '0' 
 a >= b   Ergebnis := '1', falls a größer oder gleich b, sonst '0' 
 6   a == b   Ergebnis := '1', falls a gleich b, sonst '0' 
 a <> b   Ergebnis := '1', falls a ungleich b, sonst '0' 
 7   a & b   Bitweise UND-Verknüpfung aller Bits 
 8   a ^ b   Bitweise EXKLUSIV-ODER-Verknüpfung aller Bits 
 a ~ b 
 9   a | b   Bitweise ODER-Verknüpfung aller Bits 
 10   a && b   Logische UND-Verknüpfung: Ergebnis := '1', falls a UND b WAHR. sonst '0' 
 11   a ^^ b   Logische EXKLUSIV-ODER-Verknüpfung: Ergebnis := '1', falls genau eines von a und b WAHR. Sonst '0' 
 a ~~ b 
 12   a || b   Logische ODER-Verknüpfung: Ergebnis := '1', falls a ODER b WAHR. Sonst '0' 
 13   a ? b : c   Falls a WAHR, dann b, sonst c 
 14   VAR = a   Zuweisung des Wertes a an Variable VAR, Ergebnis ist ebenfalls a 
 VAR := a   Zuweisung des Wertes a an Variable VAR, Ergebnis ist ebenfalls a 
 VAR *= a   Entspricht 'VAR = VAR * a' 
 VAR /= a   Entspricht 'VAR = VAR / a' 
 VAR %= a   Entspricht 'VAR = VAR % a' 
 VAR += a   Entspricht 'VAR = VAR + a' 
 VAR -= a   Entspricht 'VAR = VAR - a' 
 VAR &= a   Entspricht 'VAR = VAR & a' 
 VAR ^= a   Entspricht 'VAR = VAR ^ a' 
 VAR |= a   Entspricht 'VAR = VAR | a' 
 VAR <<= a   Entspricht 'VAR = VAR << a' 
 VAR >>= a   Entspricht 'VAR = VAR >> a' 

Im Gegensatz zu C/C++ wird heir das Ausrufezeichen zum Einleiten eines Kommentares verwedet.

Ein Ausdruck ist eine Liste von einem oder mehreren Operanden. Diese Operanden sind jeweils durch einen der in der obigen Tabelle genannten Operatoren voneinander getrennt. Die Operatoren, die in der Tabelle innerhalb eines Bereiches mit gleicher Hintergrundfarbe stehen, haben die gleiche Priorität. Operatoren, die in einem Bereich weiter oben stehen haben gegenüber weiter unten genannten eine höhere Priorität. So haben z.B. '*' und '/' die gleiche Priorität, haben aber gegenüber '+' und '-', die beide auf der gleichen Prioritätsstufe liegen, eine höhere Priorität. Die Operationen mit den höchsten Prioritäten werden zuerst berechnet, Operationen mit gleicher Priorität werden von links nach rechts bearbeitet. Klammerung mittels '()' ist zulässig um die Reihenfolge der Berechnungen zu ändern.

Beispiele:

' a*b + c*d ' ist das gleiche wie '(a*b) + (c*d)'
' a+b * c+d ' ist das gleiche wie 'a + (b*c) + d'
' a * b / c ' ist das gleiche wie '(a*b)/c'

Zuweisungen haben nach links die höchste Priorität und nach rechts die niedrigste Priotität. So wird z.B. bei '3+A=4+1' zuerst der Wert 5 der Variablen A zugewisen und danach der Wert 3 addiert. Allgemein wird bei Zuweisungen der linke Parameter als Variablename interpretiert, auch wenn es sich um eine Zeichenkette handelt.

  --- ??? ---  

Die Operatoren '&', '^' und '|' können auch auf je 2 Zeichenketten angewendet werden. Dann werden die einzelnen Zeichen der Zeichenkette Bitweise verknüpft. Die resultierende Zeichenkette ist bei der '&' Operation so lang, wie die kürzere Zeichenkette der beiden Quellen. Bei den Operatoren '^' und '|' ist die resultierende Zeichenkette so lang wie die längere Zeichenkette der beiden Quellen. (Siehe auch: Bitmanipulation)

Die Vergleiche und die Logischen Verknüpfungen '&&', '^^' und '||' liefern als Ergebnis entweder den Wert '1' für WAHR, oder den Wert '0' für FALSCH.

Bei Vergleichen gilt per Definition: NONE (undefiniert) < NUMBER (Zahl) < STRING (Zeichenkette) (siehe Funkton 'cmp()').



page up top page
up top
next page top
next page bottom
down bottom

5.4   Variablen-Ausdrücke

Ein Variablenausdruck ist ähnlich wie ein numerischer Ausdruck. Als Operanden sind jedoch nur Variablennamen zugelassen. Mit diesen Ausdrücken soll überprüft werden, ob Variablen oder Kombinationen von Variablen definiert sind.

Als Vorzeichen ist nur das Minuszeichen '-' und als Operatoren sind nur '&' und '|' zugelassen. Außerdem ist die Klammerung '(...)' und die Verwendung von Funktionen zugelassen.

Ist ein Variable definiert, so ergibt das den Wert WAHR, andernfalls ist sie undefiniert und ergibt den Wert FALSCH. Durch das '-' vor dem Variablen wird diese Aussage invertiert. Jedes neue Ergebnis wird mit dem vorherigen Ergebnis logisch mit UND ('&') oder ODER ('|') verknüpft, wobei UND gegenüber ODER eine höhere Priorität hat, genauso wie '*' bei numerischen Ausdrücken ein höhere Priorität gegenüber '+' hat. Teilausdrücke können mittels '()' geklammert werden. Vor den Klammern darf auch '-' stehen, um die Aussage des Teilausdruckes zu invertieren.

Funktionen werden wie gewohnt durchgerechnet. Anschließend wird das Ergebnis mittels 'Bool()' ein einen Wahrheitswert gewandelt.

Beispiele: Es sei die Variable 'W' definiert und die Variable 'F' undefiniert.

 Ausdruck   Ergebnis   Bemerkung 
 'F'   FALSCH   - 
 'W'   WAHR   - 
 '-F'   WAHR   - 
 '-W'   FALSCH   - 
 'F | W'   WAHR   - 
 '-( F | W )'   FALSCH   - 
 'F & W'   FALSCH   - 
 '-( F & W )'   WAHR   - 
 '-F & W'   WAHR   - 
 'W | W & F'   WAHR   - 
 '( W | W ) & F'   FALSCH   - 
 'int(1+2)'   FALSCH   numerisches Ergebnis == 3 <> 0 
 'int(2-6/3)'   FALSCH   numerisches Ergebnis == 2 - 2 == 0 



page up top page
up top
next page top
next page bottom
down bottom

5.5   Optimierungen

Bei der Auswertung von Ausdrücken werden diese vor der eigentlichen Berechnung in ein internes Format übersetzt. Diese Übersetzung kann dann einmal oder mehrfach ausgewertet werden. Bei der mehrfachen Auswertung wird eine Optimierung eingesetzt, damit unveränderliche Operationen nur einmal während der Übersetzung berechnet werden müssen.

Beispiel: Aus 'a=4, 3*a*x' wird '12*x'.

Bei der Optimierung werden Operatoren und Funktionen, bei denen alle Parameter Konstanten sind, sofort berechnet und durch das Rechenergebnis ersetzt. Bei der Optimierung werden keine Umstellungen vorgenommen. Da bei Operatoren mit gleicher Priorität die Berechnung von links nach rechts erfolgt, können Ausdrücke wie z.B. '3*X*4' nicht optimiert werden. Stattdessen sollte entweder '3*4*X' oder 'X*(3*4)' verwendet werden.

Beispiele für Optimierungen
 vor Optimierung   nach Optimierung   Bemerkungen 
 3+4+x   7+x   - 
 3+x+4   3+x+4   Umstellungen werden nicht vorgenommen 
 x+3+4   x+3+4   Berechne zuerst x+3 --> keine Optimierung 
 x+(3+4)   x+7   Optimierung wegen Klammerung 
 a=4,max(1,a)   4   a wird zur Konstanten --> Optimierung 
 max(1,4,x)   max(1,4,x)   Ein Parameter unbekannt --> keine Optimierung 
 max(max(1,4),x)    max(4,x)   Inneres max() kann optimiert werden 
  sin(pi()/2)   1.0   Sinus einer Konstanten --> Optimierung 



page up top page
up top
next page top
next page bottom

  Seite 1    Seite 2    Seite 3 

Diese Seite wurde mit MakeDoc V3.22a erzeugt.

18xx/PC V2.22g - © Dirk Clemens - 2004-05-07
dc@18xx.de