Я работаю над личным проектом, который использует пользовательский файл конфигурации. Основной формат файла выглядит так:
[users]
name: bob
attributes:
hat: brown
shirt: black
another_section:
key: value
key2: value2
name: sally
sex: female
attributes:
pants: yellow
shirt: red
Может быть произвольное количество пользователей, и у каждого могут быть разные пары ключ / значение, и в разделе могут быть вложенные ключи / значения с использованием табуляции. Я знаю, что я могу использовать json, yaml или даже xml для этого конфигурационного файла, однако сейчас я бы хотел сохранить его на заказ.
Синтаксический анализ не должен быть сложным, поскольку я уже написал код для его анализа. Мой вопрос заключается в том, как лучше всего выполнить синтаксический анализ этого кода, используя clean и структурированный код, а также писать так, чтобы в будущем не было затруднений ( может быть несколько гнезд в будущем). Прямо сейчас мой код выглядит крайне отвратительно. Например,
private void parseDocument() {
String current;
while((current = reader.readLine()) != null) {
if(current.equals("") || current.startsWith("#")) {
continue; //comment
}
else if(current.startsWith("[users]")) {
parseUsers();
}
else if(current.startsWith("[backgrounds]")) {
parseBackgrounds();
}
}
}
private void parseUsers() {
String current;
while((current = reader.readLine()) != null) {
if(current.startsWith("attributes:")) {
while((current = reader.readLine()) != null) {
if(current.startsWith("\t")) {
//add user key/values to User object
}
else if(current.startsWith("another_section:")) {
while((current = reader.readLine()) != null) {
if(current.startsWith("\t")) {
//add user key/values to new User object
}
else if (current.equals("")) {
//newline means that a new user is up to parse next
}
}
}
}
}
else if(!current.isEmpty()) {
//
}
}
}
Как видите, код довольно грязный, и я сократил его для презентации здесь. Я чувствую, что есть и лучшие способы сделать это, возможно, не используя BufferedReader. Может ли кто-нибудь, возможно, предложить лучший способ или подход, который не так запутан, как мой?