3 Stimmen

Rückwärtsingenieurwesen einer Programmiersprache oder 'Unüberwachtes Lernen von Sprachen'

Ich muss einen "Übersetzer" (ist der Begriff Cross-Compiler richtig?) zwischen Tradestations EasyLanguage und C++ erstellen. Allerdings gibt es keine vollständige Dokumentation über die Grammatik von EasyLanguage (zumindest keine, die ich finden konnte).

Als allgemeinere Frage, besteht die Möglichkeit, anhand einer Reihe von gültigen Programmen in einer Sprache 'A' die Grammatik für 'A' zu erkennen, selbst wenn wir (oder auch wenn wir nicht) von der Existenz bestimmter grundlegender Tokens wie 'if', 'else' und reservierte Wörter wissen, oder handelt es sich dabei um eine dieser ungelösten, fälligkeitsabhängigen (schwierigen?) Fragen.

Gibt es irgendwelche nützlichen Tools, die ich verwenden kann, um anzufangen?

5voto

Ira Baxter Punkte 91118

Die einfache Antwort lautet "Nein".

Jede Art von Verallgemeinerung aus Beispielen leidet unter der grundlegenden Tatsache, dass es sich um Schätzung handelt. Du könntest schätzen, dass die Sprache ein 'if'-Token hat. Es gibt keine Garantie, dass dies der Fall ist, oder dass es if heißt oder dass es eine Semantik hat, die du verstehst. Du wirst kein automatisiertes Tool bekommen, um die Grammatik für dich abzuleiten.

Am besten ist es, alle verfügbaren Dokumente zur Beschreibung der Sprache zu nehmen und dann eine Grammatik zu schätzen. Dann baust du einen Parser für die Grammatik und validierst sie anhand einer möglichst großen Code-Basis und überarbeitest sie. Das habe ich schon dutzende Male mit einer Vielzahl von Sprachen gemacht (siehe mein Bio).

Es ist schmerzhaft, aber oft kommst du an einen ziemlich nützlichen Ort. Die gute Nachricht ist, dass dein Parser nichts analysieren muss, was die Benutzer nicht schreiben können. Die schlechte Nachricht ist, dass sie Dinge schreiben werden, basierend auf einem obskuren Beispiel, das du noch nie gesehen hast, oder mit einem Tippfehler, der zufällig funktioniert. (Selbst der Sprachdesigner hat es nicht beabsichtigt, aber das ist dem Benutzer egal; sein Programm funktioniert und dein Compiler nicht. Dein Problem per Definition).

Was du nie herausfinden wirst, ist, ob der Anbieter der Sprache bestimmte Funktionen hat, die er einfach nicht dokumentiert hat und niemand anderem gezeigt hat. Sei ständig darauf vorbereitet, überrascht zu werden, auch lange nachdem du fertig bist :-{

Das beste Tool, das du meiner Meinung nach für diesen Prozess verwenden kannst, ist ein GLR Parser-Generator; das ist das, was meine Firma verwendet. Diese werden jede kontextfreie Sprache (die du vorschlagen könntest) parsen, ohne sich sehr darum bemühen zu müssen, die Grammatik so zu verbiegen, dass sie zu den anderen gängigen Einschränkungen von rekursivem Abstieg, LL(k)- oder LR(k)-Parsen passt. Das Leben ist schon schwer genug, um die Grammatik zu erraten, geschweige denn zu erraten, wie man sie verbiegt, um sie korrekt vom Parser-Generator schlucken zu lassen.

Du hast auch das Problem, einmal du die Grammatik richtig hast, einen Übersetzer zu bauen. Du könntest diese SO-Antwort hilfreich finden: Welche Arten von Mustern könnte ich im Code erzwingen, um die Übersetzung in eine andere Programmiersprache zu erleichtern?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X