HSG

Aktuelle Seite: HSG/Fächer/Informatik/Compiler/Parser

Erstes kleines Projekt mit dyacc

Vorbereitungen

Achtung: Links passen nicht mehr (spr).

  • von der Seite dyacclex das passende Archiv herunterladen und entpacken, es entsteht das Verzeichnis dyacclex-1.4
  • von der Seite dyacclex das Archiv gnumake-win32.zip herunterladen und entpacken, es entsteht die Datei make.exe
  • die Datei make.exe in das Verzeichnis dyacclex-1.4 kopieren (es gibt dort eine Datei makefile), make starten (z.B. Doppelklick), sofern der Delphi-Compiler dcc32 vorhanden ist, entstehen in den Verzeichnissen /src/lex und /src/yacc die Dateien dlex.exe und dyacc.exe
  • von der Seite www.musikwissenschaft.uni-mainz.de/~ag/tply die Datei Glyd_2_0.zip herunterladen und in ein Verzeichnis z.B. Glyd entpacken
  • die Dateien, die man zum Arbeiten braucht, sind dlex.exe, dyaxx.exe, yylex.cod, yyparse.cod, zum Arbeiten mit einer GUI noch Glyd 2.0.exe (besser umbenennen in Glyd20.exe), diese Dateien in ein Arbeitsverzeichniss z.B. work kopieren, Glyd erwartet die Namen lex.exe und yacc.exe, also dlex und dyacc umbenennen
Miniprojekt

Die Sprache pieps soll nur das Schlüsselwort 'p' und das Token 'zahl' (digit+) enthalten. Whitespaces sind erlaubt. Entstehen soll ein Delphi-Programm, das z.B. die Eingaben ' p  4 ' oder 'p4    P 2  ' versteht und viermal bzw. sechsmal piepst.

Mit Glyd kann man die Dateien piepslex.l und pieps.y erstellen (die Suffixe muss man angeben). und mit lex und yacc zu piepslex.pas und pieps.pas übersetzen.

piepslex.l

%%

[0-9]+      begin
              val(yytext,yylval,code);
              return(NUM);
            end;
[pP]        return(P);
[ \n\t]+    ; { Whitespaces überlesen }
.           yyerror('unerlaubtes Zeichen!');

Die regulären Ausdrücke werden von oben nach unten bearbeitet. Insbesondere fängt der Ausdruck . alle Zeichen (außer \n) ab, die vorher nicht verarbeitet werden konnten.

pieps.y
%{
unit pieps;

interface

uses
  SysUtils, dlib, YaccLib, LexLib, windows;

%}

%token NUM P

%%

satz  : satz wort
      |
      ;
wort  : P NUM
             { for i := 1 to $2 do windows.beep(440,200); }
      ;

%%

var
  code : integer; // mk

{$I piepslex.pas}

end.
Delphi-Projekt

GUI work.zip enthält das Pieps-Projekt und alle sonst noch notwendigen Dateien

Aufgabe 1

Übertrage das Beispiel Yacc Practice, Part I von Tom Niemann auf Delphi/dlex/dyacc. Am Ende soll das Vorgehen möglichst nahe am Originaltext in deutsch und englisch dokumentiert werden. Natürlich werden wir uns auf das Original beziehen. Bei Fragen zu C ruhig den Lehrer einbeziehen. In Delphi gibt es zu printf eine Entsprechung. Was bedeutet insbesondere 'This example still has an ambiguous grammar.'? Beispiel?

Lösung: practise1.zip in work auspacken!

Aufgabe 2

Übertrage analog das Beispiel Yacc Practice, Part II von Tom Niemann auf Delphi/dlex/dyacc.

Lösung: practise2.zip in work auspacken!

Aufgabe 3

In unserem MiniLogo stellt sich das Problem, dass hinter fd eine real-Zahl und hinter rp eine integer-Zahl folgen soll. Wie soll man das unterscheiden? Lies dazu auf S.28 des Manuals den Abschnitt 4.6 Start Conditions.

GUI zu minilogo1

Aufgabe 4

GUI zu minilogo2

Links