2009-09-22 10 views
4

Je travaille sur un analyseur basé sur Boost Spirit 2.0 pour un petit sous-ensemble de Fortran 77. Le problème que j'ai est que Fortran 77 est orienté colonne, et je n'ai pas pu trouver tout ce qui, dans l'Esprit, peut permettre à ses parseurs d'être sensibles aux colonnes. Est-ce qu'il y a un moyen de faire ça? Je n'ai pas vraiment besoin de supporter la syntaxe Fortran arcanique complète, mais il faut pouvoir ignorer les lignes qui ont un caractère dans la première colonne (commentaires Fortran), et reconnaître les lignes avec un caractère dans la sixième colonne comme lignes de continuation.Analyse de colonnes de caractères dans Boost :: Spirit

Il semblerait que les gens qui traitent des fichiers batch aient au moins le même problème de première colonne que moi. Spirit semble avoir un analyseur de fin de ligne, mais pas un analyseur de début de ligne (et certainement pas un analyseur de colonne (x)).

+0

Woot! J'ai obtenu un badge tumbleweed (http://stackoverflow.com/badges/63/tumbleweed). Jon Skeet n'en a pas, et ne le fera probablement jamais. :-) –

+0

C'est marrant, ne me demandez pas comment j'ai trouvé ce fil de discussion. Je viens de faire! – JonH

+0

Eh bien, bienvenue à ma question JonH. S'il vous plaît, essayez de ne pas trop dissartrer la poussière. Je l'ai juste bien où je le veux. :-) –

Répondre

4

Eh bien, puisque j'ai maintenant une réponse à cela, je suppose que je devrais le partager. Fortran 77, comme probablement toutes les autres langues qui se soucient des colonnes, est un langage orienté ligne. Cela signifie que votre analyseur doit suivre l'EOL et l'utiliser dans son analyse.

Un autre fait important est que dans mon cas, je ne me suis pas soucié de l'analyse des numéros de ligne que Fortran peut mettre dans ces premières colonnes de contrôle. Tout ce dont j'ai besoin, c'est de savoir quand il me dit de balayer différemment le reste de la ligne. Compte tenu de ces deux choses, je pouvais entièrement résoudre ce problème avec un analyseur de saut Spirit. J'ai écrit le mien à

  • ignorer la ligne entière si la première colonne (commentaire) contient un caractère alphabétique.
  • ignorer la ligne entière s'il n'y a rien dessus.
  • ignorer la précédente EOL et tout jusqu'à la cinquième colonne si la cinquième colonne contient un '.' (ligne de continuation). Cela le pince à la ligne précédente.
  • sauter tous les espaces non-eol (. Même les espaces ne sont pas importants en Fortran Oui, il est une langue bizarre.)

Voici le code:

 skip = 
      // Full line comment 
      (spirit::eol >> spirit::ascii::alpha >> *(spirit::ascii::char_ - spirit::eol)) 
      [boost::bind (&fortran::parse_info::skipping_line, &pi)] 
     | 
      // remaining line comment 
      (spirit::ascii::char_ ('!') >> *(spirit::ascii::char_ - spirit::eol) 
      [boost::bind (&fortran::parse_info::skipping_line_comment, &pi)]) 
     | 
      // Continuation 
      (spirit::eol >> spirit::ascii::blank >> 
      spirit::qi::repeat(4)[spirit::ascii::char_ - spirit::eol] >> ".") 
      [boost::bind (&fortran::parse_info::skipping_continue, &pi)] 

     | 
      // empty line 
      (spirit::eol >> 
      -(spirit::ascii::blank >> spirit::qi::repeat(0, 4)[spirit::ascii::char_ - spirit::eol] >> 
       *(spirit::ascii::blank)) >> 
      &(spirit::eol | spirit::eoi)) 
      [boost::bind (&fortran::parse_info::skipping_empty, &pi)] 
     | 
      // whitespace (this needs to be the last alternative). 
      (spirit::ascii::space - spirit::eol) 
      [boost::bind (&fortran::parse_info::skipping_space, &pi)] 
     ; 

Je vous conseille de ne pas utiliser aveuglément ceci pour le Fortran orienté ligne, car j'ignore les numéros de ligne, et les différents compilateurs ont des règles différentes pour les caractères valides de commentaire et de continuation.

+0

FYI: Ceci est le code Spirit 2.1, ce qui signifie qu'il fonctionne avec le Boost récemment lancé (1.41) mais peut ne pas compiler avec les versions antérieures. –