Compilerbau - Scanner Generator

Neue Frage »

Auf diesen Beitrag antworten »
Gisa Compilerbau - Scanner Generator

Hallo zusammen,

ich habe folgende Fragen zu Scanner Generatoren. Es gibt ja das LEX und eine Open Source Variante Flex.

Theoretisch weiss ich es so einigermaßen wie Sie funktionieren. Allerdings stoße ich im praktischen auf meine Grenzen.

Der Scanner erhält eine reguläre Grammatik in der Eingabedatei.

Mein Problem:
Was muss ich nun konkret machen um einen Scanner in z.B. C zu generieren.

Ich habe folgende Eingabedatei:
%{
#include <stdio.h>
#include <ctypeh>
%}

%%
[a-z] {putchar (toupper (*yytext));}
%%
main () {
yylex();
}

Ich habe FLex runtergeladen: Besteht aus C und Header Dateien. Was muss ich konkret machen? Wo und wem teile die obige Datei mit?
Bin für jegliche Hilfe sehr dankbar.

VG
Gisa
 
Auf diesen Beitrag antworten »
Tobias

Du brauchst zwei Teile:

1.) FLEX. Das gibts als Source-Package. Falls du Windows benutzt, ist es sinnvoller, die Binaries bzw. ein Setup zu ziehen von
http://gnuwin32.sourceforge.net/packages/flex.htm

2.) Einen C/C++ Compiler. Ich denke, dass GCC ganz gut funktioniert.


Der Rest ist easy:

Du erstellst eine LEX-Datei test.l wie bei dir unten angegeben und jagst sie durch flex. Das Resultat ist eine lex.yy.c-Datei. Die kannst du dann mit GCC compilieren:

gcc -o test.exe lex.yy.c -lfl
Auf diesen Beitrag antworten »
Gisa

Hallo Tobias,

alles klar. Ich habe mir die Setup Datei runtergeladen und installiert. Sie wird unter GNU32 in der Startleiste aufgeführt. Ich finde allerdings kein Oberfläche/GUI von Flex.

Also soweit ist alles verständlich bis auf das durchjagen im Flex. Wie?
Wäre toll wenn du das noch kurz erklären könntest.

Grüße
G.
----
meinst du etwa flex oder flex++? Wie benutzt man Sie?

Grüße
Gisa
Auf diesen Beitrag antworten »
Gisa

Musste mich erst einarbeiten :-).

ok jetzt hab ich meinen generierten Scanner.
-

Fehlermeldung beim kompilieren des lex.yy.c undefinied reference to yywrap ?? und -lfl (auf welchen ordner/Bibliothek wird gelinkt), gcc findet keins bei mir.

Grüße
Gisa
---
Also nachdem ich nun im windows die Bibliothek nicht verlinken konnte hab ich es kurzerhand mit Suse gemacht.

Ich habe jetzt eine ausführbare Datei namens test -> Ist das mein Scanner?!

Grüße
Gisa
 
Auf diesen Beitrag antworten »
Tobias

Man könnte doch glatt mal versuchen, die Datei auszuführen und gucken was passiert. geschockt
Auf diesen Beitrag antworten »
Gisa

das habe ich doch :-) funktioniert allerdings nicht. Schmiert ab. Wg. einem ungültigen Befehl.
Auf diesen Beitrag antworten »
Gisa

so habe das ganze nochmal wiederholt.
Ich kann meine test.exe zwar öffnen aber es öffnet sich nur einen console. Sonst läuft da nix ab. Es sollte eigentlich einen text von der Standardeingabe in Großbuchstabe umwandeln.

Bitte um Hilfe.

Gruß
Gisa
Auf diesen Beitrag antworten »
Tobias

Wenn sich die Console geöffnet hat musst du den Text eintippen und Enter drücken.
Auf diesen Beitrag antworten »
Gisa

das hatte ich versucht.
Ich kann nix eingeben. Es wird zwar geöffnet aber ich kann nix eintippen.
Was mach ich falsch?

Grüße
Gisa
Auf diesen Beitrag antworten »
Tobias

Ich sehe gerade, dass du in deiner Main-Funktion garkeine Schleife zum einlesen definiert hast. Also veränder mal deine main-Funktion:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:

int main(void) {

    int token;

    while ((token = yylex()) != EOF) {

      [...]

    }
    	
    exit(0);
}
Auf diesen Beitrag antworten »
Gisa

passt. jetzt klappts
eine for schleife zu der while schleife :-).

Danke dir und viele Grüße
Gisa

jetzt kann ich was eingeben und test wandelt die kleinbuchstaben ind großbuchstaben um. :-)
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »