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.
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. :-) –
C'est marrant, ne me demandez pas comment j'ai trouvé ce fil de discussion. Je viens de faire! – JonH
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. :-) –