OVH Cloud OVH Cloud

Analyse syntaxique

31 réponses
Avatar
Dominique MICOLLET
Bonjour,

Je cherche à isoler dans la chaîne suivante :
%%%{1,[2,0,0,0,0,2]%%%}+%%%{1,[1,0,0,1,0,2]%%%}
les différents nombres qui y apparaissent, en conservant leur sémantique (le
premier 1 est un coefficient, le premier 2 est un degré).

En utilisant astucieusement les méthodes de recherche de caractères ou
sous-chaînes et d'extraction de ces dernières, je devrais m'en sortir.

Mais j'imagine que d'autres ont déjà eu ce souci et qu'il existe une
solution toute prête.

Auriez des suggestions de pistes à suivre ?

--
Cordialement

Dominique MICOLLET Email : enlever deux fr
Universite de Bourgogne
9, Avenue Alain SAVARY BP 47870 Tel : +33/(0)3-80-39-59-27
21078 DIJON CEDEX FRANCE Tfx : +33/(0)3-80-39-68-69

10 réponses

1 2 3 4
Avatar
James Kanze
On Feb 26, 9:09 am, Dominique MICOLLET
bourgogne.fr.fr.fr> wrote:

Je cherche à isoler dans la chaîne suivante :
%%%{1,[2,0,0,0,0,2]%%%}+%%%{1,[1,0,0,1,0,2]%%%}
les différents nombres qui y apparaissent, en conservant leur sémanti que (le
premier 1 est un coefficient, le premier 2 est un degré).

En utilisant astucieusement les méthodes de recherche de caractères ou
sous-chaînes et d'extraction de ces dernières, je devrais m'en sortir.

Mais j'imagine que d'autres ont déjà eu ce souci et qu'il existe une
solution toute prête.


La solution évidente, c'est boost::regex. Tu décris le format de
la chaîne en forme d'expression régulière, avec chacun des
nombres dans un (...). Ensuite, tu recupère les sous-chaînes
une à une, et tu te sers de std::istringstream pour les
convertir en valeurs numériques. Quant à la sémantique, c'est
bien ce que tu fais de la chaîne ou de la valeur numérique dans
ton code qui le détermine.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Dominique MICOLLET
James Kanze wrote:

La solution évidente, c'est boost::regex. Tu décris le format de
la chaîne en forme d'expression régulière, avec chacun des
nombres dans un (...). Ensuite, tu recupère les sous-chaînes
une à une, et tu te sers de std::istringstream pour les
convertir en valeurs numériques.


Merci pour la piste.


Quant à la sémantique, c'est
bien ce que tu fais de la chaîne ou de la valeur numérique dans
ton code qui le détermine.
Par sémantique, je voulais dire être sûr de récupérer la bonne valeur au bon

endroit qui définit ce qu'elle représente. J'ai peut-être employé à tort un
mot réservé du jargon informatique :-).

Quoiqu'il en soit merci pour la piste.

Cordialement

Dominique MICOLLET Email : enlever deux fr
Universite de Bourgogne
9, Avenue Alain SAVARY BP 47870 Tel : +33/(0)3-80-39-59-27
21078 DIJON CEDEX FRANCE Tfx : +33/(0)3-80-39-68-69

Avatar
Marc Boyer
Le 26-02-2007, Dominique MICOLLET a écrit :
Je cherche à isoler dans la chaîne suivante :
%%%{1,[2,0,0,0,0,2]%%%}+%%%{1,[1,0,0,1,0,2]%%%}
les différents nombres qui y apparaissent, en conservant leur sémantique (le
premier 1 est un coefficient, le premier 2 est un degré).


sscanf (sauf que ici, l'usage intensif du % va etre pénible).
Un petit remplacement de tous les % par autre chose simplifierait
la vie.

En utilisant astucieusement les méthodes de recherche de caractères ou
sous-chaînes et d'extraction de ces dernières, je devrais m'en sortir.

Mais j'imagine que d'autres ont déjà eu ce souci et qu'il existe une
solution toute prête.

Auriez des suggestions de pistes à suivre ?


Aller:
string s= "%%%{1,[2,0,0,0,0,2]%%%}+%%%{1,[1,0,0,1,0,2]%%%}";
int res= scanf("%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}+"
"%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}",
&coef,&degre,
/// A continuer avec la sémantique de tes vars
if (res != 14){
// Pb...
}

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

Avatar
Marc Boyer
Le 26-02-2007, James Kanze a écrit :
On Feb 26, 9:09 am, Dominique MICOLLET
bourgogne.fr.fr.fr> wrote:

Je cherche à isoler dans la chaîne suivante :
%%%{1,[2,0,0,0,0,2]%%%}+%%%{1,[1,0,0,1,0,2]%%%}
les différents nombres qui y apparaissent, en conservant leur sémantique (le
premier 1 est un coefficient, le premier 2 est un degré).

En utilisant astucieusement les méthodes de recherche de caractères ou
sous-chaînes et d'extraction de ces dernières, je devrais m'en sortir.

Mais j'imagine que d'autres ont déjà eu ce souci et qu'il existe une
solution toute prête.


La solution évidente, c'est boost::regex. Tu décris le format de
la chaîne en forme d'expression régulière, avec chacun des
nombres dans un (...). Ensuite, tu recupère les sous-chaînes
une à une, et tu te sers de std::istringstream pour les
convertir en valeurs numériques.


Est-ce que ce n'est pas le marteau pilon pour écraser la mouche ?
Pourquoi pas un bête sscanf ?

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Marc Boyer
Le 26-02-2007, Fabien LE LEZ a écrit :
On Mon, 26 Feb 2007 15:28:12 +0000 (UTC), Marc Boyer
:

string s= "%%%{1,[2,0,0,0,0,2]%%%}+%%%{1,[1,0,0,1,0,2]%%%}";
int res= scanf("%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}+"
"%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}",
&coef,&degre,
/// A continuer avec la sémantique de tes vars


C'est lourd, impossible à maintenir, et tout se casse la gueule si
jamais l'expression n'est pas fixe.


Sérieux ?
Et tu envisages quoi qui serait moins lourd, plus maintenable ?

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Fabien LE LEZ
On Mon, 26 Feb 2007 15:28:12 +0000 (UTC), Marc Boyer
:

string s= "%%%{1,[2,0,0,0,0,2]%%%}+%%%{1,[1,0,0,1,0,2]%%%}";
int res= scanf("%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}+"
"%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}",
&coef,&degre,
/// A continuer avec la sémantique de tes vars


C'est lourd, impossible à maintenir, et tout se casse la gueule si
jamais l'expression n'est pas fixe.

Avatar
Michel Decima
On Mon, 26 Feb 2007 15:28:12 +0000 (UTC), Marc Boyer
:

string s= "%%%{1,[2,0,0,0,0,2]%%%}+%%%{1,[1,0,0,1,0,2]%%%}";
int res= scanf("%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}+"
"%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}",
&coef,&degre,
/// A continuer avec la sémantique de tes vars
C'est lourd, impossible à maintenir, et tout se casse la gueule si

jamais l'expression n'est pas fixe.


Sérieux ?
Et tu envisages quoi qui serait moins lourd, plus maintenable ?


Boost.Spirit ?



Avatar
Fabien LE LEZ
On Mon, 26 Feb 2007 15:29:17 +0000 (UTC), Marc Boyer :

Est-ce que ce n'est pas le marteau pilon pour écraser la mouche ?


Il me semble au contraire que les regex sont un outil de base.

Avatar
Laurent Deniau
Michel Decima wrote:
On Mon, 26 Feb 2007 15:28:12 +0000 (UTC), Marc Boyer
:

string s= "%%%{1,[2,0,0,0,0,2]%%%}+%%%{1,[1,0,0,1,0,2]%%%}";
int res= scanf("%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}+"
"%%%%%%{%d,[%d,%d,%d,%d,%d,%d]%%%%%%}",
&coef,&degre,
/// A continuer avec la sémantique de tes vars
C'est lourd, impossible à maintenir, et tout se casse la gueule si

jamais l'expression n'est pas fixe.


Sérieux ?
Et tu envisages quoi qui serait moins lourd, plus maintenable ?


Boost.Spirit ?


c'est vrai qu'avec Vista qui arrive, on n'est plus a ca pret ;-)

a+, ld.




Avatar
Dominique MICOLLET
Marc Boyer wrote:

.....
}

Marc Boyer


J'avais pensé au sscanf, mais comme je débute en C++, j'essaie d'éviter
d'employer des fonctions venant du monde C. J'ai du lire quelque part que
c'est mal d'employer des fonctions de C :-)
Je cherche donc à employer l'outil C++ lorsqu'il existe.

--
Cordialement

Dominique MICOLLET Email : enlever deux fr
Universite de Bourgogne
9, Avenue Alain SAVARY BP 47870 Tel : +33/(0)3-80-39-59-27
21078 DIJON CEDEX FRANCE Tfx : +33/(0)3-80-39-68-69

1 2 3 4