Question

Je dois écrire un compilateur. Il est des devoirs à l'univ. Le professeur nous a dit que nous pouvons utiliser une API que nous voulons faire l'analyse syntaxique du code, tant qu'il est bon. De cette façon, nous pouvons nous concentrer davantage sur la machine virtuelle Java, nous allons générer.

Alors oui, je vais écrire un compilateur Java pour générer Java.

Connaissez-vous une bonne API pour cela? Dois-je utiliser regex? Je vous écris normalement mes propres parseurs à la main, mais il ne convient pas dans ce scénario.

Toute aide serait appréciée.

Était-ce utile?

La solution

Regex est bon d'utiliser dans un compilateur, mais seulement pour reconnaître les jetons (à savoir pas de structures récursives).

La façon classique de l'écriture d'un compilateur est d'avoir un analyseur lexical pour la reconnaissance de jetons, un analyseur de syntaxe pour la structure reconnaître, un analyseur sémantique pour la reconnaissance de sens, un générateur de code intermédiaire , optimiseur , et durer un code cible générateur . Tout de ces étapes peuvent être fusionnées, ou supprimée, si le compilateur rend plus facile à écrire.

Il y a eu de nombreux outils développés pour aider à ce processus. Pour Java, vous pouvez regarder

Autres conseils

Je recommande ANTLR , principalement en raison de ses capacités de génération de sortie via StringTemplate.

Qu'est-ce mieux est que livre de Terence Parr sur le même est par loin l'un des meilleurs livres orientés vers les compilateurs d'écriture avec un générateur d'analyseur syntaxique.

Ensuite, vous avez ANTLRWorks qui vous permet d'étudier et déboguer votre grammaire à la volée.

Pour couronner le tout, le ANTLR wiki + documentation , (bien que pas assez complet à mon goût), est un bon endroit pour commencer pour tout débutant. Il m'a aidé à rafraîchir les connaissances sur l'écriture du compilateur dans une semaine.

Jetez un oeil à JavaCC , un analyseur de langage pour Java. Il est très facile à utiliser et obtenir le blocage de

Aller classique - Lex + Yacc. En Java, il précise JAX et javacc . Javacc a même certains Java Grammaires prêt pour l'inspection.

Je vous recommande d'utiliser soit un metacompiler comme ANTLR , ou un simple analyseur Combinator bibliothèque . Java fonctionnelle a analyseur API Combinator . Il y a aussi JParsec . Ces deux sont basées sur la bibliothèque parsec Haskell.

JFlex est un générateur de balayage qui, en fonction de la manuel, est conçu pour fonctionner avec le générateur d'analyseur CUP .

  

L'un des principaux objectifs de conception de JFlex était de faire l'interface avec le générateur d'analyseur gratuit Java CUP aussi facile que possible [sic].

Il a également support byacc / J , qui, comme son nom l'indique, est un port de Berkeley YACC pour générer du code Java.

Je l'ai utilisé JFlex lui-même et aimé. Howeveer, le projet que je faisais était assez simple que j'ai écrit l'analyseur à la main, donc je ne sais pas à quel point soit CUP ou byacc / J est.

Je l'ai utilisé SableCC dans mon cours de compilation, mais pas par choix.

Je me souviens trouver très encombrant et lourd, plus l'accent sur la propreté de la commodité. (Pas de précédent ou quoi que ce soit l'opérateur, vous devez indiquer que dans la grammaire)

Je veux probablement utiliser quelque chose d'autre si j'avais le choix. Mes expériences avec YACC (C) et heureux (pour Haskell) ont tous deux été agréable.

Parser combinateurs est un bon choix. Populaire implémentation Java est JParsec.

Si vous allez aller hardcore, jeter un peu de http://llvm.org dans le mélanger:)

Je vous suggère de regarder à la source pour BeanShell. Il a un compilateur pour Java et est assez simple à lire.

Utilisez un combinateur analyseur, comme JParsec . Il y a un bon tutoriel vidéo sur la façon de l'utiliser .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top