![]() |
|||
| HSG |
|
Achtung: Links passen nicht mehr (spr).
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.
%%
[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.
%{
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.
work.zip enthält das Pieps-Projekt und alle sonst noch notwendigen Dateien
Ü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!
Übertrage analog das Beispiel Yacc Practice, Part II von Tom Niemann auf Delphi/dlex/dyacc.
Lösung: practise2.zip in work auspacken!
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.

