Diverse Programmierhelfer

Willemers Informatik-Ecke

Hier sind etwas ungeordnet noch einige Werkzeuge aufgeführt, die unter UNIX ihre Heimat haben.

Kurzbetrachtung: lex und yacc

Für die Compilererstellung stehen die Programme lex und yacc zur Verfügung. Sie sollen hier nur kurz angerissen werden, da sie sehr schnell in die Tiefen des Compilerbaus lenken und für den großen Teil der Leser nicht sehr interessant ist.

lex generiert lexikalische Analyse

Ein Compiler arbeitet mit mehreren Stufen. Die erste ist die lexikalische Analyse, die Schlüsselworte aus den Textdateien heraussucht und erkennen kann. Letzlich handelt es sich um eine Mustererkennung. Das Programm lex generiert anhand einer Beschreibung Quelltexte, die solche Mustererkennungen durchführen können.

yacc generiert syntaktische Analyse

In der nächsten Stufe des Compilers arbeitet die syntaktische Analyse. Sie setzt auf der lexikalischen Analyse auf und interpretiert anhand einer Grammatik die Folge der von der syntaktischen Analyse gelieferten Schlüsselworte, die auch Tokens genannt werden. Der Umgang mit lex und yacc erfordert Kenntnisse in der Theorie des Compilerbaus, die sicher nicht zu den Themengebieten dieses Buches gehören. Wenn Sie aber auf Probleme stossen, die mit dem Interpretieren von Texten im Sinne von Programmiersprachen stoßen, sollten Sie sich die beiden Programme unbedingt mit einer geeigneten Literatur ansehen. Das Standardwerk zum Thema Compilerbau ist

Aho, Alfred V./Sethi, Ravi/Ullman, Jeffrey D.: Compilerbau. 1999

Eine Startseite, um Literatur und Links zu dem Thema, aber auch, um aktuelle Implemtierungen von lex und yacc zu finden, findet sich unter der URL:

http://www.compilerbau.de

Unterschiede zwischen Textdateien: diff

Das Programm diff zeigt die Unterschiede zweier Textdateien an, die es als Parameter erwartet. Der Rückgabewert ist 0, wenn zwischen den beiden Dateien keine Unterschiede bestanden. Im folgenden Beispiel werden die Dateien moin.c} und doppel.c verglichen:

gaston> diff moin.c doppel.c
0a1
> /* (C) 2002 Arnold Willemer */
2c3
< main()
---
> main(int argc, char **argv)
5d5
<     return 0;
gaston>

Um den Unterschied würdigen zu können, kommt nun der Text von moin.c

main()
{
    puts("Moin, Torfmoorholm!");
    return 0;
}

Und hier ist die Datei doppel.c, die an drei Stellen verändert wurde. In der ersten Zeile wurde ein Kommentar hinzugefügt. Der Funktion main wurden Parameter hinzugefügt. Dafür wurde die Zeile mit return entfernt.

/* (C) 2002 Arnold Willemer */

main(int argc, char **argv)
{
    puts("Moin, Torfmoorholm!");
}

Interpretation der Ausgabe

Die mit einem Größerzeichen beginnenden Zeilen werden der Datei moin.c hinzugefügt, die mit dem Kleinerzeichen entfernt. Die Meldungen dazwischen geben die Zeilennummern und die Aktion an. So bedeutet a das Anhängen der Zeile 1 aus doppel.c} hinter die Zeile 0 von moin.c. Der Buchstabe c bedeutet das Ersetzen und d steht für das Löschen.

Dateien aufs Byte geschaut: od

Man mag es kaum glauben, aber es gibt unter UNIX auch Dateien, die nicht reine Textdateien sind. Als Programmierer muss man auch hin und wieder in solche Dateien hineinschauen.

od zeigt binäre Dateien

Das Programm od zeigt die Datei, die ihm als Parameter übergeben wird byteweise in Oktaldarstellung an. Als Optionen können die Inhalte mit -x hexadezimal und mit -c als ASCII angezeigt werden.

gaston> head progr.tex | od
0000000 063534 045560 070141 072151 066145 050173 067562 071147
0000020 066541 064555 071145 067165 020147 067566 020156 064123
0000040 066145 071554 071153 070151 062564 076556 005012 061134
0000060 063545 067151 063573 040560 066156 071545 071145 005175
0000100 071120 063557 060562 066555 062551 062562 020156 071551
0000120 020164 064544 020145 067550 062550 045440 067165 072163

Dasselbe noch einmal in hexadezimaler Schreibweise:

gaston> head progr.tex | od -x
0000000 675c 4b70 7061 7469 6c65 507b 6f72 7267
0000020 6d61 696d 7265 6e75 2067 6f76 206e 6853
0000040 6c65 736c 726b 7069 6574 7d6e 0a0a 625c
0000060 6765 6e69 677b 4170 6c6e 7365 7265 0a7d
0000100 7250 676f 6172 6d6d 6569 6572 206e 7369
0000120 2074 6964 2065 6f68 6568 4b20 6e75 7473

Und weil es so schön ist, noch einmal als ASCII-Text:

gaston> head progr.tex | od -c
0000000   \   g   p   K   a   p   i   t   e   l   {   P   r   o   g   r
0000020   a   m   m   i   e   r   u   n   g       v   o   n       S   h
0000040   e   l   l   s   k   r   i   p   t   e   n   }  \n  \n   \   b
0000060   e   g   i   n   {   g   p   A   n   l   e   s   e   r   }  \n
0000100   P   r   o   g   r   a   m   m   i   e   r   e   n       i   s
0000120   t       d   i   e       h   o   h   e       K   u   n   s   t

Diese Seite basiert auf Inhalten aus dem Buch Arnold Willemer: Wie werde ich UNIX-Guru
Verlagsrechte bei galileo computing


Homepage (C) Copyright 2002 Arnold Willemer