Question

Je travaille sur un rel="nofollow Boost Spirit 2.0 analyseur basé pour un petit sous-ensemble de Fortran 77. La question que je vais avoir est que Fortran 77 est orientée colonne, et j'ai été incapable de trouver quoi que ce soit dans l'Esprit qui peut permettre à ses parseurs d'être conscients colonne. Est-il possible de le faire?

Je n'ai pas vraiment soutenir la syntaxe Fortran complète Arcane, mais il n'a pas besoin d'être en mesure d'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 sous forme de lignes de continuation.

Il semble que les gens qui traitent les fichiers de traitement par lots aurait au moins le même problème la première colonne comme moi. Esprit semble avoir un analyseur de fin de ligne, mais pas un analyseur de début de ligne (et certianly pas un analyseur colonne (x)).

Était-ce utile?

La solution

Eh bien, depuis que j'ai maintenant une réponse à cela, je suppose que je devrais partager.

Fortran 77, probablement comme toutes les autres langues qui se soucient de colonnes, est un langage orienté ligne. Cela signifie que votre analyseur doit garder une trace du EOL et utiliser effectivement dans son analyse syntaxique.

Un autre fait important est que dans mon cas, je ne me soucie de l'analyse syntaxique des numéros de ligne Fortran peut mettre dans les colonnes de contrôle au début. Tout ce que je besoin est de savoir quand il me dit de scanner reste de la ligne différemment.

Compte tenu de ces deux choses, je pourrais tout à fait gérer ce problème avec un esprit sauter analyseur. Je le mien écrit à

  • sauter toute la ligne si la première colonne (commentaire) contient un charater alphabétique.
  • sauter toute la ligne s'il n'y a rien là-dessus.
  • ignorer l'EOL et tout jusqu'à précédente à la cinquième colonne si la cinquième colonne contient un « » (Ligne suite). Ce qu'il vire de bord à 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 vous-même pour Fortran, orienté ligne que j'ignore les numéros de ligne et différents compilateurs ont des règles différentes pour commentaires valides et caractères continuation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top