2009-10-31 7 views
4

Je suis en train de coder un compilateur en C, et j'ai tout lu sur les compilateurs dans le Dragon book. Mais je trouve cela très difficile à mettre en œuvre, et je n'ai aucune idée de l'endroit où commencer. Même quand il s'agit de la partie lexer, alors j'aimerais savoir une méthode étape par étape sur la base de l'écriture de code pour écrire un compilateur en C !!Comment coder un compilateur en C?

Que pourriez-vous suggérer de faire ensuite?

+6

"Je trouve cela très difficile à mettre en œuvre" - ce serait parce que c'est dur. C'est plus proche de courir un marathon qu'une promenade dans le parc - même avec des années d'entraînement et de talent, c'est toujours un travail difficile. –

Répondre

4

La plupart des gens utilisent des outils générateurs de syntaxe et de parser spécialisés comme ANTLR ou Yacc/Bison avec Lex.

+0

Je veux coder mon propre lexer et parser .. !! et n'utilisez pas n'importe quel outil !! – Hick

+0

Au moins ANTLR produit un code plus ou moins lisible. En regardant le lexer généré pourrait vous donner de bonnes idées sur la façon de construire votre propre. – Niki

+2

Aucun outil? Supposons que vous allez entrer manuellement des octets directement dans la mémoire puis par rapport à n'importe quel type de "compilateur" pour construire ce compilateur. – Joe

5

Vous pouvez regarder Appel's Modern Compiler Implementation in C. Par les sons de cela, vous devez déterminer quelle langue vous voulez compiler: voulez-vous un sous-ensemble de C dire ou un langage facile à analyser comme Scheme, ou juste un langage d'expression arithmétique? Choisissez/dessinez un langage, écrivez quelques très petits programmes dedans, écrivez un lexer/analyseur pour une partie, puis l'arrière pour que les parties fonctionnent (éventuellement interprété pour commencer - juste pour que vous puissiez le voir fonctionner) et ensuite itérer des morceaux qui semblent intéressants, en construisant jusqu'à la langue complète.

Modifier en fonction des détails supplémentaires fournis

"Je veux faire un super ensemble de c, comme la mise en œuvre de divers avantages de python, mais en gardant aussi simple que c"

Je ne suis pas sûr que je le ferais en écrivant tout à la main, mais si je l'ai fait ...

J'écrirait sur s programmes ertains dans la langue hybride que je veux finir avec: donc si vous voulez C avec Python comme la liste compréhensions alors peut-être

void main() 
{ 
    int[] x = {1,2,3,4,5}; 
    int[] y = {i*i for i in x where i % 2 == 0}; 
    for (int i in y) { printf("%d", i); } 
} 

[des tableaux de style C qui incluent leur compte comme implicite en haut à gauche comme exercice pour le lecteur :-)!]

Ensuite, faites fonctionner un programme C absolument minimal, bonjour ou ajoutez simplement quelques chiffres de manière statique (si c'était bonjour, je pourrais même commencer par printf spécial pour ne pas avoir à analyser stdio .h - si vous vous dirigez vers un hybride C-Python, vous pourriez finir par le garder). Une fois que vous pourriez faire

void main() 
{ 
    int x = 0; 
    int y; 
    y = 5; 
    x + y; 
} 

Vous pouvez commencer à ajouter la complexité: les définitions de fonctions arbitraires et des appels, plusieurs opérateurs, les valeurs de retour, des tableaux, des structures de données, const, pointeurs, ... la construction vers la plus simple de l'exemple étape des programmes par étape. L'avantage de commencer avec le sous-ensemble C est que vous avez beaucoup de compilateurs C que vous pouvez rechercher pour trouver des idées. TinyCC donc au moment où vous arrivez à la difficulté d'ajouter des pièces python-esque vous avez une base solide.

C'est patiner sur beaucoup de détails sur une longue route. Bonne chance.

+0

je veux faire un super ensemble de c, comme l'implémentation de divers avantages de python, mais en le gardant aussi simple que c. J'ai vraiment aimé votre dernier paragraphe, et aimerais développer le compilateur de cette façon, pouvez-vous décrire un peu plus sur cette méthode? – Hick

+6

Donc, vous voulez construire un Jumbo Jet, seulement plus grand et mieux, en utilisant uniquement les pièces de l'ensemble de base Meccano? –

+0

yup !! afin que vous puissiez comprendre mon problème, alors s'il vous plaît aidez-moi – Hick

Questions connexes