Sẽ khá dễ dàng để viết trình phân tích cú pháp của riêng bạn nếu bạn sử dụng luồng. Bạn có thể đọc một tập tin sử dụng một std::ifstream
:
std::ifstream ifs("filename.ext");
if(!ifs.good()) throw my_exceptions("cannot open file");
read_file(ifs);
Kể từ khi có vẻ như dòng theo định hướng, sau đó bạn sẽ lần đầu tiên đọc dòng này, và sau đó xử lý sau đây:
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");
}
Đối với phân tích thực tế, bạn có thể 1)
lần đầu tiên nhìn vào nhân vật đầu tiên. Nếu đó là số [
, hãy bật nó từ luồng và sử dụng std::getline(is,identifier,']')
để đọc bất kỳ nội dung nào nằm trong '[' và ']'. Nếu đó không phải là [
, hãy sử dụng std::getline(is, key, '=')
để đọc phía bên trái của cặp khóa-giá trị và sau đó std::getline(is, value)
để đọc phía bên phải.
Lưu ý: Đầu vào luồng, thật không may, thường không chính xác nhanh như chớp. (Điều này không phải như vậy, nhưng trong thực tế điều này thường là.) Tuy nhiên, nó thực sự dễ làm và nó khá dễ dàng để làm điều đó đúng, một khi bạn biết rất ít mô hình để làm việc với các đặc thù của nó (như if(strm.good())
không giống như if(strm)
và không phải là đối diện của if(strm.bad())
và một số thứ khác bạn sẽ phải quen với việc sử dụng). Đối với một cái gì đó như là hiệu suất quan trọng (har har!) Như đọc một tập tin ini từ đĩa, nó phải đủ nhanh trong 999,999 trong số 1.000.000 trường hợp.
Nếu bạn viết định dạng của riêng mình, bạn có thể phải viết trình phân tích cú pháp của riêng bạn. Xem http://stackoverflow.com/questions/1669/learning-to-write-a-compiler – dmckee