Verification de syntaxe et exceptions...

Le
Eddahbi Karim
Bonjour/Bonsoir,

Le sujet est pas très clair donc je vais tenter d'éclaircir la
situation.

Je dois faire un programme qui effectuera une vérification syntaxique
simple (Vérifier si les accolades, crochets ou parenthèses sont bien
refermées si ouvertes. Même chose pour les guillemets et commentaires)

Le question que je me pose est :

Est il possible dans un code C de voir des accolades après des
parenthèses.

Genre : fonction( blabla { } );

Si la réponse est non, je dois rajouter une vérification à mon programme.
(Pas de '{' ou de '}' après des parenthèses).

Mais je suis pas sûr du tout

Merci,

--

Remove 'dot' INVALID to mail me
EN-FR : dot->point :P
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Antoine Leca
Le #603737
En 40756f39$0$26438$, Eddahbi Karim va escriure:
Le question que je me pose est :

Est il possible dans un code C de voir des accolades après des
parenthèses.


D'abord, à l'intérieur des arguments d'une macro, oui bien sûr.
Par exemple:

#define GEN(typ, nom, decl) extern typ nom decl

GEN(int, x, ;)
GEN(int, main(void), ;)
GEN(int, mafonc(int x), { return x=rand(); })


Mais je suppose que pour ne pas perdre trop de points de santé mentale, tu
opères sur des après préprocesseur, donc sans macros... ;)

En C90, je pense que ce n'est pas possible (mais je n'ai pas trop réfléchi).
En C99, par contre, c'est certainement possible, avec les arguments typés:

#include int main(void) {
printf( (char[]){'h','e','l','l','o',' ','w','o','r','l','d','!','n',0});
return 0;
}

Il y a des accolades à l'intérieur des parenthèses qui délimitent les
arguments passés à printf.

Dans ce cas, une parenthèse fermante précédera toujours une accolade
ouvrante; de plus, à l'intérieur des accolades, les parenthèses doivent être
équilibrées, et vice-versa; et même les crochets, carrés comme pointus,
doivent aussi être équilibrés entre eux. (Tout ceci n'est évidement pas vrai
avec les macros, où là tu peux faire ce que tu veux).


Antoine

Horst Kraemer
Le #614178
On 08 Apr 2004 15:26:49 GMT, Eddahbi Karim

Bonjour/Bonsoir,

Le sujet est pas très clair donc je vais tenter d'éclaircir la
situation.

Je dois faire un programme qui effectuera une vérification syntaxique
simple (Vérifier si les accolades, crochets ou parenthèses sont bien
refermées si ouvertes. Même chose pour les guillemets et commentaires)

Le question que je me pose est :

Est il possible dans un code C de voir des accolades après des
parenthèses.

Genre : fonction(... blabla { ... } );


Oui.


void f ( struct { int i,j; } *s )
{
s->i = s->j = 0;
}


--
Horst

Eddahbi Karim
Le #613928
Le 08-04-2004,
Antoine Leca
En 40756f39$0$26438$, Eddahbi Karim va escriure:
Le question que je me pose est :

Est il possible dans un code C de voir des accolades après des
parenthèses.


D'abord, à l'intérieur des arguments d'une macro, oui bien sûr.
Par exemple:

#define GEN(typ, nom, decl) extern typ nom decl

GEN(int, x, ;)
GEN(int, main(void), ;)
GEN(int, mafonc(int x), { return x=rand(); })


Mais je suppose que pour ne pas perdre trop de points de santé mentale, tu
opères sur des après préprocesseur, donc sans macros... ;)



Je ne m'étais pas posé cette question mais je pense que c'est ce que je vais
faire...

En C90, je pense que ce n'est pas possible (mais je n'ai pas trop réfléchi).


Horst Kraemer (Si j'ecorche pas son nom, ni son prénom) semble avoir trouvé
une possibilité

En C99, par contre, c'est certainement possible, avec les arguments typés:

#include int main(void) {
printf( (char[]){'h','e','l','l','o',' ','w','o','r','l','d','!','n',0});
return 0;
}

Il y a des accolades à l'intérieur des parenthèses qui délimitent les
arguments passés à printf.

Dans ce cas, une parenthèse fermante précédera toujours une accolade
ouvrante; de plus, à l'intérieur des accolades, les parenthèses doivent être
équilibrées, et vice-versa; et même les crochets, carrés comme pointus,
doivent aussi être équilibrés entre eux. (Tout ceci n'est évidement pas vrai
avec les macros, où là tu peux faire ce que tu veux).



Je pense avoir trouvé une méthode pour vérifier tout équilibrement entre
parenthèses et accolades à un quelquonque endroit du fichier source sans
se préoccuper des "espaced sequences" (On dit comment en bon Français :
séquence d'échappement ? Je n'ai que deux livres anglais...)

Je vais aussi, pour l'instant, demander à ce que l'on utilise un fichier
sans macro :P


Antoine



Karim,

--

Remove 'dot' INVALID to mail me
EN-FR : dot->point :P


Eddahbi Karim
Le #613925
Le 08-04-2004,
Horst Kraemer
On 08 Apr 2004 15:26:49 GMT, Eddahbi Karim


Oui.


void f ( struct { int i,j; } *s )
{
s->i = s->j = 0;
}




Ok merci bien.

--

Remove 'dot' INVALID to mail me
EN-FR : dot->point :P

Yves ROMAN
Le #613666

On 08 Apr 2004 15:26:49 GMT, Eddahbi Karim

Bonjour/Bonsoir,

Le sujet est pas très clair donc je vais tenter d'éclaircir la
situation.

Je dois faire un programme qui effectuera une vérification syntaxique
simple (Vérifier si les accolades, crochets ou parenthèses sont bien
refermées si ouvertes. Même chose pour les guillemets et commentaires)

Le question que je me pose est :

Est il possible dans un code C de voir des accolades après des
parenthèses.

Genre : fonction(... blabla { ... } );


Oui.

void f ( struct { int i,j; } *s )
{
s->i = s->j = 0;
}



Comment une telle fonction peut-elle être appelée sans une bordée d'injures du
compilateur ?

struct { int i,j; } data ;
f(&data) ;

Les 2 types (protoype et variable) sont ils compatibles ?


Horst Kraemer
Le #613398
On Fri, 09 Apr 2004 10:12:17 +0200, Yves ROMAN


On 08 Apr 2004 15:26:49 GMT, Eddahbi Karim

Bonjour/Bonsoir,

Le sujet est pas très clair donc je vais tenter d'éclaircir la
situation.

Je dois faire un programme qui effectuera une vérification syntaxique
simple (Vérifier si les accolades, crochets ou parenthèses sont bien
refermées si ouvertes. Même chose pour les guillemets et commentaires)

Le question que je me pose est :

Est il possible dans un code C de voir des accolades après des
parenthèses.

Genre : fonction(... blabla { ... } );


Oui.

void f ( struct { int i,j; } *s )
{
s->i = s->j = 0;
}



Comment une telle fonction peut-elle être appelée sans une bordée d'injures du
compilateur ?


/* begin file a.c */
void f ( struct { int i,j; } *s )
{
s->i = s->j = 0;
}
/* end file a.c */


/* begin file b.c */

struct { int i,j; } data ;
f(&data) ;

/* end file b.c */

Voir la norme 6,2,7 paragraphe 1

--
Horst



Antoine Leca
Le #610585
En 4075ca8e$0$26424$, Eddahbi Karim va escriure:
Je pense avoir trouvé une méthode pour vérifier tout équilibrement
entre parenthèses et accolades à un quelquonque endroit du fichier
source sans se préoccuper des "espaced sequences"


Quelles "séquences d'échappement" ?
Les chaînes de caractères ont été traitées auparavant, non ?

Parce que si tu mélanges ce qui est du niveau du découpage lexical (les
chaînes de caractères) avec ce qui est du niveau syntaxique (les parenthèses
et autres signes de ponctuation), tu vas au devant de gros problèmes.
Je te recommande de prendre un bouquin d'introduction à la théorie des
compilateurs et de le potasser, avant toute chose (le moins épais fera
l'affaire).


Antoine

Eddahbi Karim
Le #610418
Le 2004-04-13,
Antoine Leca
Quelles "séquences d'échappement" ?
Les chaînes de caractères ont été traitées auparavant, non ?

Parce que si tu mélanges ce qui est du niveau du découpage lexical (les
chaînes de caractères) avec ce qui est du niveau syntaxique (les parenthèses
et autres signes de ponctuation), tu vas au devant de gros problèmes.
Je te recommande de prendre un bouquin d'introduction à la théorie des
compilateurs et de le potasser, avant toute chose (le moins épais fera
l'affaire).



Je dois vérifier que les guillemets (Je sais pas si c'est la bonne
traduction de 'quote') simple et doubles sont bien équilibrés.
Mais je dois éviter ce tomber dans ce genre de panneau :

''' : Unbalanced quotes...

C'est pour cela que j'ai dit que je gérais aussi les séquences d'échappement.
C'est un des buts du projet (En faites c'est qu'un simple exercice)

--

Remove 'dot' INVALID to mail me
EN-FR : dot->point :P

Publicité
Poster une réponse
Anonyme