11
votes

F # Paysant des arbres de syntaxe abstraite

Quelle est la meilleure façon d'utiliser F # pour analyser une AST pour construire un interprète? Il existe de nombreux exemples F # pour la syntaxe triviale (opérations arithmatiques de base), mais je ne peux sembler trouver rien pour les langues avec des gammes de fonctionnalités beaucoup plus grandes.

Les syndicats discriminés semblent être incroyablement utiles, mais comment allez-vous en construire un avec un grand nombre d'options? Est-il préférable de définir les types (dites addition, soustraction, conditionnels, flux de contrôle) ailleurs et simplement les réunir en tant que types prédéfinis dans l'Union?

Ou avez-je oublié des moyens beaucoup plus efficaces d'écriture d'interprètes? A une fonction EVAL pour chaque type plus efficace ou peut-être utiliser des monades?

Merci d'avance


0 commentaires

6 Réponses :


2
votes

Je n'ai pas fait d'interprète moi-même. J'espère que ce qui suit aide :)

ici Course de compilateur SA enseigné à Yale avec ML, que vous pourriez trouver utile . Les notes de cours sont très concises (courtes) et informatives. Vous pouvez suivre les premières notes de cours et les missions. Comme vous connaissez F #, vous n'aurez pas de problème à lire des programmes ML.

BTW, le professeur était étudiant d'A. Appel, créateur de la mise en œuvre de SML. Donc, à partir de ces notes, vous obtenez également le le moyen le plus naturel d'écrire un compilateur / interprète en langue familiale ML.


0 commentaires

2
votes

Vous pouvez être intéressant pour vérifier le Lexing and Analysing section du F # Wikibook. F # Powerpack Library Contient les outils fslex et fsyACC , qui convient grandement avec cela. Le guide Wikibook est un bon moyen de commencer avec cela.

Au-delà de cela, vous devrez réfléchir à la manière dont vous souhaitez réellement exécuter le code de la forme AST, qui est courant la conception des compilateurs et des interprètes. Ceci est généralement considéré comme la plus facile toutefois et il existe de nombreuses ressources générales sur les compilateurs / interprète qui devraient fournir des informations à ce sujet.


0 commentaires

3
votes

Vous devriez prendre une copie de «Début F #» de Robert Pickering.

Le chapitre 13, "Texte d'analyse", contient un exemple avec fslex et FSYACC , comme suggéré par Noldorin.

Autre que cela, dans le même livre, le chapitre 12, l'auteur explique comment créer un compilateur simple pour une langue arithmétique qu'il propose. Très éclairant. La partie la plus importante est ce que vous recherchez: l'analyseur ast .

bonne chance.


1 commentaires

Ravi de voir les gens ont déjà commencé à lire à partir de F # :). Je dois souligner le chapitre 12 couvre également FPARSEC ( Quantitec.com/fparsec ), un analyseur monadique, Ceci est probablement maintenant mon préféré de créer des analyseurs dans F # car cela signifie que vous n'avez pas à utiliser des outils externes et une génération de code. Rob



13
votes

Les syndicats discriminés semblent être incroyablement utile mais comment allez-vous allez en construire un avec de gros Nombre d'options? Est-il préférable de Définir les types (dis ajoutant, Soustraction, conditionnels, contrôle flux) ailleurs et juste les apporter ensemble comme types prédéfinis dans le Union?

Je ne suis pas sûr de ce que vous demandez ici; Même avec un grand nombre d'options, DU est toujours simple à définir. Voir par exemple Cette entrée de blog pour une minuscule langue de la structure (ainsi que une discussion plus générale sur la transformation de l'arbre d'écriture). C'est bien d'avoir une durée d'accueil avec de nombreux autres cas, et des compilateurs / interprètes communs à utiliser une telle représentation.

Quant à l'analyse, je préfère les combinaisons d'analyseurs monadiques; Découvrez FPARSEC ou voir Cette ancienne entrée de blog . Après avoir utilisé de tels combinaisons d'analyseurs, je ne pourrai jamais revenir à quelque chose comme Lex / Yacc / Antlr - Les DSL externes semblent si primitifs en comparaison.

(éditer: les «minuscules exemples arithmétiques» que vous avez trouvés sont probablement presque représentatifs de quelles solutions plus grandes ressemblent également. Les exemples «jouets» montrent généralement la bonne architecture.)


1 commentaires

Le lien vers la vieille entrée de blog semble être brisé.



3
votes

I Deuxième suggestion de Brian à jeter un coup d'œil à la FPARSEC. Si vous êtes intéressé à faire des choses de la vieille école avec Fslex et FSYACC, un endroit pour rechercher comment analyser une langue non triviale est la source F #. Voir le Source \ FSHARP \ FSHARP.COMPILER dans la distribution.


0 commentaires

0
votes

C'est un excellent exemple d'une petite mise en œuvre de base complète avec F # et FPARSEC. Il comprend même le compilateur IL. L'ensemble du code est très accessible et accompagné d'une série de blogs de l'auteur à http://trelford.com/blog /


1 commentaires

Le lien vers une petite mise en œuvre de base est cassé. Je pense que c'est maintenant à github.com/ptrelford/smallbasicCompiler