Frage

Ich arbeite an einem Geist Erhöhung 2.0-basierte Parser für eine kleine Teilmenge von Fortran 77. Der Problem, das ich habe ist, dass Fortran 77 ist Spalte orientiert, und ich habe es nicht gelungen, alles in Geist zu finden, die seine Parser ermöglichen kann säulen bewusst sein. Gibt es eine Möglichkeit, dies zu tun?

Ich habe nicht wirklich die volle arkanen Fortran-Syntax zu unterstützen, aber es muss in der Lage sein, Linien zu ignorieren, die ein Zeichen in der ersten Spalte (Fortran Kommentare) haben, und erkennen Linien mit einem Charakter in der sechsten Spalte als Fortsetzungszeilen.

Es scheint, wie Leute mit Batch-Dateien zu tun zumindest das gleiche erste Spalte Problem wie ich haben würde. Geist erscheint eine End-of-line-Parser zu haben, aber keinen Start-of-line-Parser (und certianly keine Spalte (x) Parser).

War es hilfreich?

Lösung

Nun, da ich jetzt eine Antwort auf diese haben, ich glaube, ich sollte es teilen.

Fortran 77, wie wahrscheinlich alle anderen Sprachen, die über Spalten kümmern, ist eine zeilenorientierte Sprache. Das heißt, Ihr Parser Spur des EOL zu halten hat und es verwendet, tatsächlich in seiner Analyse.

Eine weitere wichtige Tatsache ist, dass in meinem Fall, ich nicht über das Parsen die Zeilennummern scherte, dass Fortran in diesen frühen Steuer Spalten setzen. Alles was ich brauche ist zu wissen, wann es mir erzählt Rest der Zeile anders zu scannen.

Da diese beiden Dinge, konnte ich dieses Problem mit einem Geist überspringt Parser ganz handhaben. Ich schrieb meine zu

  • überspringen die gesamte Zeile, wenn die erste (Kommentar) Spalte eine alphabetische charater enthält.
  • die gesamte Zeile überspringen, wenn es nichts drauf ist.
  • ignorieren die vorhergehenden EOL und alles bis zur fünften Spalte, wenn die fünfte Spalte eines enthält ‚‘ (Fortsetzungslinie). Diese heftet es an der vorhergehenden Zeile.
  • überspringen alle Nicht-EOL Leerzeichen (auch Räume spielen keine Rolle in Fortran. Ja, es ist eine seltsame Sprache.)

Hier ist der 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)]
        ;

würde ich abraten blind diese verwenden, um sich für zeilenorientierte Fortran, wie ich Zeilennummern ignorieren und verschiedene Compiler haben unterschiedliche Regeln für gültige Kommentar und Fortsetzungszeichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top