Ich habe vor kurzem begonnen, meine erste Programmiersprache zu entwickeln, und da ich bereits fließend Java beherrsche, habe ich angefangen, die AST API für meine Sprache in Java zu erstellen. Ich plane auf Java-Byte-Code zu kompilieren, und das ist funktional und funktioniert im aktuellen Teil des AST, den ich implementiert habe. Ich habe ein paar verschiedene Methoden des Parsens ausprobiert (das alles ist fehlgeschlagen), bevor ich auf Parsergeneratoren gestoßen bin, insbesondere auf JavaCC. Ich habe einige grundlegende Nachforschungen zu JavaCC und EBNF durchgeführt und mich gefragt, ob JavaCC eine vollständig benutzerdefinierte AST-API (einschließlich Konstruktorargumente und Ähnliches) beim Parsen meiner Sprache unterstützen könnte. Ich wollte das hier fragen, bevor ich eine gründliche Recherche mache und Tutorials über JavaCC lese/lese. Von dem, was ich gesehen habe, kann JavaCC ASTs unterstützen, aber ich bin nicht sicher, was die Einschränkungen sind. Außerdem weiß ich, dass JavaCC seine eigene AST-API hat, aber ich möchte mich an die von mir entwickelte Version halten, da sie funktioniert und meiner Sprache gut entspricht.Benutzerdefinierte AST in JavaCC?
2
A
Antwort
4
Absolut. Zum Beispiel können Sie nonterminals wie diese
CommandNode whileCommand() : {
ExpressionNode e ;
CommandNode doPart ;
} {
<WHILE> e = expression() <DO>
doPart = sequence() <ENDWHILE>
{ return new WhileCommand(e, doPart) ; }
}
Die Erbauer schreiben kann nützlich sein, den Parser von einigen der Details des AST zu isolieren.
Super! Vielen Dank. Was ist mit Lookahead-Sachen? Wie gesagt, ich bin bei einem Annotation Node angekommen, aber der Annotation Node ist ein Parameter des nächsten Field/Method Node, ist das möglich? –
Ich bin mir nicht sicher, ob ich die neue Frage verstehe, die Sie stellen. Ich werde versuchen, es trotzdem zu beantworten: Während des Lookaheads werden keine semantischen Aktionen ausgeführt, so dass Sie Lookahead ganz ohne Interaktion mit Ihrem Baum verwenden können. Wenn das nicht beantwortet wird, könntest du es als neue Frage mit einem Beispiel veröffentlichen? –
Ich denke, eine bessere Frage wäre "gibt es globale Variablen", wie das, was ich will, damit erreicht werden kann. Unterstützt JavaCC also globale Variablen? –