Rüdiger Plantiko

Zurück
Die Sprache OMeta bietet viele interessante Features. Eines davon ist die Möglichkeit, bereits bestehende Parser zu nutzen. Für eine OMeta-Implementierung muss immer auch ein Parser der einbettenden Sprache vorhanden sein. In OMeta/JS ist das die Sprache JavaScript, verkörpert durch die Grammatik BSJSParser. Wenn man nun eine eigene Sprache in JavaScript einbetten möchte, kann man dies mit der sogenannten Foreign Rule Invocation erreichen. Darunter ist eine spezielle vordefinierte OMeta-Regel zu verstehen, mit der die Regel einer anderen OMeta-Grammatik abgerufen kann.

Des weiteren gibt es wie bei herkömmlichen objektorientierten Sprachen ein Vererbungskonzept. Grammatiken können mit dem speziellen Symbol <: von anderen Grammatiken abgeleitet werden, so dass alle Regeln dieser "Super-Grammatik" in der neu definierten Grammatik zur Verfügung stehen - und bei Bedarf auch redefiniert werden können. Dabei ist mit dem Diamond-Operator ^ ein Aufruf der Regel in der übergeordneten Grammatik möglich.

So wird es leicht möglich, Hybridsprachen herzustellen, zum Beispiel den Mix einer bestehenden Sprache mit anderen, neuen Konstrukten.

Hier ein Beispiel:

ometa Sample <: Parser {
  top = "foo" -> "bar"
  }

ometa ModifiedJavaScript <: BSJSParser { primExpr = foreign( Sample, "top" ) | ^primExpr }

Die Grammatik Sample hat nur eine einzige, billige Regel, die das Vorkommen der Zeichenfolge foo erkennt und in diesem Fall die Zeichenfolge bar zurückliefert. Diese Grammatik wird nun in eine neue Grammatik ModifiedJavaScript eingemischt, wobei die Regel zur Erkennung von primären Ausdrücken redefiniert wird: Wenn ein Ausdruck erkannt wird, der der Regel top der Grammatik Sample genügt, so wird dieser zurückgeliefert. Wenn nicht, geht es mit der normalen Erkennung von primären Ausdrücken von JavaScript weiter. (Das Short Circuiting mag manchen ungewohnt erscheinen, liegt aber daran, dass Ometa eine Parsing Expression Grammar (PEG) ist, in der die Alternierung | so funktioniert wie bei gewöhnlichen Programmiersprachen: indem sie beim ersten gefundenen Match terminiert).

Die dadurch definierte Sprache funktioniert genauso wie JavaScript, mit dem einen Unterschied, dass das Symbol foo stets durch bar ersetzt wird. Ein Ausdruck wie

foo+"t"
wird demnach durch die Sprache ModifiedJavaScript in folgenden Parse Tree gewandelt:
[binop, +, bar, [string, t]]
Veröffentlicht: Donnerstag, den 25. August 2011