La Pause Café du Forum Programmation [PART 3]

pour ne pas polluer je poste ici :

www.clubic.com…
:MDR :MDR :MDR :MDR

ouais. Je suis fatigué, et prompt à pas être sympa. Et encore, je me tâte.

T’as faillit bousiller son topic :o
Faut pas se marrer là bas [:shy]
D’autant plus que Monsieur voulait sa réponse dans les 4h, donc celle de Start-IDE, il n’en a rien à péter :smiley:

Moi je sais pas si c’est moi qui suis con, mais je comprend pas deux phrases :

Il veut faire un site de tutos :confused:

Alors ça par contre, d’où ça sort, j’en sais rien mais en tous cas c’est plutôt bizarre :confused:

Quelqu’un peut traduire ?

Pour qu’il ait un truc concret, il part d’un site où tu veux poster des tutos et tout, en partant de l’exemple de clubic (où tu peux poster des brèves), donc tu prends l’exemple de clubic pour lui expliquer comment on fait, comme si c’était très simple xD


Bon pis sur ce, moi je décolle, retour à Paris... :(

HTML5 Rulez : videojs.com… :ouch:

Coucou!

Petite question, qui ne nécessite surement pas l’ouverture d’un topic réservé.
Je réduit le problème, en gros j’ai une ligne de mots séparés par des espaces, et je veux récupérer tous ces mots dans un tableau en matchant. Le nombre de mots par ligne change à chaque ligne. (Oui je sais ça peut se faire avec un bête split, mais je rappelle que j’ai réduit le problème).
J’arrive pas à faire un masque qui englobe ce caractère redondant et imprévisible.
Je pensais à un truc du genre “(([a-z])+ )*” mais ça ne donne rien de concluant.

Euh, tu veux split sur chaque mot, ou sur chaque ligne ?

Pour chaque mot (en PHP) :

explode(" ", $variable)

Pour chaque ligne (en PHP) :

explode(chr(13), $variable)

13 : Code ASCII pour CR (Cariage Return > Retour à la ligne)

C’est un peu plus compliqué, en gros je dois faire un parseur d’identificateurs qui lit un fichier ligne par ligne, et repère sur cette ligne tous les identificateurs, et pour faire simple j’ai raccourci identificateur = mot séparé par espaces, mais en vrai tous les caractères autres que alphanum et _ sont considérés comme des séparateurs. Ensuite, c’est en C++ que je bosse, avec la lib Boost.

En gros ça quoi : flex.sourceforge.net…

+1 :jap:

Superbe !
Dommage qu’il n’y ait pas la barre de nav en mode réduit.


Edit: j'avais pas vu le menu clic-droit, pas mal !

Oui, sauf que c’est le sujet de mon TP donc pas question de pomper des sources.
J’ai toutes les classes, mais j’hésite encore à la lecture à faire un truc crado, ou utiliser une regex. Mais je doute de la possibilité de faire un seul et unique masque pour traduire la redondance imprévisible. :s

Tu ne pompes strictement rien en fait :slight_smile: tu utilises quelque chose de fait pour.

Ceci étant, un lexer c’est un lexer. Que ce soit fait via un outil avec regexp and co, ou à la main, ça revient au même.

C’est juste un automate, flex t’évitant de l’écrire.

Je comprends, mais le but de notre TP c’est de faire ce dont est capable le lexer en deux classes, en utilisant la STL, et en détaillant notre choix dans les structures de données etc.
Si j’utilise ce truc, c’est utile si j’avais une mission à remplir autre, mais là je cours vers une mauvaise appréciation pour ce TP. :s

Oui. D’où ma seconde remarque.

Flex ne fait que construire un automate, qui en gros fait ça (bien sûr, ce n’est pas totalement vrai, et j’utilise un buffer avec la STL, soit stringstream, etc) - tu noteras que j’utilise FILE au lieu de stream, parce que j’ai l’habitude de la première alors que la seconde, je ne m’en souviens jamais.

Rules rules[] = {
  ... à toi d'initialiser ça ...
};
FILE* hndl = fopen("foobar.txt", "r");
if (hndl == NULL) {
  return false;
}
for (;;) {
  long pos = ftell(hndl);
  typedef std::map<Rules*, std::string> t_m;
  t_m matches;
  for (int i = 0; i < (sizeof(rules) / sizeof(rules[0])); ++i) {
    std::string s; bool matched = false;
    rules[i].matche(hndl, matched, s);
    if (matched) {
       matches.push_back(&rules[i], s);
    }
    fseek(hndl, SEEL_SET, pos); // on revient en arrière [là, faut utiliser un buffer intelligent, la portion [pos, pos + s.length()] du flux a déjà été lue]
  }
  if (matches.empty()) {
    return false; // rien trouvé == erreur
  }
  t_m::const_iterator choosen = matches.begin();
  for (t_m::const_iterator it = matches.begin(), e = matches.end(); it != e; ++it) {
    if (it->second->length() > choosen->second->length()) {
      choosen = it; // le meilleur pattern = le pattern le plus long
    }
  }

  Rules* r = choosen->first;
  std::string value = choosen->second;

  if (!r->ignore()) {
    std::cout << "read <" << r->name() << " [" << value << " ]" << std::endl;
  }
}

Voilà pour le gros.

Bien sûr Rules, c’est à toi d’implémenter; matches ne fait que lire dans le buffer (ici, un joli FILE*, ça s’améliore hein ;)), ex:

class Whitespace : public Rules {
  boolean matche(FILE* hndl, bool& matched, std::string& value) {
    int c = fgetc(hndl);
    if (isspace(c)) { // note fgetc(hndl) == EOF = -1 => ne passe pas dedans
      matched = true;
      value = static_cast<char>(c); 
    }
  }
}

Pour les nostalgiques : Le Journal Télévisé du jour de votre naissance :smiley:

Au fait, on cherche un développeur core dans mon équipe à Dailymotion : Développeur Core Web Senior (H/F), FR-IDF-Paris :slight_smile:
Edité le 17/11/2010 à 00:18

C’est con, le site est bloqué^^

Bah ça buzz véner :smiley:

www.20minutes.fr…

J’ai oublié de préciser : par le proxy :wink: