Dovrebbe essere abbastanza semplice scrivere il parser per questo se si utilizzano gli stream. Si può leggere un file usando un std::ifstream
:
std::ifstream ifs("filename.ext");
if(!ifs.good()) throw my_exceptions("cannot open file");
read_file(ifs);
Poiché sembra orientato alla linea, si dovrebbe quindi leggere prima le linee, e quindi elaborare questi:
void read_file(std::istream& is)
{
for(;;) {
std::string line;
std::getline(is, line);
if(!is) break;
std::istringstream iss(line);
// read from iss
}
if(!is.eof()) throw my_exceptions("error reading file");
}
Per l'analisi vera e propria, si potrebbe 1)
prima sbirciare il primo personaggio. Se questo è un [
, espellilo dallo stream e usa std::getline(is,identifier,']')
per leggere qualsiasi cosa si trovi tra "[" e "]". Se non è un [
, utilizzare std::getline(is, key, '=')
per leggere il lato sinistro di una coppia chiave-valore, quindi std::getline(is, value)
per leggere il lato destro.
Nota: l'ingresso del flusso, sfortunatamente, di solito non è esattamente velocissimo. (Questo non deve essere così, ma in pratica lo è spesso.) Tuttavia, è davvero facile da fare ed è abbastanza facile farlo bene, una volta che conosci pochissimi schemi per lavorare con le sue peculiarità (come if(strm.good())
non è lo stesso di if(strm)
e non è l'opposto di if(strm.bad())
e poche altre cose a cui dovrete abituarvi). Per qualcosa di critico dal punto di vista delle prestazioni (har har!) Come la lettura di un file ini dal disco, dovrebbe essere abbastanza veloce in 999.999 su 1.000.000 di casi.
Se si scrive il proprio formato che probabilmente devono scrivere il proprio parser. Vedi http://stackoverflow.com/questions/1669/learning-to-write-a-compiler – dmckee