2016-04-01 17 views
0

Ich versuche, eine Fsm zu implementieren und es geht gut. Ich kann Zeichenfolgen eingeben und sehen, ob sie gültig sind und all diese Dinge.Finite-State-Maschinen, wie minimale und maximale Treffer zu implementieren

Allerdings haben reguläre Ausdrücke (die fms sind) diese Eigenschaft, wo Sie angeben können, wie oft ein bestimmtes Zeichen auftreten kann, zB würde {2,4} "aa" und "aaa" akzeptieren, aber nicht "aaaaa" und "a"

Ich kann mir vorstellen, einen Zähler an Kanten, die zählen, wie oft sie getroffen wurden und dies verwenden, um irgendwelche Zeichen zu verweigern, nachdem der Zähler eine bestimmte Anzahl erreicht hat, aber Sie können nicht implementieren, weil es würde immer das erste Zeichen blockieren (außer Minimum ist 0).

Kennt jemand eine Möglichkeit, diese Funktion zu implementieren? es muss auch für wirklich große Zahlen wie ein {1.99999999999}

+0

Möchten Sie erklären, was die Beziehung zwischen endlichen Automaten und regulären Ausdrücken ist, und uns Code zeigen? –

+0

@andrea Reguläre Ausdrücke sind endliche Automaten –

+0

Oh jetzt ist es klar ... Ich schätze, dass ich nicht ein Experte auf dem Thema sein könnte, aber wenn Sie das Problem klarer erklären möchten, können Sie anderen helfen, das Thema zu verstehen und ziehen die Aufmerksamkeit und Hilfe von mehr Leuten an. –

Antwort

0

arbeiten Zu meinem Verständnis, diese Art von Einschränkung kann nicht dynamisch in einer endlichen Zustandsmaschine implementiert werden; Teile der FSM müssten statisch erweitert werden. In Ihrem Beispiel müssten für a{2,3} drei verschiedene separate FSMs erstellt werden, von denen einer aa akzeptiert, der zweite aaa akzeptiert und der dritte aaaa akzeptiert; diese müssten dann in der finalen FSM über einige leere Übergänge zu Alternativen gemacht werden. Der Grund dafür ist, dass die FSM selbst nicht den Pfad speichert, mit dem ihr aktueller Zustand erreicht wurde, so dass eine parametrisierte Form des Musters a{i,j} nicht überprüft werden kann.

+0

bedeutet das, dass, wenn ich einen regulären Ausdruck wie ein {1.999999999} mache, dann viele fms gemacht werden? klingt ulikely zu mir –

+0

Ich teile deine Skepsis hier; Ich bin mir jedoch nicht sicher, ob Implementierungen von Engines für reguläre Ausdrücke FSMs alleine verwenden. Wenn ich mich nicht irre, passt der Begriff der regulären Ausdrücke, der typischerweise in Einführungskursen der Informatik präsentiert wird, nicht genau zu den regulären Ausdrücken, die normalerweise implementiert werden. – Codor

+0

ich fühle mich wie es ist eine elegent Lösung als nur eine ganze Menge von fmsms –