![]() |
Re: Automaten in Source Code
Zitat:
Die Festlegung der Übergänge für einen bestimmten Zustand kann dabei vom Automaten selbst, oder aber auch von außen gesteuert werden - je nach belieben. Notwendig dafür sind weder Tabellen, noch unübersichtliche case-Strukturen. Was will man mehr? ;) greetz Mike |
Re: Automaten in Source Code
Nein, ich hatte das nicht so gemeint.
Du hast doch mitbekommen, dass es hier eine philosophische Diskussion über die OO-Lösung gab (und DIE ist nocht nicht gelöst). In meinen Augen, ist deine Lösung äquivalent zu meiner (wenn ich davon ausgehe, deinen Code richtig verstanden zu haben) (also der "Zustandsbaum"-Lösung, die den Graph KOMPLETT aufbaut) |
Re: Automaten in Source Code
Zitat:
Wenn dir dabei unnötig viele Instanzen erzeugt werden, kann ich dich sogar verstehen. Eine bereits genannte Lösung wäre Singletons. Gäbe dann allerdings bei verarbeitenden Automaten und Multi-Threading Probleme. Also führe ich wie JasonDX einen Owner ein:
Delphi-Quellcode:
Der große Unterschied? Mein Owner hat keine Ahnung, welche Klassen er enthält, er ist effektiv ein TDictionary<TStateClass, TState>, ein dummer Cache. Und hält so meine beiden Regeln ein.
function TZustand1.GetNextState(const aToken : Char): TState;
begin case aToken of ... '0'..'9': begin ... Result := Owner.GetOrCreate(TZustand2); end; end; end; So, das war jetzt die simpelste Lösung, die ich mir vorstellen kann. JasonDX' Code ist mir ehrlich gesagt zu komplex, da nehme ich doch lieber wieder Tabellen in prozeduralem Code ;) . Zitat:
|
Re: Automaten in Source Code
Zitat:
Zuallererst würde ich die Sprache auf jeden Fall in EBNF fassen - schon allein, um eine prägnante, von der Implementierung unabhängige Definition zu haben. Jetzt kommt es drauf an: Wenn die Grammatik nicht zu komplex und vor allem LL(1) ist, geht meine Stimme an einen ![]() Erstmal brauchen wir eine halbwegs taugliche Repräsentation des Inputs:
Delphi-Quellcode:
Eine Grammatik für deine Dateien könnte etwa so aussehen:
type TTokenStream = class
public property Current : Char read; property Eof : Boolean read; procedure MoveNext; procedure Expect(aToken : Char); // MoveNext, falls Current = aToken, sonst Exception end;
Code:
Diese werden dann in rekursive Funktionen umgeformt:
lines = line, [ newline, lines ] ;
line = comment | constant | entry ; comment = "//", { symbol } ; constant = identifier, "=", { symbol - ";" }, ";" ; ...
Delphi-Quellcode:
Keine Ahnung, ob das jetzt nachvollziehbar war, das Ergebnis finde ich aber äußerst übersichtlich. Wie gesagt entspricht es der OOP-Variante: Jede Funktion ist unabhängig und kennt nur ihre Teilfunktionen, ein Aufruf der Startfunktion bringt alles ins Rollen.
function TFile Lines(aStream : TTokenStream);
begin Result := TFile.Create; repeat if not Comment(aStream) then begin var constant := Constant(aStream); if Assigned(constant) then Result.AddConstant(constant) else begin var entry := Entry(aStream); Assert(Assigned(entry)); Result.AddEntry(entry); end; end; if not aStream.Eof then Assert(Newline(aStream)); until aStream.Eof; end; function Boolean Comment(aStream : TTokenStream); begin Result := aStream.Current = '/'; if Result then begin aStream.Expect('/'); while not Newline(aStream) do; end; end; function TConstant Constant(aStream : TTokenStream); begin var name : String := Identifier(aStream); if not Assigned(identifier) then Exit(nil); var constant := TConstant.Create; constant.Name := name; aStream.Expect('='); constant.Value := ''; while aStream.Current <> ';' do begin constant.Value += aStream.Current; aStream.MoveNext; end; aStream.Expect(';'); end; . . . Wir haben uns damit zwar etwas von Automaten wegbewegt, was ich aber wirklich nicht schade finde: BNF kann einfach viele winzige Zustände in eine zusammenhängende Regel fassen, bei der Umsetzung in rekursive Funktionen können es sogar noch weniger werden. Man rückt von einzelnen Zeichen ab und denkt in größeren Blöcken. Was aber, wenn die Sprache doch etwas zu komplex ist? Dann gibt es imo keine Ausrede mehr, nicht gleich zu einem Parser-Generator zu greifen: Zitat:
|
Re: Automaten in Source Code
:thumb:
Danke, ich werde mir das die Tage mal zu Gemüte führen und dann sehen, ob ich die Klasse nicht entsprechend anpassen kann. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz