2017-09-06 2 views
0

Cette post about the antlr simple example montre comment créer et nous une grammaire pour Java. Cependant, ceci entremêle la grammaire et le code source Java dans la source Exp.g. Ma question est, est-il possible de découpler le fichier de grammaire de la langue cible, de sorte que le fichier de grammaire unique peut être utilisé pour générer plusieurs Lexers/Parsers Java, Scala, C++, etc?Antlr pour la génération de plusieurs langues

+0

En général, la grammaire .g est en effet découplée de la langue cible, ce qui semble être le cas avec cette Exp.g. Il y a par exemple des cibles pour C#: https://github.com/tunnelvisionlabs/antlr4cs, ou C++: http://www.soft-gems.net/index.php/tools/49-the-antlr4-c-target -est là . Rédaction d'une cible au-delà de Java est au-delà du projet ANTLR lui-même, je crois –

+0

@SimonMourier - Je pense que vous interprétez mal la question. La référence Exp.g d est entremêlée avec Java. C'est ça, que j'essaie d'éviter. – NWS

Répondre

1

Cela dépend principalement de la raison pour laquelle le code cible est utilisé dans la grammaire. Est-ce seulement du code d'action de faire quelque chose avec les jetons trouvés (par exemple construire une table de symboles ou une représentation d'arbre alternative) alors il n'y a aucun problème à supprimer ce code natif et à le faire ensuite.

Cependant, les prédicats sont différents. Ils sont utilisés pour guider l'analyseur et nécessitent également du code natif. Ce que vous pouvez faire est de déplacer tout le code natif dans une classe de base dont dérive l'analyseur généré. Il vous suffit ensuite de réécrire cette classe de base dans votre langue cible et de garder la grammaire libre de tout code natif (sauf pour un appel de fonction unique, qui appelle le code natif). Cette approche présente l'avantage de ne nécessiter aucune référence de bibliothèque supplémentaire (#include en C/C++, importation dans d'autres langages), qui est également un code natif empêchant l'utilisation de plusieurs cibles.