Die Optionen zu einem beliebigen Punkt werden durch die Methoden bestimmt, die zu diesem Zeitpunkt in der Klasse verfügbar sind. Die von dieser Methode zurückgegebene Klasse bestimmt die nächste Gruppe von Methoden.
so die Regeln für die Grammatik, die die Kette erzeugt ein right regular grammar wo die Startsymbole Klassen sind, die Symbole sind Verfahren, und die nicht-Terminals sind die Klassen, die durch die Verfahren zurückgegeben:
class Car:
configure: Configurator
class Configurator:
with: Configurator // noise method
and: Configurator // noise method
wheels: int -> Configurator
windows: int -> WindowDetails
class WindowDetails:
transparent -> Configurator
tinted -> Configurator
ignorierend die Methode args (int):
Car -> "configure" Configurator
Configurator -> "with" Configurator
Configurator -> "and" Configurator
Configurator -> "wheels" Configurator
Configurator -> "windows" WindowDetails
WindowDetails -> "transparent" Configurator
WindowDetails -> "tinted" Configurator
aber, was diese zu erfassen versagt ist das Argument auf die Räder (die Anzahl der Räder). und eine regelmäßige Grammatik nicht umgehen kann, dass da verschiedene Integer-Argumente zu verschiedenen Klassen führen könnten (zB nach „(2)“ haben Sie einen Konfigurator oder einen WindowDetails haben?):
Configurator -> "wheels" Integer
Configurator -> "windows" Integer
Integer -> ?
so kommt es, was Sie wollen . Die Kette von Methoden kann durch eine reguläre Grammatik beschrieben werden. aber eine reguläre Grammatik kann auch nicht die Argumente beschreiben, die an die Methoden übergeben werden. Fehler.
Sie können Argumente behandeln, indem die Komplexität von kontextfreien Grammatiken Zugabe, denn dann können Sie so etwas wie tun:
Configurator -> "wheels" Integer Configurator
Configurator -> "windows" Integer WindowDetails
, die die zusätzlichen Informationen hat benötigt korrekt nach dem Integer-Argument, um fortzufahren.
HINWEIS: Das oben genannte Verfahren geht davon aus, dass Methodennamen in allen Klassen eindeutig sind. Wenn Sie zwei verschiedene Klassen mit demselben Methodennamen haben, dann werden Sie offensichtlich (hoffentlich) Probleme haben (und das ist vielleicht nicht so selten, wenn Sie Dinge wie "mit" und "und" verwenden ....)
Es sollte Eigenschaften in C# als Beispielsprache sein. – Dervall
In der Tat, mein Fehler. Ich vermisste die 'var' und nahm aufgrund der Fowler-Erwähnung Java an. BTW, nette Idee, dies aus CFGs zu generieren! –
Das ist zumindest die Idee, aber ich denke, wir müssen uns mit regulären Grammatiken begnügen, oder ich schreibe Buggy-Code. :) – Dervall