2010-10-06 3 views
2

Est-il possible de créer un AST pour n'importe quel langage de programmation arbitraire ou IR en utilisant C ou C++ seul (sans l'aide d'outils comme YACC et LEX)?AST pour tout langage de programmation arbitraire ou IR

Si oui, comment implémenter l'analyse lexicale et syntaxique? Si ce n'est pas le cas, quels sont les outils qui doivent être augmentés en C ou C++ pour réussir à créer un AST? J'espère que j'ai fait mon doute clair. Si Ma question semble vague ou hors contexte, veuillez indiquer le besoin.

P.S: Je suis actuellement en train de créer l'AST pour le format .ll de la représentation IR du LLVM. Je sais que .ll est dérivé de AST. Mais j'essaie des pratiques d'analyse statique. Donc, je cherche à créer l'AST.

+1

Votre question est plutôt vague. Vous pouvez créer un programme qui crée une arborescence de syntaxe abstraite pour n'importe quel langage de programmation dans n'importe quel langage de programmation. Comment cela est fait exactement est un énorme domaine d'étude en informatique. –

+1

Bien sûr, c'est possible ... C++ est un langage idéal pour implémenter des compilateurs, un AST est un premier pas simple dans cette direction. La question devrait vraiment être sur les bibliothèques disponibles pour démarrer le processus pour vous, mais ce qui convient dépend beaucoup de vos besoins exacts. Voulez-vous implémenter un langage particulier, ou disposez-vous d'un cadre flexible pour définir plusieurs langues? Avez-vous regardé l'esprit de boost? –

+0

@In Silico: Je suis en train de créer l'AST pour le format .ll de la représentation IR du LLVM. Je sais que .ll est dérivé de AST. Mais j'essaie des pratiques d'analyse statique. Donc, je cherche à créer l'AST. – bsoundra

Répondre

2

La méthodologie la plus simple pour créer l'analyseur sans générateur d'analyseur est recursive descent. Il est très bien documenté - le livre standard dans le domaine est The Dragon Book.

Un scanner, qui prend le texte en entrée et produit une chaîne de jetons en sortie, peut être écrit en utilisant des techniques de manipulation de chaîne standard.

+0

Je vais regarder dans et probablement être de retour avec question le cas échéant. – bsoundra

+0

L'analyse ascendante est seulement légèrement moins intuitive. http://en.wikipedia.org/wiki/Bottom-up_parsing Une fois que vous avez l'idée des algorithmes shift-reduce, cela ne semble pas plus difficile que l'analyse descendante. –

0

Je doute qu'il existe une correspondance bi-univoque entre votre langage arbitraire et les AST de LLVM. Cela signifie qu'il est probable que vous voulez vraiment faire en deux étapes:

  • Parse votre « langue arbitraire » en utilisant les meilleurs outils d'analyse que vous pouvez obtenir de simplifier le problème de l'analyse de votre langue. Utilisez cela pour construire un AST pour votre langage, en suivant les méthodes standard pour les générateurs d'analyseur produisant des AST. LEX/YACC sont OK, mais il y a beaucoup de bonnes alternatives là-bas. C'est assez probable que vous aurez besoin de construire une table de symboles. Marcher l'AST de votre langue analysée pour construire votre AST LLVM. Ce ne sera pas un one-to-one, mais la possibilité de regarder autour de l'arbre près d'un nœud d'arbre dans votre AST pour collecter des informations a besoin de générer le code LLVM sera probablement extrêmement utile.

Ceci est un style classique pour un compilateur simple.

Je vous suggère de lire le livre Aho/Ullman Dragon sur la traduction dirigée par syntaxe. Une journée d'éducation vous permettra d'économiser des mois de temps d'ingénierie gaspillé.

+0

J'ai lu ce livre il y a quelques années. Je pense que presque 3 ans en arrière (la première édition). Mais j'ai acheté une deuxième édition, je n'ai pas encore lu le livre. Je suppose que le SDT n'a pas été discuté en détail dans la première édition, n'est-ce pas? Deuxième édition a tellement d'autres choses aussi. J'ai besoin de lire à nouveau le livre, je suppose – bsoundra

+0

J'ai répondu à la question avant de clarifier que vous voulez manipuler le LLVM IL. Dans ce cas, vous pouvez concevoir une syntaxe de texte un-pour-un pour chaque élément de la LLVM IL (par exemple, votre notion d'utilisation de XML). Dans ce cas, vous pouvez probablement construire un analyseur qui plie le "marcher l'étape AST" dans les actions d'analyse eux-mêmes; C'est ce qu'on appelle la génération de code «à la volée» et c'est ce que font vraiment les SDT. –

Questions connexes