Domanda

Sto lavorando su un rel="nofollow spinta dello Spirito 2.0 parser based per un piccolo sottoinsieme di Fortran 77. Il problema che sto avendo è che Fortran 77 è orientato colonna, e sono stato in grado di trovare qualsiasi cosa in Spirito che può permettere le sue parser di essere colonna-aware. Esiste un modo per fare questo?

Non ho veramente sostenere la sintassi completa Fortran arcana, ma ha bisogno di essere in grado di ignorare le linee che hanno un carattere nella prima colonna (commenti Fortran), e riconoscere le linee con un carattere nella sesta colonna come linee di continuazione.

Sembra che la gente che si occupano di file batch dovrebbe almeno avere lo stesso problema di prima colonna come me. Spirit sembra avere un parser end-of-line, ma non un parser start-of-line (e mi troverò non una colonna (x) parser).

È stato utile?

Soluzione

Bene, dato che ora ho una risposta a questo, credo che dovrei condividerlo.

Fortran 77, come probabilmente tutti gli altri linguaggi che si occupano di colonne, è un linguaggio orientato alla linea. Ciò significa che il parser deve tenere traccia della EOL ed effettivamente usarlo nella sua analisi.

Un altro fatto importante è che nel mio caso, non mi importa di analizzare i numeri di riga che Fortran può mettere in quelle colonne di controllo precoce. Tutto quello che serve è sapere quando mi dice di eseguire la scansione resto della linea in modo diverso.

Dato queste due cose, ho potuto interamente gestire questo problema con spirito saltare parser. Ho scritto la mia a

  • saltare l'intera riga se la prima colonna (commenti) contiene un charater alfabetica.
  • saltare l'intera linea se non c'è nulla su di esso.
  • ignorare l'EOL precedente e tutto fino alla quinta colonna, se la quinta colonna contiene un '' (Linea continua). Questo vira alla linea precedente.
  • saltare tutti gli spazi non-EOL (anche spazi non contano in Fortran. Sì, è un linguaggio strano.)

Ecco il codice:

        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)]
        ;

Vorrei consigliare di non usare ciecamente da soli per la linea orientata Fortran, come ignoro numeri di riga, e compilatori diversi hanno regole diverse per i caratteri di commento e di continuazione validi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top