OVH Cloud OVH Cloud

Histoire de grammaire

12 réponses
Avatar
Eric
Bonjour,

il me faut parcourir une chaine pour en séparer ses composantes. Je ne sais
pas quelle fonctions de sscanf, strtok, ... je dosi utiliser. La chaine que
je dois parcourir, si je l'appelle <message>, à une structure en pseudo BNF
comme ceci :

<message> ::= [':' <command> <SPACE> ] <command> <params> <crlf>
<command> ::= <letter> { <letter> } | <number> <number> <number>
<SPACE> ::= ' ' { ' ' }
<params> ::= <SPACE> [ ':' <trailing> | <middle> <params> ]

<middle> ::= <Any *non-empty* sequence of octets not including SPACE
or NUL or CR or LF, the first of which may not be ':'>
<trailing> ::= <Any, possibly *empty*, sequence of octets not including
NUL or CR or LF>

<crlf> ::= CR LF

Mon problème est la gestion des paramètres optionnels (entre crochets),
notamment pour <param>. Comment programmer un tel "parser" ?

Cordialement.

2 réponses

1 2
Avatar
Alain Naigeon
"Patrick Mézard" a écrit dans le message news:
bgd36n$ua4$
il me faut parcourir une chaine pour en séparer ses composantes. Je ne
sais

pas quelle fonctions de sscanf, strtok, ... je dosi utiliser. La chaine
que

je dois parcourir, si je l'appelle <message>, à une structure en pseudo
BNF

comme ceci :



Tu peux aussi trouver des bouquins d'initiation à l'analyse,
qui montrent que c'est très simple d'écrire quelques fonctions
pour analyser un truc de ce genre...

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


Avatar
kanze
Jean-Marc Bourguet wrote in message
news:...
DINH Viêt Hoà writes:


La réponse 'brute force', c'est lex/yacc ou flex/bison.


C'est d'un analyseur lexical ou syntaxique donc j'ai besoin (i.e.
flex ou bison) ?


les 2, lex pour découper en mot et symboles. yacc pour reconnaître
les motifs donnés par la grammaire.


Si j'ai bonne memoire, sa grammaire est reguliere (autrement dit lex
suffit, mais bon pour quelque chose d'aussi simple, ecrire tout a la
main c'est plus rapide, surtout si on ne connait pas ces outils).


Le problème avec lex, c'est que la partie scanner n'est pas vraiment
indépendant du contexte. Il faudrait se servir des états. (Pas difficile
en soi, mais ça veut dire qu'il faut connaître lex un peu plus.)

Quelque soit la solution adoptée, je commencerais par lire ligne par
ligne (std::getline). Ensuite, je me pose la question : son format
ressemble beaucoup à des champs séparés par des espaces, sauf dans le
cas de final. Est-ce qu'il serait acceptable de l'implémenter comme tel,
quitte à vérifier par la suite que les commandes ne contiennent que les
caractères voulus ?

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16




1 2