Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

06.12.2012, 12:03. Просмотров 947. Ответов 2

Есть формат на базе 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 секунды
Или есть лучшее решение?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 12:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсивный парсинг (C++):

рекурсивный спуск - C++
Подскажите книгу где описано рекурсивный спуск!

Рекурсивный рисунок - C++
Господа,добрый день.прошу вашей помощи так как сам уже и не успеваю ничего.Есть задание нарисовать вот такой рисунок У меня уже мозг...

Рекурсивный способ и не рекурсивный способ - C++
Разработать программы по алгоритму с использованием рекурсивной функции и без использования рекурсивной функции. Задание. ...

Рекурсивный алгоритм - C++
Доброго времени суток #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; float rec(int x,int n) { if (n != 0) { ...

Рекурсивный алгоритм - C++
помогите пожалуйста Представить в рекурсивный алгоритм Цикл пока ((proverka=1) и (k&gt;1) ) Если A &gt; A То Начало ...

Рекурсивный алгоритм F - C++
Привет всем! Помогите пожалуйста как решается данная функция, если F = 6. Вот код программы: #include &lt;iostream&gt; int F(int n)...

2
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
06.12.2012, 12:27 #2
taras atavin, я не понял, почему нельзя просто написать схему (или DTD) для твоего языка и парсить его любым парсером XML?
0
taras atavin
3570 / 1753 / 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 и тому подобного.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 15:58
Привет! Вот еще темы с ответами:

Рекурсивный алгоритм - C++
помогите плиз представить в рекурсивный алгоритм Массив A proverka=1 Цикл для i:=1 до 10 делать: Ввод A Конец цикл ...

рекурсивный алгоритм - C++
задание было такое (я не раз обращался с ним уже): построить алгоритм вычисления значения аргумента exp(x) с точностью до &quot;эпсилон&quot; с...

Рекурсивный алгоритм - C++
Даны натуральные числа &quot;N&quot; и &quot;M&quot; надо решить с помощью с++ не могу переставить с этим кодом с++ #include &lt;stdio.h&gt; #include...

Рекурсивный минимум - C++
Здравствуйте Написать программу - Рекурсивный минимум Сначала скажите пожалуйста, что такое рекурсивный минимум ?


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru