Clex analyseur lexicale du langage c

Soyez le premier à donner votre avis sur cette source.

Vue 10 879 fois - Téléchargée 1 213 fois

Description

comme vous savez l'analyse lexicale est la première passe pour les applications orienté traitement (compilateurs,interpréteur,analyseur de requêtes..) et comme je viens de finir le premier chapitre de mon cours de compilation j'ai décidé d'implémenter mon propre analyseur lexicale du langage C ( et non pas de pseudo-pascal ) qui se trouve par centaine sur le site .
les tokens supportes sont les Symboles,Identificateurs (mots-clés inclus) , String (chaine de caractères commençant par " ou ') , nombres (entier,hex,floats) ,les prédécesseurs (#include,#ifdef...),les espaces , les comments (c/c++ style)...
chaque token est identifie par une instance de la structure token ou le contenu du token ainsi que sa taille et la ligne ou il se trouve sont stocke dans cette structure . le tous est gérés via une liste simplement chaines (voir main() ).
Le code a été testes sous UNIX(FreeBSD) et Windows(VS9) , j'ai inclus un petit build script pour unix ou cas ou.

Source / Exemple :


//Checkout zip file

Conclusion :


next Analyse syntaxique (parser)...
A vOs LeS StUdIoS.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010

Finalement mon projet utilise llvm::clang, qui est plus officiel et plus pérenne comme bibliothèque qu'un code trouvé ici.

J'ai également un projet qui utilise sparse : http://sparse.wiki.kernel.org/index.php/Main_Page
sparse est un projet initié par Linus Torvald, celui ci trouvait que gcc était horrible à utiliser pour parser parce qu'il est compliqué (tout à fait d'accord avec lui). Sparse est donc une petite bibliotheque qui ne fait QUE parser du C. Elle compile en 3 minutes tandis que llvm met une bonne demi heure parce que le parser clang est intégré à llvm. Et llvm c'est un projet bien plus gros (machine virtuelle, compilateur JIT etc ...)
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011

Salut,
Oui oui, ces questions là datent d'avril dernier :p
A l'époque je disais que l'idée m'intéressait. Depuis, j'ai écrit un langage avec flex/bison + l'IDE qui allait avec. (oui... c'est sans doute ma petite fierté qui me fait écrire ça).
Pour ton parseur de C, je ne sais pas si tu as trouvé, mais je crois en avoir vu un ou deux sur ce site, il y a quelques temps. Bonne chance.
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010

Hello!
Je suis en train de chercher un parseur de C pour un projet (sous linux) et je viens de tomber ici.
Pour le choix if/else / switch, il faut savoir que parfois le switch est plus optimisé.
Comme le switch n'accepte que des valeurs de type entier et non pas des conditions (qui peuvent être très longue et independante entre les if / else if), le compilo peut faire des optimisations sur la séquence de test qui sera exécutée. Et en général c'est mieux que ce que l'on écrit.

Pour le while(1) vs for(;;), Au tout début j'écrivais while (1) et puis quand j'ai vu que dans des sources importantes (genre source de kernel, de bibliothèque super connu ..etc ..) que les auteurs utilisaient for(;;) je me suis mis à utiliser le for. Les vieux ont souvent raison :). Mais bon autrement je pense qu'utiliser f(;;) est mieux car le while(1) fait apparaitre une constante.. et c'est moche ...
Utiliser for(; ; ) nous "garanti" (a priori) que la boucle sera un simple jump, et qu'il n'y aura pas de test sur la valeur 1 (je pense au options -g par exemple qui peuvent "bêtement" compiler).
De plus lorsque l'on écrit "for(;;) " on s'appuie a 100% sur le langage C, ce qui me parait plus blindé que de faire trainer des valeur inutile. Voila... c'est juste mon point de vue et c'est juste une habitude à prendre.
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011

Salut,
Je n'ai pas trop regardé le code, mais l'idée me plait, ça m'intéresse.
Juste 2, 3 remarques. Le choix du switch est judicieux dans certains cas, mais parfois des if/else auraient été préférables, non ? (en jouant sur les ascii des caractères alphanumériques, par exemple).
Et, par curiosité, quel est l'avantage d'un for(;;) sur un while(1) ? Il me semblait plus rigoureux d'utiliser while.

Je prendrai le temps de regarder plus en détail ton boulot... quand j'aurai le temps.
Bonne continuation.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.