Frage

Ich versuche, eine Inselgrammatik mit Rascal MPL , aber ich rannte in eine Problem:

Bei der Umsetzung einer Inselgrammatik in SDF ist ein sehr häufiger Ansatz die Definition einer "Catch-All-Water-Produktion mit dem Attribut {vermeiden}. Dies verhindert, dass der Parser diese Produktion verwendet, wenn andere anwendbar sind. Dadurch kann ein -ausfallverhalten angeben angeben, das von anderen Produktionen überschrieben werden kann, die Whitout generieren können. Ein sehr einfaches Beispiel dafür wäre:

generasacodicetagpre.

Ich habe versucht, dieses Verhalten mit Rascal MPL zu reproduzieren. Mein Ziel ist es, eine Inselgrammatik zu schaffen, die alle bedingten Präprozessor-Richtlinien in einem Stück C / C ++ - Code sammelt und den Rest der Eingabe mit Wasserproduktionen überspringt.

generasacodicetagpre.

Ich habe versucht, den {Vermeiden} Effekt zu erstellen, indem er die Conditionaldirektive -produktion mit dem Bediener ">" eine höhere Priorität angibt, aber das funktioniert jedoch nicht anscheinend. Der Parse-Baum enthält immer noch Mehrdeutigkeiten.

generasacodicetagpre.

Wenn ich den obigen Code beispielsweise analysiere, bekomme ich einen Analysebaum, der wie folgt aussieht:

mehrdeude Parse-Baum

soweit ich von der Rascal Dokumentation mit dem "Priorität" -Operator ist möglicherweise nicht der Weg, in meinem Fall zu gehen, aber ich sehe keine anderen Möglichkeiten. Ich nehme davon aus, dass es jedoch einen Weg gibt, weil die Autoren von Rascal eindeutig angeben, dass jede SDF-Grammatik in eine Rascal-Grammatik umgewandelt werden kann.

Gibt es eine Möglichkeit, SDFS zu reproduzieren? {Vermeiden} Funktionalität mit Rascal MPL? Oder ist es möglich, den Parse-Wald irgendwie zu filtern, und die Prioritäten erneut anwenden?

War es hilfreich?

Lösung

Kurze Antwort: Vermeiden ist in SDF2 ein Post-Parse-Filter. In Rascal können Sie diese selbst definieren, siehe https://github.com/cwi-swat/rascal/blob/master/src/org/rascalmpl/library/lang/sdf2/filer/preferavoid.rsc für ein Beispiel, das nachahmt SDF2 Vermeiden Sie Verhalten, ohne Injektionsketten zu ignorieren, und ohne Zählen. Sie können es in Ihre Grammatik importieren und @Void- und @PREFER-Tags wie in SDF2 verwenden oder Ihre eigenen Filter schreiben.

Vorbehalt: Vermeiden war im Allgemeinen nicht genug, um Wasserverhalten in SDF2 zu definieren, und es ist auch nicht in Rascal. Der Grund ist, dass Wasser länger als seine Alternative werden kann. Bevorzugt und vermeiden kann nur zwischen Alternativen gleicher Länge in Bezug auf die Subventionslänge wählen. Eine Surfeife, aber langsamer Weg, um mit Wasser in Rascal umzugehen, ist es, es in jeder Alternative zu zählen und Ableitungen mit weniger Wasser zu wählen.

Ein anderes Problem mit Vorlieben und Vermeiden war, dass die Anwendungen störend beginnen würden, insbesondere wenn sie gezählt wurden. Dies kann in Rascal vermieden werden, indem Filter spezialisierte Filter für bestimmte Nonterminale oder sogar alternative Regeln.

Eine andere Option ist das Verwenden der \ und! Disammationsbetreiber. Siehe das Handbuch. Allerdings alle und alle Ich glaube, dass der Post-Parse-Filteroption derzeit der beste Weg ist, um mit Inselgrammern umzugehen, weil Sie das, was los ist, kontrolliert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top