gymel  >> Tools  >> analyze  >> Kurzintro

  	ANALYZE.PL
	Ein Tool für Allegro-Parametrierer

Aufruf
Im folgenden ist nur die Bedienung ohne die TeX-Funktionalität erläutert.
Aufruf perl analyze.pl [<Schalter> ...] [-i|--] <file> [<Optionen> ...]
		Schalter: -d[ebug	.	xdb mit Debugging-Output wird erzeugt
			-i[nput ...	Dateiname für Quelle
			-o[utput ...	Dateipfad/Name für Ausgabe
            -x ...        mehr Schalter und Optionen in Datei 

			-q[uick]	  Nur Produktion von Warnungen u. Index
			-strip[only	  Statistik und Warnungen werden nicht eingehängt
			-ind[ex		  Index wird angehängt

			-r[ecurse	  Einbeziehen des Codes aus Includes
            -unr[ecurse   Includes ausschliessen (dies ist nicht -!recurse)
            -not[inc] ... Auch bei -recurse: Diese Includes nicht einbinden
            -do[inc] ...  Auch ohne -recurse: Diese Includes nicht einbinden
			-y ...		  Zusätzliche Includedatei für Kopf

            -nog[en]      Optionen nicht auswerten
            -reg[en       Optionen reaktivieren
            -var          Zeilenmakros \$(...) erlaubt 

            -src          Eingabe ist "Quelle": Optionen nicht ausgerückt
            -tex          TeXinput: alles anders
            -cfg          Eingabe ist CFG-Datei
            -su[perstrip] keine Kommentare, keine Auswertung

            -touch		  Ausgabedatei mit aktuellem Datum
            -2            zweiten Lauf Anhängen (Indexkorrektur)

            -deb[ug       Debugging-Output .xdb wird erzeugt   
            -mu[te        Keine Ausgabe auf Schirm

Zeilenmakros oder Umgebungsvariable zusätzlich setzen: VAR=Wert

Schalter oder Optionen ausschalten: '!' davorsetzen

Umgebungsvariable: -D; -P; -W; -K; DTDIRS; XDDIRS

		Erzeugt: <file>.xdb	Output zum Debuggen (falls Warnungen oder -deb)
			<file>.tmp	temporäre Datei (falls -deb)
			<file>.xi?	Index (falls nicht -q)
			<file>.xd?	Interner Kurzindex zum Einfügen am Anfang
			<file>.new	Datei mit neuem Kurzindex (falls nicht -tex, -o, -q)

Alle Aufrufoptionen sind im (Rahmen des Sinnvollen) miteinander kombinierbar

---------------------------------------------------------------------
Im folgenden wird davon ausgegangen, dass im Suchpfad eine Datei namens
ANALYZE.BAT existiert, etwa der Form
c:\perl\perl c:\perl\analyze.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
---------------------------------------------------------------------

Beispiel 1:
analyze cat.api

Die Datei cat.api im aktuellen Verzeichnis wird analysiert. Es wird erzeugt 
		cat.new		Variante von cat.api mit Headerzeilen, auch vor 
		            Includebefehlen, falls die zugehörigen .xdt-Dateien 
		            vorhanden waren
		cat.xii		Index
		cat.xdi		Interne Merkdatei: Enthält den Kopf sowie Informationen 
		            für die Indexierung
		cat.xdb		eventuelle Fehlermeldungen



Beispiel 2:
analyze -index -2 cat.api

wie das erste Beispiel, nur wird der Index (cat.xii) an die erzeugte 
Datei cat.new angehängt. Da die im Kopf eingehängten Daten eine variable
Anzahl von Zeilen haben, wird durch den Schalter -2 ein zweiter Durchlauf
gestartet, um die richtigen Zeilennummern für den Index zu produzieren.
(Anmerkung: Es passiert sowieso immer noch ein zusätzlicher Durchlauf
ohne Analyse zu dem Zweck, den Kopf an die richtige Stelle zu hängen)


Beispiel 3:
analyze -y text.txt cat.api

wie das erste Beispiel, nur wird zusätzlich der Text aus text.txt 
in den Kopf von cat.new integriert.


Beispiel 4:
analyze -o .\ c:\allegro\cat.api

die Ausgabedatei ist nicht cat.new im aktuellen Verzeichnis, sondern 
cat.api. Untersucht wird c:\allegro\cat.api. (Aktuelles Verzeichnis
darf nicht c:\allegro sein!)


Beispiel 5:
analyze -o c:\hallo cat.api

die Ausgabedatei ist nicht cat.new im aktuellen Verzeichnis, sondern 
C:\hallo.api (Voraussetzung: c:\hallo ist kein Verzeichnis)


Beispiel 6:
analyze -o c:\tmp cat.api

die Ausgabedatei ist nicht cat.new im aktuellen Verzeichnis, sondern 
C:\tmp\cat.api (Voraussetzung: c:\tmp ist ein Verzeichnis)


Beispiel 7:
analyze -o cat.bla cat.api

die Ausgabedatei ist nicht cat.new im aktuellen Verzeichnis, sondern 
cat.bla


Beispiel 8:
analyze -D c:\allegro\demo -P c:\allegro c:\allegro\cat.api

Für die Analyse von c:\allegro\cat.api werden Includetabellen in 
c:\allegro\demo und c:\allegro (in dieser Reihenfolge) gesucht.
Ist die Umgebungsvariable -P (-D) gesetzt, so erübrigt sich die Angabe 
von -P ... (-D ...) in der Aufrufzeile.


In der Aufrufzeile können Programm-, Daten und Arbeitsverzeichnis 
mit -P, -D und -W abgekürzt werden:

Beispiel 9:
analyze -o .\ -i -P\cat.api

Dabei sei die Umgebungsvariable -P auf C:\allegro initialisiert.
c:\allegro\cat.api wird analysiert, Includetabellen werden in C:\allegro 
gesucht. Die Ausgabedatei ist cat.api im aktuellen Verzeichnis.


Beispiel 10:
analyze -recurse cat.api

Die Ausgabedatei cat.new enthält den Text aller gefundenen Includedateien. 
Die zugehörigen Includebefehle sind auskommentiert.


Beispiel 11:
analyze -recurse -tex cat.api

Die Ausgabedatei cat.api enthält den Text aller gefundenen Includedateien. 
Die zugehörigen Includebefehle sind auskommentiert. Obwohl der Text einer
Includetabelle ABC.APT in diesem Beispiel stets aus der TeX-Datei BLA.DTT
im aktuellen Verzeichnis genommen wird, wird er nur einbezogen, wenn
die entsprechende .APT-Datei in einer der durch -P, -D, -W und . bezeichneten
Pfade vorhanden ist.


Beispiel 12:
analyze -quick cat.api

Keine Ausgabedatei cat.new wird erzeugt.


Beispiel 13:
analyze -touch cat.api

Normalerweise bekommt die Ausgabedatei das Datum der Quelldatei bzw. 
der jüngsten gefundenen Includedatei. Angabe von -touch führt dazu, 
daß die Ausgabedatei auf jeden Fall das aktuelle Datum erhält.


Beispiel 14:
analyze -debug cat.api

Die Ausgabedatei cat.xdb enthält nicht nur evtl. entstandene Warnungen, 
sondern auch die Quelldatei in reduzierter Form. Ausserdem wird die 
Zwischendatei cat.tmp nicht gelöscht.


Beispiel 15:
analyze test.api flaggesetzt

In der Ausgabedatei sind die Zeilen, die von Paaren <*flaggesetzt> 
... </flaggesetzt> umschlossen sind, aktiviert, andere, auf jeden 
Fall aber die, die von Paaren <*!flaggesetzt> ... </!flaggesetzt> 
umschlossen sind, auskommentiert. Gedacht ist dies dazu, mit einer 
Quelldatei mehrere Varianten einer Parameterdatei erzeugen zu können.


Beispiel 16:
analyze -i cat.api -x moreopts.opt

Mehr Schalter und Optionen befinden sich in der Datei MOREOPTS.OPT
(Maximal 9 Kommandozeilenargumente lassen sich bei Einschachtelung 
des Aufrufs in .BAT-Dateien ja nicht angeben).
Falls MOREOPTS.OPT Optionen enthält, muss die Eingabedatei mittels des
-i -Schalters wie im Beispiel VOR dem -x -Schalter auftreten.


Beispiel 17:
analyze -i cat.api -x moreopts.opt !debug

Mehr Schalter und Optionen befinden sich in der Datei MOREOPTS.OPT
Allerdings wird eine in MOREOPTS.OPT eventuell definierte Option "debug"
explizit wieder ausgeschaltet.

------------------------------------------------------------------------

Funktionsweise:

Die Eingabedatei wird geöffnet sowie nach der durch den Schalter |-x|
angegebenen Datei oder aber einer Datei |ANALYZE.OPT| mit zusätzlichen
Schaltern und Optionen im aktuellen Verzeichnis und im Verzeichnis mit
|ANALYZE.PL| gesucht,

Anschließend wird die Eingabedatei zeilenweise nach Allegro-Befehlen 
abgearbeitet. Dabei werden Zuweisungsanweisungen an Zwischenteile 
und Steuerbefehle auf unpaarige Anführungszeichen überprüft. 

Zwischenteildefinitionen werden indexiert.

Start- (und Endezeilen) von Unterprogrammen sowie Sprungmarken und 
die entsprechenden Sprünge und Aufrufe werden indexiert. Am Ende der 
Abarbeitung werden mit den gewonnen Informationen formale Konsistenztests 
(Ende vor Start, Aufruf hinter Start, Sprung zu nicht vorhandener 
Marke etc.) durchgeführt.

Kategoriezeilen werden auf unbalancierte Anführungszeichen durchsucht. 
Relative Sprünge und Manipulation von Anwendervariablen wird indexiert.
Beim Start von Kopf-, Fuß- und Hilfsabschnitt sowie bei Einbindebefehlen 
von Includetabellen und dem Dateiende wird getestet, ob es noch ungesättigte 
relative Sprünge gibt.

Hinter absoluten Sprungbefehlen wird getestet, ob der folgende Code 
von irgendwo angesprungen wird.

Beim Einbinden von Includetabellen wird deren Indexierung bezüglich 
Sprungmarken, Unterprogrammen, Anwendervariablen und Zwischenteilen 
mit einbezogen.

Globale Ersetzungen werden indexiert.

Bei Indexparameterdateien wird in Abhängikeit von den Setzungen der 
i-Parameter in der Quelldatei eventuell das Fehlen bestimmter Sprungmarken 
für Kurztitelliste, Pseudoschlüssel und Tastaturumcodierung moniert.


Kopferzeugung
Nach der Analyse wird die Kopfdatei <file>.xdb weggeschrieben und 
ebenso die diversen Indizes. Die in <file>.tmp befindliche Ausgabedatei 
wird erneut geöffnet und unter Einbeziehung der aktuellen Kopfdatei 
(und eventuell des ASCII-Index <file>.xii erneut weggeschrieben.
Der Kopf wird generell hinter der zweiten Zeile der Parameterdatei 
eingebunden, es sei denn, hinter der zweiten Zeile unmittelbar folgende 
(Kommentar-)Zeilen stimmen auf den ersten vier Zeichen mit dieser 
überein. In diesem Fall werden alle diese Zeilen vor dem Kopf eingesetzt. 
Hinter dem Kopf erscheinen alle diese Zeilen jedoch noch einmal.
Die ersten drei Kopfzeilen enthalten Generierungsinformation (Daten 
und Dateiname), die folgenden eine Auflistung der Sprungmarken, Unterprogramme 
und Anwendervariable, die darauf evtl. folgenden eine Liste der Warnungen.

(Aktive) Kommentare:
Zeilen, die mit
  %%
(zwei Spatien, zwei Prozentzeichen) beginnen, sind generierte Kommentare 
und werden bei nochmaliger Verarbeitung nicht berücksichtigt (so können 
Sie cat.new umbenennen zu cat.api und noch einmal analysieren, die 
resultierende cat.new wird sich nicht unterscheiden).
Eine Ausnahme sind Zeilen, die mit
  %%!
(zusätzlich  !') beginnen, diese werden dennoch übernommen.
Zeilen mit dem Start
 -- 
(Spatium, zwei Bindestriche, Spatium) korrespondieren zu (wg. Aufrufoptionen) 
inaktiven Code. Dieser wird (wegen der Zeilennumerierung in Listings) 
nicht unterdrückt, sondern nur auskommentiert.
Sprungmarkenreservierung:
Zeilen der Form
 !#-X
(exakt ein Leerzeichen vor  !') reservieren die Sprungmarke  X': Wird 
nach dieser Stelle eine Sprungmarke #-X gefunden, so wird eine Warnung 
ausgegeben.

Alle folgenden beginnen mit mit dem Prozentzeichen als erstem Zeichen 
der Zeile

Dokumentationsteile:
%    \end{macrocode}
(exakt vier Leerzeichen zwischen  %' und  \') Die folgenden Zeilen 
bis zur Zeile
%    \begin{macrocode}
werden übersprungen.

Generierungsoptionen:
%<*text>
( 'text' ist ein beliebiges Wort) Die folgenden Zeilen bis
%</text>
werden übersprungen, falls nicht  text' als Aufrufoption angegeben wurde.

%<*!text>
Dasselbe umgekehrt: Die folgenden Zeilen bis
%</!text>
werden übersprungen, falls  text' als Aufrufoption angegeben wurde.

%<*option_1|option_2>
Die Zeilen bis 
%</option_1|option_2>
werden aktiviert, wenn option_1 oder option_2 gesetzt ist.

%<*option_1&option_2>
Die Zeilen bis 
%</option_1&option_2>
werden aktiviert, wenn option_1 und option_2 gesetzt ist.

%<*(option_1&(!option_2)>
Die Zeilen bis 
%</(option_1&(!option_2)>
werden aktiviert, wenn option_1 und nicht option_2 gesetzt ist.

D.h.: Verkuepfungen mit & (und), | (oder) und ! (nicht) sind erlaubt
sowie beliebige Schachtelungen durch runde Klammern.


Zeilenmakros:
Gibt es eine Setzung var=wert (bzw. 
var="Zeichenkette, die auch Spatien enthalten kann"
), so kann wird ein in der (Quelle der) Parameterdatei vorkommender
Ausdruck ${var} durch den Wert ersetzt. Mehrzeilige Zeilenmakros
sind nicht erlaubt.


Struktur der .opt-Dateien:

Die Dateien werden von vorne nach hinten ausgewertet, wobei stets
die letzte Setzung gilt. Man sollte also bei der Formulierung vom
allgemeinen zum speziellen vorgehen.
Es sollte nur ein Zeilenmakro pro Zeile definiert werden.

# Kommentar
# Schalter ist unbedingt gesetzt
-mute
# naechster Schalter nur für Dateien mit Extension .cfg
*.cfg:: -not 2
# Optionen für Generierung (alle Dateien)
bugfix
# für Dateien mit Extension .api ist Zeilenmakro zz auf Leerstring gesetzt
*.api:: zz=""
# für Dateien mit Extension .api ist Option "index" gesetzt
*.api:: index
# für Dateien mit Extension .api ist Option "hallo" gesetzt
*.api:: hallo
# für "a..."-Dateien mit Extension .api ist auch noch Option "abc" gesetzt
a*.api:: abc
# aendert nichts
*.api:: index hallo
# noch ein paar Zeilenmakros
 perreg="1"
 topreg="3"
# "\" muss als "\\" escaped werden!
IL=150
# Setzungen für individuelle Dateien
s-filvbd.apr:: zz="#zz 0"
u-umlenk.apr:: zz=""


Was fehlt:

Nur Kommentare, die mindestens durch drei Leerzeichen vom Anweisungstext 
entfernt sind, werden als solche erkannt. Solche, die nur durch zwei 
Leerzeichen abgetrennt sind, werden fälschlicherweise mit analysiert.

Benutzung von Zwischenteilen als bedingte Postfixe wird nicht indexiert.

Der Analysemechanismus der Anweisungszeilen sollte Teilanweisungen 
analysieren, das wäre intelligenter und würde die beiden erstgenannten 
Defizite beheben.

Dokumentation für die Benutzung als Codeverwaltungssystem.

^Top