Skip to content

Commit 74acf0f

Browse files
committed
Детализация ошибок при поиске опций и аргументов oscript-library#78
1 parent d861858 commit 74acf0f

12 files changed

+256
-179
lines changed

src/core/Классы/internal/parser/Классы/АргументыПарсера.os

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@
1313
// Выполняет поиск аргумента в массиве входящих аргументов
1414
//
1515
// Параметры:
16-
// ВходящиеАргументы - массив - входящие аргументы приложения
17-
// КонтекстПоиска - Объект - класс "КонтекстПарсера"
16+
// ВходящиеАргументы - Массив - входящие аргументы приложения
17+
// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера
1818
//
1919
// Возвращаемое значение:
20-
// Структура - структура описания токена
21-
// * РезультатПоиска - булево - признак успешного поиска
22-
// * Аргументы - Массив - массив оставшихся аргументов после поиска
20+
// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра
2321
//
2422
Функция Поиск(Знач ВходящиеАргументы, КонтекстПоиска) Экспорт
2523

@@ -29,30 +27,36 @@
2927
Аргументы.Добавить(Арг);
3028
КонецЦикла;
3129

32-
Результат = Новый Структура("РезультатПоиска, Аргументы", Аргумент.УстановленаИзПеременнойОкружения, Аргументы);
30+
Результат = Новый РезультатПоискаПараметра(Аргументы, Аргумент.УстановленаИзПеременнойОкружения);
31+
3332
Лог.Отладка(" АргументыПарсера:
3433
|УстановленаИзПеременнойОкружения <%1>
3534
|УстановленаПользователем <%2>", Аргумент.УстановленаИзПеременнойОкружения, Аргумент.УстановленаПользователем);
3635
Если Аргументы.Количество() = 0 Тогда
3736

3837
Если Аргумент.УстановленаИзПеременнойОкружения
3938
И КонтекстПоиска.НеВключенныеАргументы[Аргумент] = Истина Тогда
40-
Результат.РезультатПоиска = Ложь;
39+
Результат.Найден = Ложь;
4140
Иначе
4241
КонтекстПоиска.НеВключенныеАргументы.Вставить(Аргумент, Истина);
4342
КонецЕсли;
43+
44+
Если НЕ (Результат.Найден ИЛИ Аргумент.УстановленаИзПеременнойОкружения) Тогда
45+
Результат.Ошибка = Новый ОшибкаПарсера("Ожидается аргумент %1", 2, Аргумент.Имя);
46+
КонецЕсли;
4447

4548
Возврат Результат;
4649

4750
КонецЕсли;
4851

49-
Если (НЕ КонтекстПоиска.СбросОпций И
50-
СтрНачинаетсяС(Аргументы[0], "-")
51-
И НЕ Аргументы[0] = "-")
52-
ИЛИ ПустаяСтрока(Аргументы[0])
53-
Тогда
52+
Если ПустаяСтрока(Аргументы[0]) Тогда
53+
Результат.Ошибка = Новый ОшибкаПарсера("Ожидается аргумент %1", 1, Аргумент.Имя);
5454
Возврат Результат;
55-
55+
КонецЕсли;
56+
57+
Если НЕ КонтекстПоиска.СбросОпций И СтрНачинаетсяС(Аргументы[0], "-") И НЕ Аргументы[0] = "-" Тогда
58+
Результат.Ошибка = Новый ОшибкаПарсера("Ожидается аргумент %1 вместо опции %2", 1, Аргумент.Имя, Аргументы[0]);
59+
Возврат Результат;
5660
КонецЕсли;
5761

5862
АргументКонтекст = КонтекстПоиска.Аргументы[Аргумент];
@@ -63,10 +67,11 @@
6367
АргументКонтекст.Добавить(Аргументы[0]);
6468
КонтекстПоиска.Аргументы.Вставить(Аргумент, АргументКонтекст);
6569

66-
Результат.РезультатПоиска = Истина;
6770
Аргументы.Удалить(0);
6871

69-
Результат.Аргументы = Аргументы;
72+
Результат.Найден = Истина;
73+
Результат.Аргументы = Аргументы;
74+
7075
Возврат Результат;
7176

7277
КонецФункции

src/core/Классы/internal/parser/Классы/ВсеОпцииПарсера.os

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,11 @@
1515
// Выполняет поиск опций в массиве входящих аргументов
1616
//
1717
// Параметры:
18-
// ВходящиеАргументы - массив - входящие аргументы приложения
19-
// КонтекстПоиска - Объект - класс "КонтекстПарсера"
18+
// ВходящиеАргументы - Массив - входящие аргументы приложения
19+
// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера
2020
//
2121
// Возвращаемое значение:
22-
// Структура - структура описания токена
23-
// * РезультатПоиска - булево - признак успешного поиска
24-
// * Аргументы - Массив - массив оставшихся аргументов после поиска
22+
// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра
2523
//
2624
Функция Поиск(Знач ВходящиеАргументы, КонтекстПоиска) Экспорт
2725

@@ -31,12 +29,10 @@
3129
Аргументы.Добавить(Арг);
3230
КонецЦикла;
3331

34-
Результат = Новый Структура("РезультатПоиска, Аргументы", Ложь, Аргументы);
35-
3632
РезультатПопыткиПоиска = ПопыткаПоиска(Аргументы, КонтекстПоиска);
3733

38-
Если НЕ РезультатПопыткиПоиска.РезультатПоиска Тогда
39-
Возврат Результат;
34+
Если НЕ РезультатПопыткиПоиска.Найден Тогда
35+
Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь, РезультатПопыткиПоиска.Ошибка);
4036
КонецЕсли;
4137

4238
АргументыДляЦикла = РезультатПопыткиПоиска.Аргументы;
@@ -45,29 +41,23 @@
4541

4642
РезультатПопыткиПоискаВЦикле = ПопыткаПоиска(АргументыДляЦикла, КонтекстПоиска);
4743

48-
Если НЕ РезультатПопыткиПоискаВЦикле.РезультатПоиска Тогда
49-
Результат.РезультатПоиска = Истина;
50-
Результат.Аргументы = РезультатПопыткиПоискаВЦикле.Аргументы;
51-
Возврат Результат;
44+
Если НЕ РезультатПопыткиПоискаВЦикле.Найден Тогда
45+
Возврат Новый РезультатПоискаПараметра(РезультатПопыткиПоискаВЦикле.Аргументы, Истина);
5246
КонецЕсли;
5347

5448
АргументыДляЦикла = РезультатПопыткиПоискаВЦикле.Аргументы;
5549

5650
КонецЦикла;
5751

58-
Возврат Результат;
52+
Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь);
5953

6054
КонецФункции
6155

6256
Функция ПопыткаПоиска(Знач Аргументы, КонтекстПоиска)
6357

64-
Результат = Новый Структура("РезультатПоиска, Аргументы", Ложь, Аргументы);
65-
6658
Если Аргументы.Количество() = 0
6759
ИЛИ КонтекстПоиска.СбросОпций Тогда
68-
69-
Возврат Результат;
70-
60+
Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь);
7161
КонецЕсли;
7262

7363
Для каждого ОпцияПоиска Из Опции Цикл
@@ -84,23 +74,23 @@
8474
РезультатПоиска = КлассПоиска.Поиск(Аргументы, КонтекстПоиска);
8575

8676
Лог.Отладка("Длина аргументов <%1> ", Аргументы.Количество());
87-
Лог.Отладка("Результат поиска опции %1 = <%2>", ОпцияПоиска.Ключ.Имя, РезультатПоиска.РезультатПоиска);
77+
Лог.Отладка("Результат поиска опции %1 = <%2>", ОпцияПоиска.Ключ.Имя, РезультатПоиска.Найден);
8878
Лог.Отладка("Длина аргументов после поиска <%1> ", РезультатПоиска.Аргументы.Количество());
8979

90-
Если РезультатПоиска.РезультатПоиска Тогда
80+
Если РезультатПоиска.Найден Тогда
9181

9282
Если ОпцияПоиска.Значение.УстановленаИзПеременнойОкружения Тогда
9383

9484
КонтекстПоиска.НеВключенныеОпции.Вставить(ОпцияПоиска.Значение, Истина);
9585

9686
КонецЕсли;
9787

98-
Возврат Новый Структура("РезультатПоиска, Аргументы", Истина, РезультатПоиска.Аргументы);
88+
Возврат РезультатПоиска;
9989
КонецЕсли;
10090

10191
КонецЦикла;
10292

103-
Возврат Новый Структура("РезультатПоиска, Аргументы", Ложь, Аргументы);
93+
Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь);
10494

10595
КонецФункции
10696

src/core/Классы/internal/parser/Классы/ЛюбойСимвол.os

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
// Выполняет поиск любого парсера в массиве входящих аргументов
22
//
33
// Параметры:
4-
// Аргументы - массив - входящие аргументы приложения
5-
// КонтекстПоиска - Объект - класс "КонтекстПарсера"
4+
// Аргументы - Массив - входящие аргументы приложения
5+
// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера
66
//
77
// Возвращаемое значение:
8-
// Структура - структура описания токена
9-
// * РезультатПоиска - булево - признак успешного поиска
10-
// * Аргументы - Массив - массив оставшихся аргументов после поиска
8+
// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра
119
//
1210
Функция Поиск(Аргументы, КонтекстПоиска) Экспорт
1311

14-
Результат = Новый Структура("РезультатПоиска, Аргументы", Истина, Аргументы);
12+
Результат = Новый РезультатПоискаПараметра(Аргументы, Истина);
1513

1614
Возврат Результат;
1715

src/core/Классы/internal/parser/Классы/ОпцииЗавершениеПарсера.os

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
// Выполняет поиск парсера в массиве входящих аргументов
22
//
33
// Параметры:
4-
// Аргументы - массив - входящие аргументы приложения
5-
// КонтекстПоиска - Объект - класс "КонтекстПарсера"
4+
// Аргументы - Массив - входящие аргументы приложения
5+
// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера
66
//
77
// Возвращаемое значение:
8-
// Структура - структура описания токена
9-
// * РезультатПоиска - булево - признак успешного поиска
10-
// * Аргументы - Массив - массив оставшихся аргументов после поиска
8+
// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра
119
//
1210
Функция Поиск(Аргументы, КонтекстПоиска) Экспорт
1311

14-
Результат = Новый Структура("РезультатПоиска, Аргументы", Истина, Аргументы);
12+
Результат = Новый РезультатПоискаПараметра(Аргументы, Истина);
1513

1614
Возврат Результат;
1715

0 commit comments

Comments
 (0)