Journal Générateur de générateur de 'parser'.

Posté par  .
Étiquettes : aucune
0
16
déc.
2004
Non, ce n'est pas une typo, ni un récurrence foireuse...

C'est juste un besoin ;p.

Voila, le but ultime et de prendre une RFC quelconque d'en extraire
l'EBNF et d'obtenir un parser.

J'ai déjà implémenté un générateur de FLEX/BISON capable de
comprendre des syntaxes assez simples, et j'aurais aimé souhaité
avoir des avis ou des références sur des travaux semblables.

Donc si certains ont des pointeurs, je suis preneur ...
  • # un lien

    Posté par  . Évalué à 3.

    tu trouveras peut-être des choses intéressantes ici : http://codegeneration.net/(...)
  • # ANTLR

    Posté par  . Évalué à 3.

    non ?
    (je sais pas du tout si c'est ce que tu cherches mais bon :) )

    http://antlr.org/(...)
  • # Salaud !

    Posté par  . Évalué à 5.

    Tu veux nous mettre au chômage !

    Même les informaticiens sont remplacés par des machines... :p
    • [^] # Re: Salaud !

      Posté par  . Évalué à 1.

      Absolument pas,
      En fait c'est justement pour nous faire travailler moins.
      Un parser c'est toujours chiant à ecrire et on rencontre toujours
      pas mal de difficultés.

      Si maintenant on arrive à ne plus y penser on se concentre alors
      sur le but du developpement.

      Actuellement faire un parseur qui comprends HTTP/1.1 et juste ca
      ca me prends environ 20 secondes. (test unitaire compris)

      C'est étendre cette idée qui m'intéresse...
      • [^] # Re: Salaud !

        Posté par  . Évalué à 1.

        c'est justement pour nous faire travailler moins

        c'est bien ce qu'il te dit, le chomage étant l'étape ultime : quand tu travailles tellement moins que tu ne travaille plus du tout!

        Blague à part, ce que tu dis sur la génération d'un parser HTTP à partir de l'EBNF m'interresse. Y'a moyen de consulter ça qqpart ou c'est dans un cadre professionnel non divulgable?
        • [^] # Re: Salaud !

          Posté par  . Évalué à 1.

          Travailler moins ca veut surtout dire passer plus de temps pour que
          le chose fonctionne mieux. Passer peu de temps à developper c'est
          avoir beaucoup de temps pour faire des tests unitaires et des
          validation fonctionnelle. Et c'est fort appréciable.

          > Blague à part, ce que tu dis sur la génération d'un parser HTTP à
          > partir de l'EBNF m'interresse.

          Et moi dont, malheureusement je ne le génère pas a partir de
          l'EBNF, ce que je génère c'est un 'parser.yacc' et un 'lexer.lex'
          issus de template. Voici comment cela se passe :

          Première étape définir ce qui nous intéresse, c'est à dire mettre
          dans un fichier server_definition.txt la syntaxe suivante non
          exhaustive pour simplifier:


          GET data
          POST data
          "connection:" CONNECTION data
          "accept:" ACCEPT data
          "accept-encoding:" ACCEPTENCODING data
          "cache-control:" CACHECONTROL data
          "pragma:" PRAGMA data


          Voila c'est la liste de ce que mon parser va comprendre.

          Maintenant générons les différents fichiers:
          sh> gen_yacc
          Désormais j'ai un fichier parser.yacc qui sait que CONNECTION
          prend 1 argument

          sh> gen_lex
          Désormais je dispose d'un lexer.lex qui sait que la token
          CONNECTION c'est "connection:"

          sh> gen_files
          Désormais dans le répertoire commands/ j'ai les fonctions
          suivantes: cmd_get.c, cmd_post.c, cmd_connection.c, cmd_accept.c,
          cmd_acceptencoding.c, cmd_cachecontrol.c, cmd_pragma.c.

          Chacune ne seront appelées que si la grammaire est correcte.
          Derniere étape:
          sh> make
          Je dipose maintenant d'un binaire qui comprends
          server_definition.txt.


          Le but final est bien sur de pas partir de server_definition.txt
          mais de l'EBNF contenu dans la RFC.

          Ce n'est qu'une premier étape car vous pouvez bien imaginer que il
          reste un peu de parsing a faire dans les fonction cmd_xxx.

          L'exemple typique c'est
          GET /url HTTP/1.1.
          Car mon parseur va appeler cmd_get avec comme paramètre
          "/url/ HTTP/1.1"
          je suis donc dans l'obligation de découper, cependant et vous me
          l'accorderez facilement, ce découpage n'a rien de très compliqué.

          La difficulté du parseur HTTP c'est que les valeurs peuvent
          s'étendre sur plusieurs lignes, en effet la valeur d'un header
          n'est pas terminée tant qu'on n'as pas trouver un autre header ou
          alors la fin des headers '\r\n\r\n'.
          Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0
          peut s'ecrire
          Accept-encoding: gzip;q=1.0,
          identity;q=0.5,
          *;q=0

          C'est une des raisons pour lesquelles j'utilise de ''templates''.
          Un pour le lexer et un pour le parser.
  • # le mot clé est "parser generator"

    Posté par  (site web personnel) . Évalué à 2.

    http://en.wikipedia.org/wiki/Parser_generator(...)
    http://www.google.com/search?&q=parser%20generator(...)
    $ apt-cache search parser generator
    bison - A parser generator that is compatible with YACC
    bison++ - Generate a parser in c or c++ from BNF notation
    bnfc - Compiler front-end generator based on Labelled BNF
    btyacc - Backtracking parser generator based on byacc
    byacc - The Berkeley LALR parser generator
    clig - Command Line Interpreter Generator
    cup - LALR parser generator for Java(tm)
    decafc - Compiler for the toy language Decaf
    happy - Parser generator for Haskell
    javacc - A parser generator for use with Java
    lg-issue106 - Issue 106 of the Linux Gazette.
    lg-issue87 - Issue 87 of the Linux Gazette.
    lg-issue93 - Issue 93 of the Linux Gazette.
    pccts - The Purdue Compiler Construction Tool Set (PCCTS).
    perl-byacc - The Berkeley LALR parser generator, Perl version
    racc - Ruby LALR parser generator
    styx - combined parser/scanner generator
    tclex - A lexical analyzer generator for Tcl
    wyg - (Where's Your Grammar?) command line parser generator
    genparse - command line parser generator
    lemon - The Lemon Parser Generator
    ml-yacc - Parser generator for Standard ML
    mono-jay - LALR(1) parser generator oriented to Java/.NET
    python-yappy - Yet Another Parser Generator fo Python
    yapps2 - Yet Another Python Parser System
    (en gardant que les trucs plus ou moins utiles)

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.