Mini compilateur C
Fermé
malough
Messages postés
11
Date d'inscription
dimanche 6 janvier 2008
Statut
Membre
Dernière intervention
10 mai 2010
-
6 janv. 2008 à 20:04
idrol - 19 févr. 2013 à 05:02
idrol - 19 févr. 2013 à 05:02
A voir également:
- Mini compilateur C
- Opera mini pc - Télécharger - Navigateurs
- Meilleur mini pc - Accueil - Guide ordinateurs
- Geekom mini it11 - Accueil - Guide ordinateurs
- Telecharger code blocks avec compilateur - Télécharger - Langages
- Geekom mini it13 - Accueil - Ordinateurs
5 réponses
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
20 janv. 2008 à 11:13
20 janv. 2008 à 11:13
Bonjour,
Ce qui peut t'aider dans un permier temps est de définir la syntaxe que tu veux (/dois ^^") analyser.
Pour cela je trouve que la BNF est pratique. Cela permet de bien mettre à plat les choses et finalement ça te donnera toutes les fonstions à écrire.
Wikipédia BNF
Cela consiste à écrire ce que sont les choses du type:
<instruction> ::= <if> | <for> | <do> | <while> | <expression>
<if> ::= if "(" <expression-conditionnelle> ")" "{" <instruction>* "}" [else "{" <instruction>* "}" ]
<expression-conditionnelle> ::= ... etc
J'ai fais les choses rapidement là c'est pas forcément l'idéal...
Il faut descendre, descendre, descendre !
jusqu'au plus petit à mon avis:
<variable> ::= <letter> { <character> }
<character> ::= <letter> | <number>
<letter> ::= a | b | ....
chaque prédicat ainsi écrit devrait te donner une fonction.
du genre analyserInstruction ( ... ) si j'ai un if alors analyser if, si j'ai ... pouet pouet pouet et si je ne reconnais pas la symbol alors la syntaxe à analyser est fausse ! Laa BNF est un bon guide je pense.
Il y a après quelques astuces dirais-je....
<opération> ::= ( <expression> + <expression> ) | ( <expression> - <expression> ) | ( <expression> * <expression> ) .....
(A séparer pour gérer la priorité du * et / sur + et -, il faut aussi gérer le - unaire (style 1+ -2)
Ici <opération est génant car si je doit reconnaître une opération, je ne peut pas décider simplement grace au premier élément (<expression>) puisque plusieurs commencent par le même.
Donc je découpe, même si ça semble dépasser la logique de la syntaxe à analyser.
<opération> ::= <debut-opération>
<debut-opération> ::= <expression> <fin-opération>
<fin-opération> ::= ( + <expression> ) | < - <expression > ...
ainsi c'est plus facile pour écrire les fonctions.
-------------------
Bon ça c'est pour dégrossir, tu devrais voir les fonctions à écrire facilement une fois que tout ce travail est fait puisqu'il n'y a plus qu'à faire une fonction par prédicat et tester tous les cas qu'il peut contenir.
Ceci dit, la première chose à faire (peut-être) si tu part de zéro est un analyseur lexical.
L'analyseur lexical prends un texte et le découpe en mots (token), l'analyseur syntaxique prends des tokens et les passe dans la moulinette décrite par ta BNF pour vérifier qu'ils forment des phrase qui ont un sens.
Cela donne normalement les paramètres de tes fonctions : le dernier token lu d'une part et l'analyseur syntaxique d'autre part (qui peut aussi être connu globalement, surtout en C) Ainsi dans analyserIf, le paramètre vaut if (n'est pas forcément nécessaire de le vérifier vu que quelqu'un l'a déjà fait pour savoir qu'il fallait m'appeler moi) on commence donc direct par demander le token suivant à l'analyseur lexical pour vérifier que c'est bien une parenthèse, puis un suivant et on appelle analyseCondition, qui si il ne produit pas d'erreur ressort avec comme token en cours, la parenthèse fermante (toujours bien distinguer si l'expression est erronée ou finie : 1 + 1 est bon 1 + ne l'est pas et 1 + 1 2 ne l'est pas non plus (mais ce n'est pas l'analyseur du + qui le voit mais celui qui l'a appeler qui se retrouve avec un token courant (le 2) qu'il ne sait pas gérer.
Donc là maintenant tu as le choix, soit tu te lances dans l'écriture d'une BNF, soit tu te lances dans l'analyseur lexical qui demande une toute petite partie de BNF, les mots clefs du langage, qu'est-ce qu'un nombre, qu'est-ce qu'une variable.
A prévoir éventuellement mais ça se rajoute très bien après...
Si il t'est demandé de vérifier par exemple que la variable utilisée à été déclarée, il faudra maintenir à part une table de symbole (voire plusieurs pour les différente portée des variables : je ne sais plus trop comment ça) Cette table contient le token représentant le nom de la variable et son type, ce sera l'analyse sémantique (et peut-être encore plus tard sa valeur si tu dois faire un interpréteur de code et non un compilo.
Un petit tour sur Wiki encore une fois ^^
Compilateur mais on arrive vite dans la théorie des automates (Oui, s'en est un, l'état étant maintenu par la fonction en cours d'exécution, partant d'une BNF on fini toujours dans un automate.)
Bon, j'espère que tu vois un peu mieux en quoi consiste ton objectif et que ça t'aidera à commencé avec les étapes en têtes.
Bon courage ^^
M.
EDIT.: J'oubliais...
Si le but n'est évidemment pas d'écrire ce prog mais un compilo..., tu pourra jeter un oeil du côté de JFlex et du côté de Cup, son grand ami ! Faut la prise en main mais si tu as beaucoup de truc du genre à faire c'est le coup à finir son taf en moins de deux une fois l'outil maitrisé. Grossomodo, il faut fournir à JFlex la BNF, et ensuite rajouter les actions du types = met à jour la table de symboles etc... Le reste est généré par les deux outils.
Plus particulièrement pour l'analyseur lexical, le wiki anglais est bien:
Wiki
La mission est de reconnaître les mots clefs, opérateurs, chaîne de caratères, nombres, noms de variables et de tout transformer en "constante" (en mettant dans un coin la valeur pour les autres analyseurs...)
L'analyseur lexical sert aussi à se débarasser des informations inutiles : qu'il y ait un ou quarante espace ou des tabulations on s'en fout, son but est juste de fournir les tokens un à un sans se soucier de leur signification.
Ce qui peut t'aider dans un permier temps est de définir la syntaxe que tu veux (/dois ^^") analyser.
Pour cela je trouve que la BNF est pratique. Cela permet de bien mettre à plat les choses et finalement ça te donnera toutes les fonstions à écrire.
Wikipédia BNF
Cela consiste à écrire ce que sont les choses du type:
<instruction> ::= <if> | <for> | <do> | <while> | <expression>
<if> ::= if "(" <expression-conditionnelle> ")" "{" <instruction>* "}" [else "{" <instruction>* "}" ]
<expression-conditionnelle> ::= ... etc
J'ai fais les choses rapidement là c'est pas forcément l'idéal...
Il faut descendre, descendre, descendre !
jusqu'au plus petit à mon avis:
<variable> ::= <letter> { <character> }
<character> ::= <letter> | <number>
<letter> ::= a | b | ....
chaque prédicat ainsi écrit devrait te donner une fonction.
du genre analyserInstruction ( ... ) si j'ai un if alors analyser if, si j'ai ... pouet pouet pouet et si je ne reconnais pas la symbol alors la syntaxe à analyser est fausse ! Laa BNF est un bon guide je pense.
Il y a après quelques astuces dirais-je....
<opération> ::= ( <expression> + <expression> ) | ( <expression> - <expression> ) | ( <expression> * <expression> ) .....
(A séparer pour gérer la priorité du * et / sur + et -, il faut aussi gérer le - unaire (style 1+ -2)
Ici <opération est génant car si je doit reconnaître une opération, je ne peut pas décider simplement grace au premier élément (<expression>) puisque plusieurs commencent par le même.
Donc je découpe, même si ça semble dépasser la logique de la syntaxe à analyser.
<opération> ::= <debut-opération>
<debut-opération> ::= <expression> <fin-opération>
<fin-opération> ::= ( + <expression> ) | < - <expression > ...
ainsi c'est plus facile pour écrire les fonctions.
-------------------
Bon ça c'est pour dégrossir, tu devrais voir les fonctions à écrire facilement une fois que tout ce travail est fait puisqu'il n'y a plus qu'à faire une fonction par prédicat et tester tous les cas qu'il peut contenir.
Ceci dit, la première chose à faire (peut-être) si tu part de zéro est un analyseur lexical.
L'analyseur lexical prends un texte et le découpe en mots (token), l'analyseur syntaxique prends des tokens et les passe dans la moulinette décrite par ta BNF pour vérifier qu'ils forment des phrase qui ont un sens.
Cela donne normalement les paramètres de tes fonctions : le dernier token lu d'une part et l'analyseur syntaxique d'autre part (qui peut aussi être connu globalement, surtout en C) Ainsi dans analyserIf, le paramètre vaut if (n'est pas forcément nécessaire de le vérifier vu que quelqu'un l'a déjà fait pour savoir qu'il fallait m'appeler moi) on commence donc direct par demander le token suivant à l'analyseur lexical pour vérifier que c'est bien une parenthèse, puis un suivant et on appelle analyseCondition, qui si il ne produit pas d'erreur ressort avec comme token en cours, la parenthèse fermante (toujours bien distinguer si l'expression est erronée ou finie : 1 + 1 est bon 1 + ne l'est pas et 1 + 1 2 ne l'est pas non plus (mais ce n'est pas l'analyseur du + qui le voit mais celui qui l'a appeler qui se retrouve avec un token courant (le 2) qu'il ne sait pas gérer.
Donc là maintenant tu as le choix, soit tu te lances dans l'écriture d'une BNF, soit tu te lances dans l'analyseur lexical qui demande une toute petite partie de BNF, les mots clefs du langage, qu'est-ce qu'un nombre, qu'est-ce qu'une variable.
A prévoir éventuellement mais ça se rajoute très bien après...
Si il t'est demandé de vérifier par exemple que la variable utilisée à été déclarée, il faudra maintenir à part une table de symbole (voire plusieurs pour les différente portée des variables : je ne sais plus trop comment ça) Cette table contient le token représentant le nom de la variable et son type, ce sera l'analyse sémantique (et peut-être encore plus tard sa valeur si tu dois faire un interpréteur de code et non un compilo.
Un petit tour sur Wiki encore une fois ^^
Compilateur mais on arrive vite dans la théorie des automates (Oui, s'en est un, l'état étant maintenu par la fonction en cours d'exécution, partant d'une BNF on fini toujours dans un automate.)
Bon, j'espère que tu vois un peu mieux en quoi consiste ton objectif et que ça t'aidera à commencé avec les étapes en têtes.
Bon courage ^^
M.
EDIT.: J'oubliais...
Si le but n'est évidemment pas d'écrire ce prog mais un compilo..., tu pourra jeter un oeil du côté de JFlex et du côté de Cup, son grand ami ! Faut la prise en main mais si tu as beaucoup de truc du genre à faire c'est le coup à finir son taf en moins de deux une fois l'outil maitrisé. Grossomodo, il faut fournir à JFlex la BNF, et ensuite rajouter les actions du types = met à jour la table de symboles etc... Le reste est généré par les deux outils.
Plus particulièrement pour l'analyseur lexical, le wiki anglais est bien:
Wiki
La mission est de reconnaître les mots clefs, opérateurs, chaîne de caratères, nombres, noms de variables et de tout transformer en "constante" (en mettant dans un coin la valeur pour les autres analyseurs...)
L'analyseur lexical sert aussi à se débarasser des informations inutiles : qu'il y ait un ou quarante espace ou des tabulations on s'en fout, son but est juste de fournir les tokens un à un sans se soucier de leur signification.
malough
Messages postés
11
Date d'inscription
dimanche 6 janvier 2008
Statut
Membre
Dernière intervention
10 mai 2010
2
19 janv. 2008 à 10:47
19 janv. 2008 à 10:47
il y a qlq'un dans ce forum j'attend depuis le 6 janvier
malough
Messages postés
11
Date d'inscription
dimanche 6 janvier 2008
Statut
Membre
Dernière intervention
10 mai 2010
2
10 janv. 2008 à 01:17
10 janv. 2008 à 01:17
coucou !
tjs pas de reponse.
tjs pas de reponse.
Tu peut noux expliquer un peu le thème ( le sujet ) du projet pour t'orienter
Si tu ne sais pas le C , ca ici
Si tu ne sais pas le C , ca ici
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
malough
Messages postés
11
Date d'inscription
dimanche 6 janvier 2008
Statut
Membre
Dernière intervention
10 mai 2010
2
20 janv. 2008 à 01:08
20 janv. 2008 à 01:08
l'objectif est d'analyser un texte lexicalement