Форум программистов, компьютерный форум CyberForum.ru

Рекурсивный парсинг - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.12.2012, 12:03     Рекурсивный парсинг #1
Есть формат на базе XML.
1. Файл начинается с
XML
1
<?xml version="..." encoding="ANSI..."?>
2. Поддерживается единственная кодировка только с латиницей.
3. Корневой тег ещё не утверждён, но будет конкретизирован, другие корневые теги поддерживаться не должны.
4. Версия пишется в специальном дочернем элементе корневого элемента в теге <vertion></vertion>
5. Как и в XML, корневой тег ровно один.
6. Не поддерживаются теги вида
XML
1
<tag/>
, или
XML
1
<tag />
.
7. Не поддерживаются свойства элементов.
8. Как и в XML, элементы могут вкладываться в теги.
9. Вложенный тег вложенного элемента может совпадать с тегом его родителя:
XML
1
2
3
4
<bone>
<bone>
</bone>
</bone>
.
10. Элементы с общим родителем могут иметь совпадающие теги:
XML
1
2
3
4
5
6
<skeleton>
<bone>
</bone>
<bone>
</bone>
</skeleton>
.
11. Элементы с общим родителем могут иметь теги совпадающие и между собой, и с тегом родителя:
XML
1
2
3
4
5
6
<bone>
<bone>
</bone>
<bone>
</bone>
</bone>
.
12. Иногда несколько элементов с совпадающими тегами предваряются их количеством в теге <count></count>, в этом случае каждый такой элемент имеет номер в теге <number></number>, номерация начинается с ноля в пределах одного родителя, номера строго возрастают без пропусков с единичным шагом:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<vertexes>
<count>8</count>
<vertex>
<number>0</number>
<x>-1.0</x>
<y>-1.0</y>
<z>-1.0</z>
</vertex>
<vertex>
<number>1</number>
<x>1.0</x>
<y>-1.0</y>
<z>-1.0</z>
</vertex>
<vertex>
<number>2</number>
<x>-1.0</x>
<y>1.0</y>
<z>-1.0</z>
</vertex>
<vertex>
<number>3</number>
<x>1.0</x>
<y>1.0</y>
<z>-1.0</z>
</vertex>
<vertex>
<number>4</number>
<x>-1.0</x>
<y>-1.0</y>
<z>1.0</z>
</vertex>
<vertex>
<number>5</number>
<x>1.0</x>
<y>-1.0</y>
<z>1.0</z>
</vertex>
<vertex>
<number>6</number>
<x>-1.0</x>
<y>1.0</y>
<z>1.0</z>
</vertex>
<vertex>
<number>7</number>
<x>1.0</x>
<y>1.0</y>
<z>1.0</z>
</vertex>
<vertexes>
.
13. Можно ссылаться на другой тег без учёта иерархии:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<mash>
<vertexes>
<count>8</count>
<vertex>
<number>0</number>
<x>-1.0</x>
<y>-1.0</y>
<z>-1.0</z>
</vertex>
<vertex>
<number>1</number>
<x>1.0</x>
<y>-1.0</y>
<z>-1.0</z>
</vertex>
<vertex>
<number>2</number>
<x>-1.0</x>
<y>1.0</y>
<z>-1.0</z>
</vertex>
<vertex>
<number>3</number>
<x>1.0</x>
<y>1.0</y>
<z>-1.0</z>
</vertex>
<vertex>
<number>4</number>
<x>-1.0</x>
<y>-1.0</y>
<z>1.0</z>
</vertex>
<vertex>
<number>5</number>
<x>1.0</x>
<y>-1.0</y>
<z>1.0</z>
</vertex>
<vertex>
<number>6</number>
<x>-1.0</x>
<y>1.0</y>
<z>1.0</z>
</vertex>
<vertex>
<number>7</number>
<x>1.0</x>
<y>1.0</y>
<z>1.0</z>
</vertex>
<vertexes>
<triangles>
<count>12</count>
<triangle>
<number>0</number>
<a>0</a>
<b>1</b>
<c>2</c>
</triangle>
<triangle>
<number>1</number>
<a>1</a>
<b>3</b>
<c>2</c>
</triangle>
<triangle>
<number>2</number>
<a>0</a>
<b>4</b>
<c>1</c>
</triangle>
<triangle>
<number>3</number>
<a>1</a>
<b>4</b>
<c>5</c>
</triangle>
<triangle>
<number>4</number>
<a>0</a>
<b>2</b>
<c>4</c>
</triangle>
<triangle>
<number>5</number>
<a>2</a>
<b>6</b>
<c>4</c>
</triangle><triangle>
<number>6</number>
<a>1</a>
<b>5</b>
<c>3</c>
</triangle><triangle>
<number>7</number>
<a>3</a>
<b>5</b>
<c>7</c>
</triangle>
<triangle>
<number>8</number>
<a>2</a>
<b>3</b>
<c>6</c>
</triangle>
<triangle>
<number>9</number>
<a>3</a>
<b>7</b>
<c>6</c>
</triangle>
<triangle>
<number>10</number>
<a>4</a>
<b>6</b>
<c>5</c>
</triangle>
<triangle>
<number>11</number>
<a>5</a>
<b>6</b>
<c>7</c>
</triangle>
</triangles>
</mash>
, где <a></a>, <b></b> и <c></c> в <triangle></triangle> ссылаются <number></number> в <vertex></vertex>. Можно ссылаться и на другие теги.
Дана std::string, содержащая текст одного элемента с начальным и концевым тегами.
Надо:
1. Найти текст элемента за вычетом начального и концевого тегов.
2. В цикле перебрать все дочерние элементы, для каждого:
2.1. Найти его текст с начальным с концевым тегами, не путая концевые теги дочернего и внучатого элементов.
2.2. Найти начальный тег.
Как это сделать?
Как зовут американскую ANSI кодировку?

Добавлено через 1 час 23 минуты
Можно ли поиск текста дочернего элемента делать так:
Код
1. std::string left=""
2. От текущей позиции p1 ищем первую открывающую угловую скобку, текущая позиция p2=сразу за ней.
3. От текущей позиции p2 ищем первую закрывающую угловую скобку, текущая позиция p3=сразу перед ней, а p4 сразу за ней.
4. Копируем подстроку от p2 до p3 ними в std::string SubTagCind.
5. От текущей позиции p4 ищем открывающую угловую скобку, текущая позиция p5 сразу за ней, p6 - на ещё следующем символе.
6. От текущей позиции p5 ищем первую закрывающую угловую скобку, текущая позиция p7 сразу перед ней, p9 сразу за ней, а p8 между ними непосредственно на закрывающей угловой скобке.
7. Если в позиции p5 не слеш, то std::string left=std::string left+'/'+подстрока от p5 до p7
8. Если в позиции p5 слеш и std::string left!="", то:
8.1. p1=p9
8.2. Переход к пункту 5.
9. Если в позиции p5 слеш и std::string left=="" и std::string SubTagCind==подстрока от p6 до p7, то:
9.1. От p1 до p8 - текст дочернего узла с начальным и концевым тегом.
9.2. В std::string SubTagCind начальный тег данного узла за вычетом угловых скобок.
9.3. p1 на следующем шаге=p9 на текущем.
10. Если в позиции p5 слеш и std::string left=="" и std::string SubTagCind!=подстрока от p6 до p7, то файл не корректен.
?

Добавлено через 34 секунды
Или есть лучшее решение?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 12:03     Рекурсивный парсинг
Посмотрите здесь:

рекурсивный алгоритм C++
Рекурсивный метод C++
рекурсивный спуск C++
рекурсивный алгоритм C++
C++ рекурсивный алгоритм
C++ Рекурсивный способ и не рекурсивный способ
C++ Рекурсивный алгоритм F
C++ Рекурсивный алгоритм

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.12.2012, 12:27     Рекурсивный парсинг #2
taras atavin, я не понял, почему нельзя просто написать схему (или DTD) для твоего языка и парсить его любым парсером XML?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.12.2012, 15:58  [ТС]     Рекурсивный парсинг #3
И мучаться с его синтаксисмом и выходным форматом? Да и схему я не напишу.

Добавлено через 10 минут
Да и схему я не напишу. Кроме того, у меня семантика некоторых тегов будет зависеть от предковых элементов. Например, в элементе с тегом <vertex></vertex> <body></body> будет означать влияющую кость и поддреживать ровно 2 элемента: <weight></weight> и <name></name>, <name></name> ссылается на <name></name> в <body></body> в другом <body></body> или в <skeleton></skeleton>, где <body></body> будет обязательно содержать: <name></name> <pivot></pivot>, <direct></direct> и <normal></normal> и может содержать теги <count></count> и <body></body>, а означать просто кость. <count></count> относится к подэлементам своего родителя. И тому подобное. Я не уверен, разрешено ли в xml всё это безобразие, но мне плевать, у меня будет так. Номера, кстати, будут шестнадцатеричные восьмизначные, но без h, 0x и тому подобного.
Yandex
Объявления
06.12.2012, 15:58     Рекурсивный парсинг
Ответ Создать тему

Метки
парсинг, Рекурсивный
Опции темы

Текущее время: 00:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru