Skip to content
Snippets Groups Projects
  • Vasileios Karakasis's avatar
    Better and cleaner parser semantics. · aea81c6d
    Vasileios Karakasis authored
    The parser's semantics are now cleaner and the implementation more
    robust. Cell parsing now follows the semantics of the standard input
    stream (same as of standard UNIX's read), but instead of reading in
    bytes or builtin types, we are reading full cell records. This has the
    following implications:
    
    1. Empty and comment lines are consumed silently.
    2. End-of-file will be set on the stream only if a read operation
       returns zero. Practically, this means, eof bit will be set in the
       stream at the first attempt to read a cell record after the final
       cell record in the stream was read.
    3. Exceptional conditions in the stream (e.g., eof or bad bits) stop the
       parsing process without raising an exception and return control to the
       user which is responsible to deal with them. The only exceptional
       condition that we handle internally is the presence of very long lines,
       in which case we raise an std::runtime_error().
    
    Thanks to these cleaner semantics, the parser is now able to deal with
    files not ending with a new line. The previous version would have missed
    the last record.
    
    Due to (2) the following code for reading from an input stream will
    yield an additional default constructed cell record at the end:
    
    while (!swc_input.eof()) {
        cell_record cell;
        swc_input >> cell;
        // do sth with the cell
    }
    
    According to (2), after the final record is read, eof is not yet set at
    the stream, which means the while loop will be entered one more time.
    The attempt to read a record from the stream then will raise the eof bit
    and no cell will be read in, leaving `cell' at its default constructed
    state. To avoid such a side-effect, the best way to read records from an
    input stream is the following:
    
    cell_record cell;
    while( !(swc_input >> cell).eof()) {
        // do sth with the cell
    }
    
    In this case, after the final record is read, the next attempt to read
    in a record will set the eof bit and won't enter the loop.
    aea81c6d
main.cpp 13.13 KiB