Je suis en train de me lancer dans un compilateur on-calc (j'ai (re-?)découvert un algo d'analyse d'expression qui permettrait de réduire les coûts en place mémoire et en puissance processeur).
L'algo prend les tokens du fichier source les uns après les autres, et construit à la volée un arbre syntaxique.
Je m'explique : supposons que l'expression suivante soit à analyser : 2+3*4
L'arbre construit sera (je mets les parenthèses pour représenter les branches ) :
Cet algo devrait être plus rapide (pour les expressions uniquement) que les approches traditionnelles shift&reduce ou top-down.
1) (2) - une valeur simple
2) ((2) + (?)) - on ajoute l'opérateur -> l'expression est incomplète
3) ((2) + (3)) - on complète l'expression avec la valeur suivante
4) ((2) + ((3) * (?))) - on ajoute l'opérateur * : en parcourant l'arbre, on se rend compte que le * a la priorité sur le +. L'expression suivante serait par exemple fausse (((2) + (3)) * (?)).
5) ((2) + ((3) * (4))) - on complète l'expression
Est-ce que je suis sur une bonne voie (je m'adresse aux personnes qui ont déjà implémenté un compilo; Nitro ?) ?
Ces expérimentations devraient bientôt déboucher sur un compilo on-calc, interfacé avec Genlib et optimisé vitesse de compilation.
Tu fais un compilo C ???
Ben bon courage !!!
dsl, je ne peux pas t'aider, par contre...
[edit]Edité par jackiechan91 le 03-04-2002 à 18:29:50[/edit]
bon courage ... certains s'y sont déja frotté ...
Je vais faire un compilateur simple et rapide (en vitesse de compilation), même si le code généré est dégueu.
L'argument : ça va être difficile de concurrencer les "géants" comme TIGCC dont les sources font plusieurs mio de lignes de code. Les programmeurs qui veulent un exécutable optimisé peuvent faire appel à un compilateur PC. Un compilo on-calc est un outil de prototypage essentiellement; on ne lui en voudra pas si le code généré est un peu lourd.
Mon idée est d'axer le compilateur sur la simplicité (= programme plus petit et moins de bugs), et la rapidité d'exécution.
Architecture :
- première étape : stockage des caractères du flux d'entrée en attendant de dégager un token complet, et passage de ce token au deuxième niveau
- deuxième étape : accepte les tokens; 4 états possibles : essaie de compléter une fonction, un bloc, une instruction ou une expression (pile)
-> dès qu'une expression est complétée, optimisations triviales sur l'arbre (constantes par ex.) et émission du code
- troisième niveau : émission du code pour les expressions, instructions, blocs et fonctions (y.c. épilogue, prologue) et construction/résolution des tables d'offsets pour les instructions de contrôle
Les besoins en mémoire RAM devraient être faibles : je compte environ 8 ko au maximum.
Le compilateur ne devrait pas être énorme non plus ; je vais essayer de rester en dessous des 24 ko.
Le langage proposé sera propriétaire; mais le compilateur devrait fonctionner également en mode traduction ANSI C.
La première étape de ce projet est d'obtenir un compilateur pour un langage fonctionnant uniquement avec le type "word" (une sorte de sous-BASIC).
Enfin, on verra...
Thibaut > Je le fais pour le fun et pour un projet de trimestre, donc pour le compilo C, j'ai pas trop le temps...
De toute manière, je pense devoir réviser toutes mes idées d'ici à un mois (le temps de programmer sérieusement dessus)... je vais tout faire pour éviter que ce prog. marche sur les plate-bandes d'un compilo C. Le langage sera clairement inspiré de C, exactement comme l'ont fait avant moi les développeurs de Java/Javascript et j'en passe :-).
Le topic passe dans la rubrique "projets".