Преобразовать строку в древовидное представление с помощью правил

Я должен сделать простой разбор текста 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. Это просто сделать на бумаге, но когда я затем пытаюсь реализовать реальную логику для перехода вниз, я продолжаю все путать.

Есть ли более прямой способ сделать эту структуру? (или есть лучшая структура, которую я должен использовать ). Я бы подумал, что должна быть какая-то библиотека, позволяющая преобразовывать строки в деревья, но я не могу ее найти.

7
задан Konrad Rudolph 4 May 2012 в 08:59
поделиться