10
votes

Lexer / analyseur pour générer du code SCALA de la grammaire BNF

Je suis actuellement à la recherche d'un lexer / parseur qui génère du code SCALA à partir d'une grammaire BNF (un fichier ocamlyacc avec précision et associativité). Je suis assez confus depuis que je n'ai presque rien trouvé sur la façon de le faire.

Pour analyse, j'ai trouvé scala-bison (que j'ai beaucoup de difficulté à travailler avec). Tous les autres outils ne sont que des analyseurs Java importés dans Scala (comme antlr ).

Pour Lexing, je n'ai rien trouvé.

J'ai aussi trouvé les célèbres combinateurs d'analyseurs de scala, mais (corrigez-moi si je me trompe), même s'ils sont assez attrayants, ils consomment beaucoup de temps et de mémoire, principalement en raison de Backtracking .

J'ai donc deux questions principales:

  • Pourquoi les gens ne semblent que se concentrer sur des combinaisons _Parser?
  • Quelle est votre meilleure suggestion de générateur de lexer / parser à utiliser avec SCALA?

0 commentaires

3 Réponses :


3
votes

scala 2.8 a un analyseur de packrat. Je cite les documents de l'API ici:

Packrat analyse est une technique pour mettre en œuvre la rampe, analyseurs de descente récursive, avec le avantage qu'il garantit illimité Lookahead et une période d'analyse linéaire. En utilisant cette technique, laissé récursif Les grammates peuvent également être acceptées.


0 commentaires

8
votes

comme l'un des auteurs du papier de Scalabison, j'ai rencontré ce problème plusieurs fois. :-) Ce que je ferais habituellement pour la numérisation dans Scala est d'utiliser jflex . Cela fonctionne étonnamment bien avec Scalabison et tout notre point de vue a été fait en utilisant cette combinaison. L'inconvénient malheureux est qu'il génère des sources Java, et la compilation prend donc un peu de gymnastique. Je crois que John Boyland (l'auteur principal du papier) a mis au point un mode de sortie Scala Pour JFlex, mais je ne pense pas que cela ait été publiquement libéré. ​​

Pour mon propre développement, j'ai beaucoup travaillé avec des techniques d'analyse sans scanner. Les combinaisons d'analyseurs Packrat de Scala 2.8 sont assez bons, bien que toujours non généralisées. J'ai construit une bibliothèque expérimentale qui implémente une analyse généralisée dans le cadre de combinaisons d'analyseurs. Ses limites asymptotiques sont beaucoup meilleures que les combinaisons d'analyseurs traditionnels, mais dans la pratique, les frais généraux constants sont plus élevés (je travaille toujours dessus).


2 commentaires

Merci pour la réponse et vos combinaisons GLL, je vais essayer de comprendre comment ça marche :) Mais je pense que je vais essayer de jouer avec Jflex et Scala ensemble.


Grâce à tout beaucoup de tutoriel (y compris une partie de la titunie sur Codecommit), j'ai finalement réussi à faire un simple lexer / analyseur avec des combinaisons d'analyseurs et sans trop de récursions .. Merci encore!



3
votes

Je sais que cette question est ancienne, mais pour ceux qui sont toujours à la recherche d'un générateur lexer qui génèrent du code Scala, j'ai écrit une fourchette de jflex qui émet un scala plutôt que Java, y compris des plug-ins de Maven et SBT correspondants. Tous sont maintenant disponibles sur Maven Central.

Nous l'utilisons actuellement (y compris les plug-ins maven / sbt) pour jetons textuels anglais dans le cadre de la pipline de traitement de langue naturelle dans Factorie - Exemple de fichier .flex contenant scala ici .


2 commentaires

C'est génial. J'avais publié Jflex 1.5 + échelle github.com/moy/jflex/relases , mais il semble que votre est plus à jour, aussi plus facile à trouver.


@Johntantangboyland J'aimerais avoir trouvé votre version avant d'écrire la mienne!