Welche Möglichkeiten gibt es, eine Sprachgrammatik für einen neuen Hauptmodus zu schreiben?

7

Ich schreibe einen Hauptmodus für eine Programmiersprache mit einer genau definierten Grammatik: Sie hat eine BNF, die in einigen glücklichen Dateien formalisiert ist .

Ich möchte das BNF nicht besonders als eine Reihe von Vorwärts- / Rückwärts-Regex-Scans erneut implementieren (wie es viele Hauptmodi tun), obwohl ich nicht dagegen wäre, es entweder manuell oder automatisch zu übersetzen.

Mir ist SMIE bekannt. Gibt es in Emacs lisp noch andere Optionen, mit denen ich die Grammatik der Sprache definieren und so viel wie möglich automatisch generieren kann, z. B. Gesichter, Sexp-Befehle, Imenu-Population?

Ich befasse mich hauptsächlich mit der Einfachheit und Korrektheit des Modus und nicht mit seiner rohen Leistung, aber ich würde sicherlich gerne eine ungefähre Vorstellung davon haben, was die Kompromisse sind (offensichtlich wäre es unbrauchbar und unbrauchbar, wenn die Leistung zu niedrig wäre daher nicht geeignet zu verwenden).

Dies hängt etwas mit dem Schreiben eines Hauptmodus zusammen, obwohl es weiter fortgeschritten ist, da mir bereits alles unter "Hauptmodi" im Emacs Lisp-Handbuch bekannt ist.

UPDATE : Ich habe mit dem Autor von Semantic studiert und gesprochen und es ist nicht in der Lage, das font-locks zu generieren . Es zielt eher darauf ab, übergeordnete Tools bereitzustellen, und es ist nicht etwas, wonach ich suche.

Fommil
quelle
1
Ich würde mich für CEDET / Wisent entscheiden, aber ich habe es nicht selbst gemacht. Siehe cedet.sourceforge.net/addlang.shtml
Stefan Kamphausen
CEDET sah für mich ziemlich unbeaufsichtigt aus, aber der Parser klang cool.
am
1
Zumindest der Parser-Teil von CEDET ist jetzt Teil von Emacs. Siehe gnu.org/software/emacs/manual/html_node/semantic/index.html#Top
Stefan Kamphausen
2
CEDET ist Teil von Emacs, aber das bedeutet nicht, dass es beibehalten wird, siehe Bug # 23792 .
Npostavs
Ich habe jetzt die semantischen / weisen Handbücher von Anfang bis Ende gelesen und glaube nicht, dass es mir hilft, das Schreiben einer Engine zum Sperren oder Einrücken von Schriftarten zu vermeiden. Der Lexer hängt immer noch von Syntaxtabellen ab. Es hat viele High-Level-Funktionen, die mich nicht interessieren (ich glaube nicht, dass sie für meine Sprache zufriedenstellend funktionieren oder skalieren), aber es scheint eine Lücke im Low-Level-Bereich zu geben. Vermisse ich etwas @StefanKamphausen
fommil

Antworten:

4

Neben dem SMIE-Paket (das zwar eine BNF-Grammatik verwenden kann, aber normalerweise nicht gut mit einer BNF-Grammatik funktioniert, die für den üblichen Parser im LALR-Stil entwickelt wurde) gibt es das wisiPaket von GNU ELPA ( http: //elpa.gnu) .org / packages / wisi.html ):

Das wisi-Paket bietet Dienstprogramme für die Verwendung verallgemeinerter LALR-Parser zum Einrücken, Schriftstellen und Navigieren. Ein Beispiel für die Verwendung finden Sie im ada-Modus.

Ich habe keine Erfahrung damit und kenne kein anderes Paket als den Ada-Modus, der es verwendet, aber der Ada-Modus ist sehr nützlich, daher lohnt es sich, einen Blick darauf zu werfen. Ich würde auch erwarten, dass der Autor Ihnen gerne dabei hilft, davon Gebrauch zu machen.

Stefan
quelle
das sieht irgendwie cool aus, obwohl es sehr eng damit verbunden ist ada-modeund ich nicht sicher bin, wie verallgemeinerbar es ist. Eine Sorge, die ich äußern würde, ist, dass der zugrunde liegende Parser, der von Semantic weise ist, häufig eine vollständige Dateianalyse durchführt und nicht lokalisiert ist und nicht besonders robust gegenüber Syntaxfehlern ist, so dass dies zu einer enormen Perf-Regression führen kann. Ich denke, man würde einen Proof of Concept brauchen, um zu sehen, da es keine eindeutigen Antworten gibt.
am