1

Voilà, j'ai ce petit TP a faire (titre), bon, j'arrive dans problème a extraire tous les protos classiques (de types définis par des mot-clés de C), mais j'ai un problème avec les types perso pke je ne veux pas regarder dans les header ... qqn aurait il une solution ?

On m'a deja proposé de regarder les typedefs, mais bon, on les mets souvent dans des headers ...

2

solution : tu choppes le source de ultraedit, il fait ça très bien wink


plus sérieusement, tu as une ouverture avec la recherche des acolades...
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

3

plus sérieusement, tu as une ouverture avec la recherche des acolades...

en pensant à vérifier le "type", de sorte à ce que que

if(...) {}

ne soit pas considéré comme une fonction...
il faut quelque chose du type

TYPE identificateur(...) {}

en gros, il faut un identificateur, suivi de parenthèses, suivies d'accolades...
tout en faisant gaffe à ce qu'il ne faut pas de point virgule entre la prenthèse fermante et l'accolade ouvrante
de la sorte, ceci sera valide :
TYPE identificateur(...)
{
   ...
}


et ceci ne le sera pas :
identificateur(...);
{
   ... // le gars peut bien avoir envie de fourtre des instructions entre accolades,
      // pour faire un bloc regroupant plusieurs instructions,
      // histoire de faciliter, par exemple, la lisibilité...
}



pour résumer :
TYPE (on peut considérer qu'il s'agit d'un identificateur, afin de permettre les types perso) (cela dit, l'ancien style C permet d'avoir des fonctions sans type de retour, auquel cas le type de retour sera mis à int par défaut... à toi de voir si tu permet ceci ou non... si tu le permet, la seule façon de faire la différene entre une déclaration de fonction et un appel est le point virgule de fin d'appel)
identificateur
parenthèses (nombre de parenthèses ouvrantes egal au nombre de fermantes)
pas de point virgule
accolade ouvrante


en même temps, fo voir si tu cherche
les prototypes
ou les déclarations de fonctions...

si tu cherche les prototypes, c pas si simples...
(fodrait que j'y réfléchisse, mais g mon binome qui rale comme quoi la pause est finie depuis pas mal de temps, et que je suis encore sur le forum...)

[edit] mise en page
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

4

Ca marche mal car:

main() {

}

est cense marcher smile

Fonction Skip: Saute toutes les directives de preprocessing, les espacs vides, les sauts de lignes, les commentaires.
Retourne un ptr vers un caractere.

Fonction SkipBloc: Saute un bloc { } pour acceder ou } correspondant. Retourne un ptr vers le char juste apres.

D'ou l'algo:
a = Skip(a);
si a ressemble a "machin truc (bidule) {" (Attention aux espaces et aux commentaire et aux directives! Conseil fait une fct NextWord) */
alors c'est un proto.
sinon a = ptr vers le ';' ou le le '{' qui suit.
Si a == '{', alors a = SkipBlock(a) -Gestion de bloc recursives-
sinon a = a+1;
Boucle infinie de ca

Verifie bien qu'il y est le bon nombre d'accolade.

Et a ta place je ferais une premiere passe automatique par le preprocesseur (gcc -E -o machin.e machin.c), car on peut aussi avoir:

int FUNCTION_DEF(f, (int x, int y))
{

}

Ou plus vicieux encore smile
En plus ca enleve les commentaires et les diretives de preprocessing smile

5

la notation K&R doit marcher aussi

MaFonction(bonjour)
MonType MaFonction;
Type bonjour;
{

}


pphd: thx, mais je dois aussi chopper les commentaires wink et j'utilise visual ou cc

6

Notation K&R et visual confus. Y'a un truc qui me choque la.

Sinon ce que j'ai propose avec une legere adaptation peut marcher aussi (on rajoute dans le bloc de base que ) ne suit pas un ; et ca doit etre ok).
(Sinon regarde les sources de GCC grin)
Dans ce cas faut parser a la main les commentaires, sachant qu'ils peuvent etre n'importe ou! (Et les directives de compil!)

7

Je suis censé faire un truc universel, donc qui doit reconnaitre aussi la notation K&R.
Et je code sous VISUAL (mais pas en K&R :P)

j'ai téléchargé les sources de gcc hier wink

En fait, je pense utiliser un système de token possibles ... je vais voir, mais ca m'étonnerait que ca soit ca vu le niveau qu'on a en C ...

8

squale g pas tout lu mais :

ton if(1=2){tadapwetwink est forcément dans { } d'un autre... et le plus "large" est la fonction (qu'il faudra simplement différencier des typedefs...)
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

9

./8> certes.
cela dit, tu peux vouloir déclarer des fonctions imbriquées, par exemple
(il mesemble que c'est possible avec GCC... et vu qu'il doit supporter le K&R-C, pkoi est-ce qu'il ne devrait pas aussi supporter le GNU ?)
et dans le cas de fonctions imbriquées... bah, la plus large est la fonction, et une des moins larges (au mêmeniveau que le if) peut aussi être une fonctions
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall