Entwicklung & Design

Entwickeln domänenspezifischer Sprachen mit Ruby: Auf dem Weg zur nächsten Programmiersprache

Seite 4 / 5

Evaluator
class SimpleEval < Dhaka::Evaluator
	self.grammar = SimpleGrammar
	define_evaluation_rules do
		for_start { eval(evaluate(child_nodes[0])) }
		for_operation {  evaluate(child_nodes[2]) +   child_nodes[1].token.value + 
			evaluate(child_nodes[3]) }
		for_integer { child_nodes[0].token.value.to_s }
end

Listing 4

Listing 4 lässt gut erkennen, wie dies funktioniert. Zunächst wird im Evaluator mittels einer Klassenvariable definiert, dass die zuvor erstellte Grammatik als Grundlage für die Auswertung verwendet werden soll. Im Anschluss daran werden die notwendigen Hooks installiert, wobei es nur zwei Dinge zu beachten gibt: Hooks können nicht für die eigentliche Regel, sondern nur für Produktionen definiert werden und für jedes Terminalsymbol muss immer ein Hook definiert werden. Damit die Mathematik wieder stimmt, können nun Lexer und Parser zusammen mit dem gerade entstandenen Evaluator aufgerufen werden, sodass „(+ (- 10 2) 1)“ den Wert 9 ergibt.

Ausführen des Beispiels
lexer = Dhaka::Lexer.new(SimpleLexer)
parser = Dhaka::Parser.new(SimpleGrammar)
puts SimpleEval.new.evaluate( parser.parse(lexer.lex("(+ (- 10 2) 1)")) )

Listing 5

Ist das schon alles?

Natürlich ist das hier gezeigte Beispiel recht einfach und übersichtlich, doch zeigt es, wie schnell man eine eigene Programmiersprache entwickeln kann. Die Möglichkeiten, die eine externe DSL dem Entwickler bietet, sind nahezu unbegrenzt. Man sollte sich jedoch nicht verleiten lassen, für jeden Spezialfall eine DSL zu schreiben, denn wenn zusätzlich zum eigentlichen Applikationscode noch ein weiteres Projekt gewartet werden muss, kann dies die Kosten für die Softwareentwicklung steigern. Auf der anderen Seite kann eine DSL die nötige Flexibilität bieten, um schneller zum Ziel zu kommen beziehungsweise spezielle Anwendungsgebiete überhaupt abdecken zu können.

Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Schreib den ersten Kommentar!

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.