Я должен сделать простой разбор текста RTF, мне нужно исправить ошибку. Дана следующая строка:
{aaaaaaa\}aaaa\{aaaaa{bbbbbbbb{ccccc\{cccc}bbb{eeeee}{{gggg}ffff}bbbbbb}aaaaa}
Где:
\ means ignore next character
{ means expand
} means collapse up to parent
В любой точке строки на состояние может повлиять любой предыдущий символ, кроме символов в закрытых тегах. например, {gggg} не повлияет на ffff, но aaaaaaa}aaa.. повлияет на bbbb, ccc, eee, ggg, fff
и так далее.
Исходя из этого, мы можем разделить приведенное выше только на значимые блоки
A1 = aaaaaaa\}aaaa\{aaaaa
B1 = bbbbbbbb
C = ccccc\{cccc
B2 = bbb
E = eeeee
G = gggg
F = ffff
B3 = bbbbbb
A2 = aaaaa
Уступка:
{A1{B1{C}B2{E}{{G}F}B3}A2}
Для описания зависимости я использовал X > Y означает, что Y зависит от X (, так как в X может измениться значение Y)
A1
A1 > B1
A1 > B1 > C
A1 > B1 > B2
A1 > B1 > B2 > E
A1 > B1 > B2 > G
A1 > B1 > B2 > F
A1 > B1 > B2 > B3
A1 > B1 > B2 > A2
A1 > A2
Итак, если у нас есть узел, который может иметь значение и упорядоченный список вложенных значений. Чтобы дерево значений выглядело так :
A1
- B1
- - C
- - B2
- - - E
- - - G
- - - F
- - - B3
- A2
. Затем, чтобы получить символы, влияющие на любой узел, я могу просто рекурсивно пройти через каждого родителя.
На чем я постоянно застреваю, так это на попытке разобрать строку в мой класс узла.:
public class myNode
{
public myNode Parent;
public string Value;
public List<myNode> subNodes;
}
Я читаю строку символ за символом, когда встречаю \
я увеличиваю ее на два. Когда я встречаю {
, я сохраняю предыдущий текстовый раздел как значение узла и вхожу в дочерний элемент, а когда я встречаю }
, я ухожу.
Но я постоянно путаю логику, особенно для G
и A2
. Это просто сделать на бумаге, но когда я затем пытаюсь реализовать реальную логику для перехода вниз, я продолжаю все путать.
Есть ли более прямой способ сделать эту структуру? (или есть лучшая структура, которую я должен использовать ). Я бы подумал, что должна быть какая-то библиотека, позволяющая преобразовывать строки в деревья, но я не могу ее найти.