diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" index dd60fe7..e79b804 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" @@ -13,13 +13,11 @@ // Выполняет поиск аргумента в массиве входящих аргументов // // Параметры: -// ВходящиеАргументы - массив - входящие аргументы приложения -// КонтекстПоиска - Объект - класс "КонтекстПарсера" +// ВходящиеАргументы - Массив - входящие аргументы приложения +// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера // // Возвращаемое значение: -// Структура - структура описания токена -// * РезультатПоиска - булево - признак успешного поиска -// * Аргументы - Массив - массив оставшихся аргументов после поиска +// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра // Функция Поиск(Знач ВходящиеАргументы, КонтекстПоиска) Экспорт @@ -29,7 +27,8 @@ Аргументы.Добавить(Арг); КонецЦикла; - Результат = Новый Структура("РезультатПоиска, Аргументы", Аргумент.УстановленаИзПеременнойОкружения, Аргументы); + Результат = Новый РезультатПоискаПараметра(Аргументы, Аргумент.УстановленаИзПеременнойОкружения); + Лог.Отладка(" АргументыПарсера: |УстановленаИзПеременнойОкружения <%1> |УстановленаПользователем <%2>", Аргумент.УстановленаИзПеременнойОкружения, Аргумент.УстановленаПользователем); @@ -37,22 +36,27 @@ Если Аргумент.УстановленаИзПеременнойОкружения И КонтекстПоиска.НеВключенныеАргументы[Аргумент] = Истина Тогда - Результат.РезультатПоиска = Ложь; + Результат.Найден = Ложь; Иначе КонтекстПоиска.НеВключенныеАргументы.Вставить(Аргумент, Истина); КонецЕсли; + + Если НЕ (Результат.Найден ИЛИ Аргумент.УстановленаИзПеременнойОкружения) Тогда + Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргумент(Аргумент.Имя); + КонецЕсли; Возврат Результат; КонецЕсли; - Если (НЕ КонтекстПоиска.СбросОпций И - СтрНачинаетсяС(Аргументы[0], "-") - И НЕ Аргументы[0] = "-") - ИЛИ ПустаяСтрока(Аргументы[0]) - Тогда + Если ПустаяСтрока(Аргументы[0]) Тогда + Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргумент(Аргумент.Имя); Возврат Результат; - + КонецЕсли; + + Если НЕ КонтекстПоиска.СбросОпций И СтрНачинаетсяС(Аргументы[0], "-") И НЕ Аргументы[0] = "-" Тогда + Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргументВместоОпции(Аргумент.Имя, Аргументы[0]); + Возврат Результат; КонецЕсли; АргументКонтекст = КонтекстПоиска.Аргументы[Аргумент]; @@ -63,10 +67,11 @@ АргументКонтекст.Добавить(Аргументы[0]); КонтекстПоиска.Аргументы.Вставить(Аргумент, АргументКонтекст); - Результат.РезультатПоиска = Истина; Аргументы.Удалить(0); - Результат.Аргументы = Аргументы; + Результат.Найден = Истина; + Результат.Аргументы = Аргументы; + Возврат Результат; КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\201\320\265\320\236\320\277\321\206\320\270\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\201\320\265\320\236\320\277\321\206\320\270\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" index ca1b570..d342114 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\201\320\265\320\236\320\277\321\206\320\270\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\201\320\265\320\236\320\277\321\206\320\270\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" @@ -15,13 +15,11 @@ // Выполняет поиск опций в массиве входящих аргументов // // Параметры: -// ВходящиеАргументы - массив - входящие аргументы приложения -// КонтекстПоиска - Объект - класс "КонтекстПарсера" +// ВходящиеАргументы - Массив - входящие аргументы приложения +// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера // // Возвращаемое значение: -// Структура - структура описания токена -// * РезультатПоиска - булево - признак успешного поиска -// * Аргументы - Массив - массив оставшихся аргументов после поиска +// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра // Функция Поиск(Знач ВходящиеАргументы, КонтекстПоиска) Экспорт @@ -31,12 +29,10 @@ Аргументы.Добавить(Арг); КонецЦикла; - Результат = Новый Структура("РезультатПоиска, Аргументы", Ложь, Аргументы); - РезультатПопыткиПоиска = ПопыткаПоиска(Аргументы, КонтекстПоиска); - Если НЕ РезультатПопыткиПоиска.РезультатПоиска Тогда - Возврат Результат; + Если НЕ РезультатПопыткиПоиска.Найден Тогда + Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь, РезультатПопыткиПоиска.Ошибка); КонецЕсли; АргументыДляЦикла = РезультатПопыткиПоиска.Аргументы; @@ -45,29 +41,23 @@ РезультатПопыткиПоискаВЦикле = ПопыткаПоиска(АргументыДляЦикла, КонтекстПоиска); - Если НЕ РезультатПопыткиПоискаВЦикле.РезультатПоиска Тогда - Результат.РезультатПоиска = Истина; - Результат.Аргументы = РезультатПопыткиПоискаВЦикле.Аргументы; - Возврат Результат; + Если НЕ РезультатПопыткиПоискаВЦикле.Найден Тогда + Возврат Новый РезультатПоискаПараметра(РезультатПопыткиПоискаВЦикле.Аргументы, Истина); КонецЕсли; АргументыДляЦикла = РезультатПопыткиПоискаВЦикле.Аргументы; КонецЦикла; - Возврат Результат; + Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь); КонецФункции Функция ПопыткаПоиска(Знач Аргументы, КонтекстПоиска) - Результат = Новый Структура("РезультатПоиска, Аргументы", Ложь, Аргументы); - Если Аргументы.Количество() = 0 ИЛИ КонтекстПоиска.СбросОпций Тогда - - Возврат Результат; - + Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь); КонецЕсли; Для каждого ОпцияПоиска Из Опции Цикл @@ -84,10 +74,10 @@ РезультатПоиска = КлассПоиска.Поиск(Аргументы, КонтекстПоиска); Лог.Отладка("Длина аргументов <%1> ", Аргументы.Количество()); - Лог.Отладка("Результат поиска опции %1 = <%2>", ОпцияПоиска.Ключ.Имя, РезультатПоиска.РезультатПоиска); + Лог.Отладка("Результат поиска опции %1 = <%2>", ОпцияПоиска.Ключ.Имя, РезультатПоиска.Найден); Лог.Отладка("Длина аргументов после поиска <%1> ", РезультатПоиска.Аргументы.Количество()); - Если РезультатПоиска.РезультатПоиска Тогда + Если РезультатПоиска.Найден Тогда Если ОпцияПоиска.Значение.УстановленаИзПеременнойОкружения Тогда @@ -95,12 +85,18 @@ КонецЕсли; - Возврат Новый Структура("РезультатПоиска, Аргументы", Истина, РезультатПоиска.Аргументы); + Возврат РезультатПоиска; + + КонецЕсли; + + Если ЗначениеЗаполнено(РезультатПоиска.Ошибка) + И ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка) Тогда + Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь, РезультатПоиска.Ошибка); КонецЕсли; КонецЦикла; - Возврат Новый Структура("РезультатПоиска, Аргументы", Ложь, Аргументы); + Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь); КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\321\216\320\261\320\276\320\271\320\241\320\270\320\274\320\262\320\276\320\273.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\321\216\320\261\320\276\320\271\320\241\320\270\320\274\320\262\320\276\320\273.os" index 80050c0..565a60d 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\321\216\320\261\320\276\320\271\320\241\320\270\320\274\320\262\320\276\320\273.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\321\216\320\261\320\276\320\271\320\241\320\270\320\274\320\262\320\276\320\273.os" @@ -1,17 +1,15 @@ // Выполняет поиск любого парсера в массиве входящих аргументов // // Параметры: -// Аргументы - массив - входящие аргументы приложения -// КонтекстПоиска - Объект - класс "КонтекстПарсера" +// Аргументы - Массив - входящие аргументы приложения +// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера // // Возвращаемое значение: -// Структура - структура описания токена -// * РезультатПоиска - булево - признак успешного поиска -// * Аргументы - Массив - массив оставшихся аргументов после поиска +// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра // Функция Поиск(Аргументы, КонтекстПоиска) Экспорт - Результат = Новый Структура("РезультатПоиска, Аргументы", Истина, Аргументы); + Результат = Новый РезультатПоискаПараметра(Аргументы, Истина); Возврат Результат; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\227\320\260\320\262\320\265\321\200\321\210\320\265\320\275\320\270\320\265\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\227\320\260\320\262\320\265\321\200\321\210\320\265\320\275\320\270\320\265\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" index e8f7b2f..ecf00a0 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\227\320\260\320\262\320\265\321\200\321\210\320\265\320\275\320\270\320\265\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\227\320\260\320\262\320\265\321\200\321\210\320\265\320\275\320\270\320\265\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" @@ -1,17 +1,15 @@ // Выполняет поиск парсера в массиве входящих аргументов // // Параметры: -// Аргументы - массив - входящие аргументы приложения -// КонтекстПоиска - Объект - класс "КонтекстПарсера" +// Аргументы - Массив - входящие аргументы приложения +// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера // // Возвращаемое значение: -// Структура - структура описания токена -// * РезультатПоиска - булево - признак успешного поиска -// * Аргументы - Массив - массив оставшихся аргументов после поиска +// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра // Функция Поиск(Аргументы, КонтекстПоиска) Экспорт - Результат = Новый Структура("РезультатПоиска, Аргументы", Истина, Аргументы); + Результат = Новый РезультатПоискаПараметра(Аргументы, Истина); Возврат Результат; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" index 9fac891..a22d8e6 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" @@ -13,16 +13,14 @@ КонецПроцедуры -// Выполняет поиск парсера в массиве входящих аргументов +// Выполняет поиск опции в массиве входящих аргументов // // Параметры: -// ВходящиеАргументы - массив - входящие аргументы приложения -// КонтекстПоиска - Объект - класс "КонтекстПарсера" +// ВходящиеАргументы - Массив - входящие аргументы приложения +// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера // // Возвращаемое значение: -// Структура - структура описания токена -// * РезультатПоиска - булево - признак успешного поиска -// * Аргументы - Массив - массив оставшихся аргументов после поиска +// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра // Функция Поиск(Знач ВходящиеАргументы, КонтекстПоиска) Экспорт @@ -32,7 +30,7 @@ Аргументы.Добавить(Арг); КонецЦикла; - Результат = Новый Структура("РезультатПоиска, Аргументы", Ложь, Аргументы); + Результат = Новый РезультатПоискаПараметра(Аргументы); Лог.Отладка("Начало поиска опции"); Лог.Отладка("Количество входящих аргументов %1", Аргументы.Количество()); @@ -40,9 +38,13 @@ ИЛИ КонтекстПоиска.СбросОпций Тогда Лог.Отладка("Не найдено аргументов <%1> или СбросОпций <%2>", Аргументы.Количество(), КонтекстПоиска.СбросОпций ); - Результат.РезультатПоиска = Опция.УстановленаИзПеременнойОкружения; - Возврат Результат; + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; + + Если НЕ (Результат.Найден ИЛИ КонтекстПоиска.СбросОпций) Тогда + Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпция(Опция.Имя); + КонецЕсли; + Возврат Результат; КонецЕсли; Индекс = 0; @@ -55,50 +57,52 @@ Индекс = Индекс + 1; Продолжить; ИначеЕсли ТекущийАргумент = "--" Тогда - Результат.РезультатПоиска = Опция.УстановленаИзПеременнойОкружения; + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; Возврат Результат; ИначеЕсли СтрНачинаетсяС(ТекущийАргумент, "--") Тогда - РезультатПоискаДлиннойОпции = НайтиДлиннуюОпцию(Аргументы, Индекс, КонтекстПоиска); - Лог.Отладка("Длинная опция найдена: %1", РезультатПоискаДлиннойОпции.Найден); - Если РезультатПоискаДлиннойОпции.Найден Тогда - Результат.РезультатПоиска = Истина; - Результат.Аргументы = РезультатПоискаДлиннойОпции.Аргументы; - Возврат Результат; - + РезультатПоиска = НайтиДлиннуюОпцию(Аргументы, Индекс, КонтекстПоиска); + Лог.Отладка("Длинная опция найдена: %1", РезультатПоиска.Найден); + Если РезультатПоиска.Найден Тогда + Возврат РезультатПоиска; КонецЕсли; - Если РезультатПоискаДлиннойОпции.ПрибавочныйИндекс = 0 Тогда - Возврат Новый Структура("РезультатПоиска, Аргументы", Опция.УстановленаИзПеременнойОкружения, Аргументы); + Результат.Ошибка = РезультатПоиска.Ошибка; + + Если РезультатПоиска.ДополнительныеСвойства.ПрибавочныйИндекс = 0 Тогда + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; + Результат.Аргументы = Аргументы; + Возврат Результат; КонецЕсли; - Индекс = Индекс + РезультатПоискаДлиннойОпции.ПрибавочныйИндекс; + Индекс = Индекс + РезультатПоиска.ДополнительныеСвойства.ПрибавочныйИндекс; ИначеЕсли СтрНачинаетсяС(ТекущийАргумент, "-") Тогда - РезультатПоискаКороткойОпции = НайтиКороткуюОпцию(Аргументы, Индекс, КонтекстПоиска); - Лог.Отладка("Короткая опция найдена: %1", РезультатПоискаКороткойОпции.Найден); - Если РезультатПоискаКороткойОпции.Найден Тогда - Результат.РезультатПоиска = Истина; - Результат.Аргументы = РезультатПоискаКороткойОпции.Аргументы; - Возврат Результат; - + РезультатПоиска = НайтиКороткуюОпцию(Аргументы, Индекс, КонтекстПоиска); + Лог.Отладка("Короткая опция найдена: %1", РезультатПоиска.Найден); + Если РезультатПоиска.Найден Тогда + Возврат РезультатПоиска; КонецЕсли; - Если РезультатПоискаКороткойОпции.ПрибавочныйИндекс = 0 Тогда - Возврат Новый Структура("РезультатПоиска, Аргументы", Опция.УстановленаИзПеременнойОкружения, Аргументы); + Результат.Ошибка = РезультатПоиска.Ошибка; + + Если РезультатПоиска.ДополнительныеСвойства.ПрибавочныйИндекс = 0 Тогда + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; + Результат.Аргументы = Аргументы; + Возврат Результат; КонецЕсли; - Индекс = Индекс + РезультатПоискаКороткойОпции.ПрибавочныйИндекс; + Индекс = Индекс + РезультатПоиска.ДополнительныеСвойства.ПрибавочныйИндекс; Иначе - Результат.РезультатПоиска = Опция.УстановленаИзПеременнойОкружения; + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; Возврат Результат; КонецЕсли; КонецЦикла; - Результат.РезультатПоиска = Опция.УстановленаИзПеременнойОкружения; + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; Возврат Результат; КонецФункции @@ -109,28 +113,33 @@ ТекущийАргумент = Аргументы[Индекс]; - Результат = Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); - - Если СтрДлина(ТекущийАргумент) < 2 Тогда - - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); - + Если СтрДлина(ТекущийАргумент) < 2 Тогда + Возврат РезультатПоискаОтрицательный(Аргументы); КонецЕсли; Если Сред(ТекущийАргумент, 3, 1) = "=" Тогда + Результат = РезультатПоискаОтрицательный(Аргументы); + Имя = Лев(ТекущийАргумент, 2); КлассОпции = ОпцииИндекс[Имя]; - Если Не КлассОпции.имя = Опция.Имя Тогда - Результат.ПрибавочныйИндекс = 1; + Если КлассОпции = Неопределено Тогда + Лог.Отладка("Неопределенная опция: %1", Строка(Имя)); + Результат.Ошибка = ОшибкиПарсера.ОшибкаНеожидаемаяОпция(Имя); Возврат Результат; + КонецЕсли; + Если Не КлассОпции.Имя = Опция.Имя Тогда + Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, Имя); + Результат.ДополнительныеСвойства.ПрибавочныйИндекс = 1; + Возврат Результат; КонецЕсли; Значение = Сред(ТекущийАргумент, 4); Если ПустаяСтрока(СокрЛП(Значение)) Тогда + Результат.Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеПослеЗнакаРавноДляОпции(Имя); Возврат Результат; КонецЕсли; @@ -142,9 +151,9 @@ КонтекстПоиска.Опции.Вставить(Опция, ОпцииКонтекст); Аргументы.Удалить(Индекс); - Результат.ПрибавочныйИндекс = 1; - Результат.Аргументы = Аргументы; - Результат.Найден = Истина; + Результат.ДополнительныеСвойства.ПрибавочныйИндекс = 1; + Результат.Аргументы = Аргументы; + Результат.Найден = Истина; Возврат Результат; @@ -157,6 +166,7 @@ Лог.Отладка("Строка опции: %1", ИщемОпцию.ВСтроку(ИИ)); + Ошибка = Неопределено; Пока Не ПустаяСтрока(ИщемОпцию.ВСтрокуС(ИИ)) Цикл ИмяОпции = ИщемОпцию.ВСтроку(ИИ, ИИ); @@ -167,8 +177,8 @@ Если КлассОпции = Неопределено Тогда Лог.Отладка("Неопределенная опция: %1", Строка(ИмяОпции)); - - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); + Ошибка = ?(Ошибка = Неопределено, ОшибкиПарсера.ОшибкаНеожидаемаяОпция(ИмяОпции), Ошибка); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; Лог.Отладка("КлассОпции.ТипОпции: %1 ", КлассОпции.ТипОпции); @@ -178,7 +188,8 @@ Если Не КлассОпции.Имя = Опция.Имя Тогда ИИ = ИИ + 1; - Лог.Отладка("Не нашли опцию %1, %2 <> %3", ИмяОпции, КлассОпции.Имя, Опция.Имя); + Лог.Отладка("Не нашли опцию %1, %2 <> %3", ИмяОпции, КлассОпции.Имя, Опция.Имя); + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); Продолжить; КонецЕсли; @@ -190,7 +201,6 @@ Лог.Отладка("Добавили.значение <%2> опции <%1> в контекст", Опция.Имя , Истина); КонтекстПоиска.Опции.Вставить(Опция, ОпцииКонтекст); - Результат.Найден = Истина; Лог.Отладка("Вычисление остаточного ими от <%1> до индекса <%2> после индекса <%3> ", ИщемОпцию.ВСтроку(), ИщемОпцию.ВСтрокуПо(ИИ - 1), @@ -199,11 +209,11 @@ Лог.Отладка("Остаточное имя <%1> опции ", ОстаточноеИмя ); Если ПустаяСтрока(ОстаточноеИмя) Тогда Аргументы.Удалить(Индекс); - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 1); КонецЕсли; Аргументы[Индекс] = "-" + ОстаточноеИмя; - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 0, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы); КонецЕсли; @@ -212,18 +222,24 @@ Если ПустаяСтрока(Значение) Тогда Если Аргументы.Вграница() - Индекс = 0 Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); - КонецЕсли; + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); + Иначе + Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции); + КонецЕсли; + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); + КонецЕсли; - Если Не КлассОпции.имя = Опция.Имя Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 2, Аргументы); - КонецЕсли; + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 2); + КонецЕсли; Значение = Аргументы[Индекс + 1]; - Лог.Отладка("Значение найденной опции равно <%1>", Значение ); + Лог.Отладка("Значение найденной опции равно <%1>", Значение); Если СтрНачинаетсяС(Значение, "-") Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); + Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции)); КонецЕсли; ОпцииКонтекст = КонтекстПоиска.Опции[Опция]; @@ -239,20 +255,21 @@ Аргументы.Удалить(Индекс); Аргументы.Удалить(Индекс); - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 2, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 2); КонецЕсли; НовыйАргумент = СтрЗаменить(ИщемОпцию.ВСтроку(), ИмяОпции, ""); Аргументы[Индекс] = "-" + НовыйАргумент; - Аргументы.Удалить(Индекс + 1); // удаление значения, + Аргументы.Удалить(Индекс + 1); // удаление значения - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 1); КонецЕсли; - Если Не КлассОпции.имя = Опция.Имя Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 1, Аргументы); + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1); КонецЕсли; ОпцииКонтекст = КонтекстПоиска.Опции[Опция]; @@ -270,17 +287,21 @@ Если ПустаяСтрока(ОстатокИмени) Тогда Аргументы.Удалить(Индекс); // удаление значения, т.к. индекс уже сдвинулся. - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 1); КонецЕсли; Аргументы[Индекс] = "-" + ОстатокИмени; - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 0, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 0); КонецЦикла; - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 1, Аргументы); + Если Не ЗначениеЗаполнено(Ошибка) Тогда + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпция(Опция.Имя); + КонецЕсли; + + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1); КонецФункции @@ -298,24 +319,25 @@ КлассОпции = ОпцииИндекс[ИмяОпции]; Лог.Отладка("Класс опции по имени %1", КлассОпции); - Если КлассОпции = Неопределено Тогда - - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); - + Если КлассОпции = Неопределено Тогда + Ошибка = ОшибкиПарсера.ОшибкаНеожидаемаяОпция(ИмяОпции); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; Если МассивСтрокаАргумента.Количество() = 2 Тогда Лог.Отладка("Строка содержит <=> второй элемент массива %1", МассивСтрокаАргумента[1]); - Если Не КлассОпции.имя = Опция.Имя Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 1, Аргументы); + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1); КонецЕсли; Значение = МассивСтрокаАргумента[1]; Если ПустаяСтрока(Значение) Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); + Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; ОпцииКонтекст = КонтекстПоиска.Опции[Опция]; @@ -328,13 +350,14 @@ Аргументы.Удалить(Индекс); - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 1); ИначеЕсли КлассОпции.ТипОпции = Тип("Булево") Или КлассОпции.ТипОпции = Тип("Массив") И КлассОпции.ТипЭлементаОпции = Тип("Булево") Тогда - Если Не КлассОпции.имя = Опция.Имя Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 1, Аргументы); + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1); КонецЕсли; ОпцииКонтекст = КонтекстПоиска.Опции[Опция]; @@ -346,30 +369,36 @@ Аргументы.Удалить(Индекс); - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 1); Иначе Лог.Отладка("Разница между <%1> и %2 меньше 2", Аргументы.Вграница(), Индекс); - Если Аргументы.Количество() - Индекс < 2 Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); + Если Аргументы.Количество() - Индекс < 2 Тогда + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); + Иначе + Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции); + КонецЕсли; + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; - Если Не КлассОпции.имя = Опция.Имя Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 2, Аргументы); + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 2); КонецЕсли; Значение = Аргументы[Индекс + 1]; Если СтрНачинаетсяС(Значение, "-") Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); + Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции)); КонецЕсли; Лог.Отладка("Значение длинной опции <%1>", Значение); Если ПустаяСтрока(Значение) Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); + Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции)); КонецЕсли; ОпцииКонтекст = КонтекстПоиска.Опции[Опция]; @@ -382,7 +411,7 @@ Аргументы.Удалить(Индекс); Аргументы.Удалить(Индекс); // удаление значения, т.к. индекс уже сдвинулся. - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 1); КонецЕсли; КонецФункции @@ -405,4 +434,16 @@ Возврат "-" + Опция.Имя; КонецФункции +Функция РезультатПоискаОтрицательный(Аргументы, Ошибка = Неопределено, ПрибавочныйИндекс = 0) + РезультатПоиска = Новый РезультатПоискаПараметра(Аргументы, Ложь, Ошибка); + РезультатПоиска.ДополнительныеСвойства.Вставить("ПрибавочныйИндекс", ПрибавочныйИндекс); + Возврат РезультатПоиска; +КонецФункции + +Функция РезультатПоискаПоложительный(Аргументы, ПрибавочныйИндекс = 0) + РезультатПоиска = Новый РезультатПоискаПараметра(Аргументы, Истина); + РезультатПоиска.ДополнительныеСвойства.Вставить("ПрибавочныйИндекс", ПрибавочныйИндекс); + Возврат РезультатПоиска; +КонецФункции + Лог = Логирование.ПолучитьЛог("oscript.lib.cli_class_opt"); \ No newline at end of file diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200.os" index f1d583b..079acd4 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200.os" @@ -52,7 +52,7 @@ Лог.Отладка("Начинаю чтение спека %1", Спек); Лог.Отладка("Количество токенов %1", ТокеныПарсера.Количество()); - Результат = ПрочитатьРекурсивно(Ложь); + Результат = ПрочитатьРекурсивно(Ложь, Истина); Если Не КонецТокенов() Тогда ВызватьИсключение "Косяк ппц что делать"; @@ -63,12 +63,12 @@ КонечноеСостояние.Завершено = Истина; НачальноеСостояние.Подготовить(); - + Возврат НачальноеСостояние; КонецФункции -Функция ПрочитатьРекурсивно(Требуется) +Функция ПрочитатьРекурсивно(Требуется, Обязательное) Лог.Отладка("Рекурсивное чтение %1", Требуется); @@ -77,10 +77,10 @@ Если Требуется Тогда - Результат = ТокенВыбора(); + Результат = ТокенВыбора(Обязательное); Для каждого Соединение Из Результат.НачальноеСостояние.МассивСоединений Цикл - КонечноеСостояние.Т(Соединение.Парсер, Соединение.СледующееСостояние); + КонечноеСостояние.Т(Соединение.Парсер, Соединение.СледующееСостояние, Соединение.Обязательное); КонецЦикла; КонечноеСостояние = Результат.КонечноеСостояние; @@ -89,10 +89,10 @@ Пока МогуПрочитать() Цикл - РезультатВЦикле = ТокенВыбора(); + РезультатВЦикле = ТокенВыбора(Обязательное); Для каждого Соединение Из РезультатВЦикле.НачальноеСостояние.МассивСоединений Цикл - КонечноеСостояние.Т(Соединение.Парсер, Соединение.СледующееСостояние); + КонечноеСостояние.Т(Соединение.Парсер, Соединение.СледующееСостояние, Соединение.Обязательное); КонецЦикла; КонечноеСостояние = РезультатВЦикле.КонечноеСостояние; @@ -103,7 +103,7 @@ КонецФункции -Функция ЧтениеДалее() +Функция ЧтениеДалее(Обязательное) Лог.Отладка("Вызов <ЧтениеДалее>"); @@ -123,7 +123,9 @@ ВызватьИсключение "Нашли не объявленный аргумент"; КонецЕсли; - КонечноеСостояние = НачальноеСостояние.Т(Новый АргументыПарсера(КлассОпции), ОбработчикВыборкиПути.НовоеСостояние()); + КонечноеСостояние = НачальноеСостояние.Т(Новый АргументыПарсера(КлассОпции), + ОбработчикВыборкиПути.НовоеСостояние(), + Обязательное); ИначеЕсли НашлиТокен(ТипыТокенов.TTOptions) Тогда @@ -133,7 +135,7 @@ ВызватьИсключение "нет опций после --"; КонецЕсли; КонечноеСостояние = ОбработчикВыборкиПути.НовоеСостояние(); - НачальноеСостояние.Т(Новый ВсеОпцииПарсера(Опции, ОпцииИндекс), КонечноеСостояние); + НачальноеСостояние.Т(Новый ВсеОпцииПарсера(Опции, ОпцииИндекс), КонечноеСостояние, Ложь); ИначеЕсли НашлиТокен(ТипыТокенов.TTShortOpt) ИЛИ НашлиТокен(ТипыТокенов.TTLongOpt) Тогда @@ -156,7 +158,8 @@ КонецЕсли; КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцияПарсера(КлассОпции, ОпцииИндекс), - ОбработчикВыборкиПути.НовоеСостояние()); + ОбработчикВыборкиПути.НовоеСостояние(), + Обязательное); Лог.Отладка(" >> НачальноеСостояние.МассивСоединений: %1", НачальноеСостояние.МассивСоединений.Количество()); НашлиТокен(ТипыТокенов.TTOptValue); // Пропуск значение после "=" @@ -193,30 +196,32 @@ КонецЦикла; - НачальноеСостояние.Т(Новый ВсеОпцииПарсера(МассивДоступныхОпций, ОпцииИндекс), КонечноеСостояние); + НачальноеСостояние.Т(Новый ВсеОпцииПарсера(МассивДоступныхОпций, ОпцииИндекс), КонечноеСостояние, Ложь); ИначеЕсли НашлиТокен(ТипыТокенов.TTOpenPar) Тогда - РезультатЧтения = ПрочитатьРекурсивно(Истина); + РезультатЧтения = ПрочитатьРекурсивно(Истина, Истина); НачальноеСостояние = РезультатЧтения.НачальноеСостояние; КонечноеСостояние = РезультатЧтения.КонечноеСостояние; - + ОжидаюТокен(ТипыТокенов.TTClosePar); - + ИначеЕсли НашлиТокен(ТипыТокенов.TTOpenSq) Тогда - РезультатЧтения = ПрочитатьРекурсивно(Истина); + + РезультатЧтения = ПрочитатьРекурсивно(Истина, Ложь); НачальноеСостояние = РезультатЧтения.НачальноеСостояние; КонечноеСостояние = РезультатЧтения.КонечноеСостояние; - НачальноеСостояние.Т(Новый ЛюбойСимвол(), КонечноеСостояние); - + НачальноеСостояние.Т(Новый ЛюбойСимвол(), КонечноеСостояние, Ложь); + ОжидаюТокен(ТипыТокенов.TTCloseSq); ИначеЕсли НашлиТокен(ТипыТокенов.TTDoubleDash) Тогда СкинутьОпции = Истина; - КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцииЗавершениеПарсера(), ОбработчикВыборкиПути.НовоеСостояние()); + КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцииЗавершениеПарсера(), + ОбработчикВыборкиПути.НовоеСостояние(), Ложь); Возврат Новый Структура("НачальноеСостояние, КонечноеСостояние", НачальноеСостояние, КонечноеСостояние); Иначе @@ -224,7 +229,7 @@ КонецЕсли; Если НашлиТокен(ТипыТокенов.TTRep) Тогда - КонечноеСостояние.Т(Новый ЛюбойСимвол(), НачальноеСостояние); + КонечноеСостояние.Т(Новый ЛюбойСимвол(), НачальноеСостояние, Ложь); КонецЕсли; @@ -236,14 +241,14 @@ КонецФункции -Функция ТокенВыбора() +Функция ТокенВыбора(Обязательное) Лог.Отладка("Вызов <ТокенВыбора>"); НачальноеСостояние = ОбработчикВыборкиПути.НовоеСостояние(); КонечноеСостояние = ОбработчикВыборкиПути.НовоеСостояние(); - Результат = ЧтениеДалее(); + Результат = ЧтениеДалее(Обязательное); НачальноеСостояние.Т(Новый ЛюбойСимвол(), Результат.НачальноеСостояние); Результат.КонечноеСостояние.Т(Новый ЛюбойСимвол(), КонечноеСостояние); @@ -251,7 +256,7 @@ Пока НашлиТокен(ТипыТокенов.TTChoice) Цикл Лог.Отладка("Нашли токен %1", ТипыТокенов.TTChoice); - РезультатВЦикле = ЧтениеДалее(); + РезультатВЦикле = ЧтениеДалее(Обязательное); НачальноеСостояние.Т(Новый ЛюбойСимвол(), РезультатВЦикле.НачальноеСостояние); РезультатВЦикле.КонечноеСостояние.Т(Новый ЛюбойСимвол(), КонечноеСостояние); diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\237\320\276\320\270\321\201\320\272\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\237\320\276\320\270\321\201\320\272\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260.os" new file mode 100644 index 0000000..2627b53 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\237\320\276\320\270\321\201\320\272\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260.os" @@ -0,0 +1,25 @@ + +// Признак успешного поиска +Перем Найден Экспорт; // Булево + +// Массив оставшихся аргументов после поиска +Перем Аргументы Экспорт; // Массив + +// Ошибка +Перем Ошибка Экспорт; // см. ОшибкиПарсера.НоваяОшибка + +// Дополнительные свойства +Перем ДополнительныеСвойства Экспорт; // Структура + +Процедура ПриСозданииОбъекта(АргументыПослеПоиска = Неопределено, ПараметрНайден = Ложь, ОшибкаПоиска = Неопределено) + + Найден = ПараметрНайден; + Ошибка = ОшибкаПоиска; + ДополнительныеСвойства = Новый Структура(); + + Аргументы = АргументыПослеПоиска; + Если Аргументы = Неопределено Тогда + Аргументы = Новый Массив(); + КонецЕсли; + +КонецПроцедуры \ No newline at end of file diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\321\210\320\270\320\261\320\272\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\321\210\320\270\320\261\320\272\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" new file mode 100644 index 0000000..4d049b3 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\321\210\320\270\320\261\320\272\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260.os" @@ -0,0 +1,99 @@ +Функция НоваяОшибка(Текст, Приоритет = 0) Экспорт + Возврат Новый Структура("Текст, Приоритет", Текст, Приоритет); +КонецФункции + +Функция ОшибкиВСтроку(Ошибки, ТолькоСМаксимальнымПриоритетом = Ложь) Экспорт + + Разделитель = "; "; + + МаксПриоритет = Неопределено; + Если ТолькоСМаксимальнымПриоритетом Тогда + МаксПриоритет = 0; + Для Каждого Ошибка Из Ошибки Цикл + МаксПриоритет = Макс(МаксПриоритет, Ошибка.Приоритет); + КонецЦикла; + КонецЕсли; + + МассивОшибок = Новый Массив(); + Для Каждого Ошибка Из Ошибки Цикл + Если (Ошибка.Приоритет = МаксПриоритет ИЛИ МаксПриоритет = Неопределено) + И МассивОшибок.Найти(Ошибка.Текст) = Неопределено Тогда + МассивОшибок.Добавить(Ошибка.Текст); + КонецЕсли; + КонецЦикла; + + Возврат СтрСоединить(МассивОшибок, Разделитель); + +КонецФункции + +Функция ОшибкаТребуетВнимания(Ошибка) Экспорт + Возврат Ошибка.Приоритет > 1; +КонецФункции + +#Область ОшибкиПрочие + +Функция ОшибкаНеожидаемыйПараметр(Имя) Экспорт + Текст = СтрШаблон("Неожидаемый параметр %1", Имя); + Возврат НоваяОшибка(Текст, 1); +КонецФункции + +#КонецОбласти + +#Область ОшибкиОпции + +Функция ОшибкаТребуетсяЗначениеДляОпции(Имя) Экспорт + Текст = СтрШаблон("Опция %1 должна содержать значение", ВосстановитьТиреПередОпцией(Имя)); + Возврат НоваяОшибка(Текст, 2); +КонецФункции + +Функция ОшибкаТребуетсяЗначениеПослеЗнакаРавноДляОпции(Имя) Экспорт + Текст = СтрШаблон("Опция %1 должна содержать значение после знака =", ВосстановитьТиреПередОпцией(Имя)); + Возврат НоваяОшибка(Текст, 2); +КонецФункции + +Функция ОшибкаНеожидаемаяОпция(Имя) Экспорт + Текст = СтрШаблон("Неожидаемая опция %1", ВосстановитьТиреПередОпцией(Имя)); + Возврат НоваяОшибка(Текст, 1); +КонецФункции + +Функция ОшибкаОжидаетсяОпция(Имя) Экспорт + Текст = СтрШаблон("Ожидается опция %1", ВосстановитьТиреПередОпцией(Имя)); + Возврат НоваяОшибка(Текст, 1); +КонецФункции + +Функция ОшибкаОжидаетсяОпцияВместо(Имя, ИмяВместо) Экспорт + Текст = СтрШаблон("Ожидается опция %1 вместо %2", + ВосстановитьТиреПередОпцией(Имя), + ВосстановитьТиреПередОпцией(ИмяВместо)); + Возврат НоваяОшибка(Текст, 1); +КонецФункции + +#КонецОбласти + +#Область ОшибкиАргумента + +Функция ОшибкаОжидаетсяАргумент(Имя) Экспорт + Текст = СтрШаблон("Ожидается аргумент %1", Имя); + Возврат НоваяОшибка(Текст, 1); +КонецФункции + +Функция ОшибкаОжидаетсяАргументВместоОпции(Имя, ИмяОпции) Экспорт + Текст = СтрШаблон("Ожидается аргумент %1 вместо опции %2", Имя, ВосстановитьТиреПередОпцией(ИмяОпции)); + Возврат НоваяОшибка(Текст, 1); +КонецФункции + +#КонецОбласти + +Функция ВосстановитьТиреПередОпцией(Имя) + + Если СтрНачинаетсяС(Имя, "-") Тогда + Возврат Имя; + КонецЕсли; + + Если СтрДлина(Имя) > 1 Тогда + Возврат "--" + Имя; + Иначе + Возврат "-" + Имя; + КонецЕсли; + +КонецФункции \ No newline at end of file diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/path/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\277\320\260\320\264\320\265\320\275\320\270\320\265.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/path/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\277\320\260\320\264\320\265\320\275\320\270\320\265.os" index 36570f9..839f513 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/path/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\277\320\260\320\264\320\265\320\275\320\270\320\265.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/path/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\277\320\260\320\264\320\265\320\275\320\270\320\265.os" @@ -16,25 +16,26 @@ КонецПроцедуры -// Процедура добавляет соединению к текущему состоянию +// Процедура добавляет соединение к текущему состоянию // // Параметры: // Парсер - Объект - ссылка на произвольный класс парсера // СледующееСостояние - Объект.Совпадение - ссылка на класс Совпадение, следующего состояния +// Обязательное - Булево - обязательное соединение // // Возвращаемое значение: // Объект.Совпадение - ссылка на класс Совпадение, следующего состояния // -Функция Т(Парсер, СледующееСостояние) Экспорт +Функция Т(Парсер, СледующееСостояние, Обязательное = Ложь) Экспорт - МассивСоединений.Добавить(НовоеСоединениеСовпадений(Парсер, СледующееСостояние)); + МассивСоединений.Добавить(НовоеСоединениеСовпадений(Парсер, СледующееСостояние, Обязательное)); Возврат СледующееСостояние; КонецФункции -Функция НовоеСоединениеСовпадений(Парсер, СледующееСостояние) +Функция НовоеСоединениеСовпадений(Парсер, СледующееСостояние, Обязательное) - Возврат Новый Структура("Парсер, СледующееСостояние", Парсер, СледующееСостояние); + Возврат Новый Структура("Парсер, СледующееСостояние, Обязательное", Парсер, СледующееСостояние, Обязательное); КонецФункции @@ -56,31 +57,31 @@ // ВходящиеАргументы - Массив - массив входящих аргументов, типа строка // // Возвращаемое значение: -// булево - результат чтения параметров, -// * истина - все найдено -// * ложь - завершено с ошибками +// Структура: +// * Успешно - Булево - результат поиска параметров: +// * Истина - все найдено +// * Ложь - завершено с ошибками +// * Ошибки - Массив из Строка - массив ошибок // Функция Прочитать(ВходящиеАргументы) Экспорт Контекст = Новый КонтекстПарсеров; - Успех = ПрименитьКонтекст(ВходящиеАргументы, Контекст); + Результат = ПрименитьКонтекст(ВходящиеАргументы, Контекст); - Если Не Успех Тогда - Возврат Ложь; - КонецЕсли; + Если Результат.Успешно Тогда - ОбработчикВыборкиПути = Новый ВыборСовпадений(); - - ОбработчикВыборкиПути.ЗаполнитьЗначения(Контекст.Опции); + ОбработчикВыборкиПути = Новый ВыборСовпадений(); + ОбработчикВыборкиПути.ЗаполнитьЗначения(Контекст.Опции); + ОбработчикВыборкиПути.ЗаполнитьЗначения(Контекст.Аргументы); + + Лог.Отладка("Проверка контекста: + | количество опций: %1 + | количество аргументов %2", Контекст.Опции.Количество(), Контекст.Аргументы.Количество()); - ОбработчикВыборкиПути.ЗаполнитьЗначения(Контекст.Аргументы); - - Лог.Отладка("Проверка контекста: - | количество опций: %1 - | количество аргументов %2", Контекст.Опции.Количество(), Контекст.Аргументы.Количество()); + КонецЕсли; - Возврат истина; + Возврат Результат; КонецФункции @@ -91,9 +92,11 @@ // Контекст - Объект - ссылка на класс "КонтекстПарсеров" // // Возвращаемое значение: -// булево - результат поиска параметров, -// * истина - все найдено -// * ложь - завершено с ошибками +// Структура: +// * Успешно - Булево - результат поиска параметров: +// * Истина - все найдено +// * Ложь - завершено с ошибками +// * Ошибки - Массив из Строка - массив ошибок // Функция ПрименитьКонтекст(Знач ВходящиеАргументы, Контекст) Экспорт @@ -102,9 +105,12 @@ | количество входящих аргументов %2 | Завершено: %3", МассивСоединений.Количество(), ВходящиеАргументы.Количество(), Завершено); + Результат = Новый Структура("Успешно, Ошибки", Ложь, Новый Массив()); + Если Завершено И ВходящиеАргументы.Количество() = 0 Тогда - Возврат Истина; + Результат.Успешно = Истина; + Возврат Результат; КонецЕсли; Если ВходящиеАргументы.Количество() > 0 Тогда @@ -120,7 +126,7 @@ МассивСовпадений = Новый Массив; - Лог.Отладка("Перебираю возможные пути: %1", МассивСоединений.Количество() ); + Лог.Отладка("Перебираю возможные пути: %1", МассивСоединений.Количество()); Номер = 1; Для каждого Соединение Из МассивСоединений Цикл Лог.Отладка("Перебираю путь номер: %1", Номер); @@ -130,29 +136,52 @@ РезультатПоиска = Соединение.Парсер.Поиск(ВходящиеАргументы, ЧистыйКонтекст); - Лог.Отладка("Нашли опцию или аргумент: %2 %1", РезультатПоиска.РезультатПоиска, Соединение.Парсер.ВСтроку() ); + Лог.Отладка("Нашли опцию или аргумент: %2 %1", РезультатПоиска.Найден, Соединение.Парсер.ВСтроку()); лог.Отладка("Количество опций в контексте: %1", ЧистыйКонтекст.Опции.Количество()); лог.Отладка("Количество аргументов после поиска: %1", РезультатПоиска.Аргументы.Количество()); - Если РезультатПоиска.РезультатПоиска Тогда + Если РезультатПоиска.Найден Тогда Лог.Отладка("Добавляю в массив найденное значение"); МассивСовпадений.Добавить(НовоеСовпадение(Соединение, РезультатПоиска.Аргументы, ЧистыйКонтекст)); КонецЕсли; + Если ЗначениеЗаполнено(РезультатПоиска.Ошибка) + И (Соединение.Обязательное ИЛИ ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка)) Тогда + Результат.Ошибки.Добавить(РезультатПоиска.Ошибка); + КонецЕсли; + Номер = Номер + 1; КонецЦикла; + + Если МассивСовпадений.Количество() Тогда + Результат.Ошибки.Очистить(); + КонецЕсли; Для каждого ЭлементСовпадения Из МассивСовпадений Цикл СледующееСостояние = ЭлементСовпадения.Соединение.СледующееСостояние; - Если СледующееСостояние.ПрименитьКонтекст(ЭлементСовпадения.Результат, ЭлементСовпадения.Контекст) Тогда + РезультатСледующего = СледующееСостояние.ПрименитьКонтекст(ЭлементСовпадения.Результат, ЭлементСовпадения.Контекст); + Если РезультатСледующего.Успешно Тогда Контекст.ПрисоединитьКонтекст(ЭлементСовпадения.Контекст); - Возврат Истина; + Возврат РезультатСледующего; КонецЕсли; + Для Каждого Ошибка Из РезультатСледующего.Ошибки Цикл + Результат.Ошибки.Добавить(Ошибка); + КонецЦикла; + КонецЦикла; - Возврат Ложь; + Если Результат.Ошибки.Количество() = 0 И ВходящиеАргументы.Количество() > 0 Тогда + ПервыйАргумент = ВходящиеАргументы[0]; + Если СтрНачинаетсяС(ПервыйАргумент, "-") Тогда + Результат.Ошибки.Добавить(ОшибкиПарсера.ОшибкаНеожидаемаяОпция(ПервыйАргумент)); + Иначе + Результат.Ошибки.Добавить(ОшибкиПарсера.ОшибкаНеожидаемыйПараметр(ПервыйАргумент)); + КонецЕсли; + КонецЕсли; + + Возврат Результат; КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index 78be19d..2085898 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -408,12 +408,18 @@ КонецЦикла; Лог.Отладка("Читаю аргументы строки"); - ОшибкаЧтения = Не НачальноеСостояние.Прочитать(МассивАргументовКПарсингу); + Результат = НачальноеСостояние.Прочитать(МассивАргументовКПарсингу); - Если ОшибкаЧтения Тогда - Лог.КритичнаяОшибка("Ошибка чтения параметров команды"); + Если Не Результат.Успешно Тогда + ТекстОшибки = "Ошибка чтения параметров команды"; + + Если Результат.Ошибки.Количество() Тогда + ТекстОшибки = ТекстОшибки + ": " + ОшибкиПарсера.ОшибкиВСтроку(Результат.Ошибки, Истина); + КонецЕсли; + + Лог.КритичнаяОшибка(ТекстОшибки); ВывестиСправку(); - ВызватьИсключение "Ошибка чтения параметров команды"; + ВызватьИсключение ТекстОшибки; КонецЕсли; ВыполнитьДействиеКоманды("ПередВыполнениемКоманды"); diff --git "a/tests/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" "b/tests/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" index d123d08..cba2b8d 100644 --- "a/tests/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" +++ "b/tests/\320\220\321\200\320\263\321\203\320\274\320\265\320\275\321\202\321\213\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" @@ -54,9 +54,9 @@ Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); Если Тест.ЗначениеОпции = Неопределено Тогда - Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Аргумент не должен быть найден"); + Утверждения.ПроверитьЛожь(Результат.Найден, "Аргумент не должен быть найден"); Иначе - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Аргумент должен быть найден"); + Утверждения.ПроверитьИстину(Результат.Найден, "Аргумент должен быть найден"); Утверждения.ПроверитьРавенство(1, Контекст.Аргументы[Парсер_Аргумента.Аргумент].Количество(), "Количество результатов должно быть 1"); Утверждения.ПроверитьРавенство(Контекст.Аргументы[Парсер_Аргумента.Аргумент][0], Тест.ЗначениеОпции, "Ожидаемые результаты должны быть равны"); Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны"); @@ -115,7 +115,7 @@ Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Аргумент должен быть найден"); + Утверждения.ПроверитьИстину(Результат.Найден, "Аргумент должен быть найден"); Утверждения.ПроверитьРавенство(1, Контекст.Аргументы[Парсер_Аргумента.Аргумент].Количество(), "Количество результатов должно быть 1"); Утверждения.ПроверитьРавенство(Контекст.Аргументы[Парсер_Аргумента.Аргумент][0], Тест.ЗначениеОпции, "Ожидаемые результаты должны быть равны"); Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны"); diff --git "a/tests/\320\222\321\201\320\265\320\236\320\277\321\206\320\270\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" "b/tests/\320\222\321\201\320\265\320\236\320\277\321\206\320\270\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" index 0b408fd..c4d2978 100644 --- "a/tests/\320\222\321\201\320\265\320\236\320\277\321\206\320\270\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" +++ "b/tests/\320\222\321\201\320\265\320\236\320\277\321\206\320\270\320\270\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" @@ -90,7 +90,7 @@ Контекст = Новый КонтекстПарсеров(); Результат = О_Парсера.Поиск(АргументыТеста, Контекст); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опции должны быть найдены"); + Утверждения.ПроверитьИстину(Результат.Найден, "Опции должны быть найдены"); Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны"); @@ -105,7 +105,7 @@ КонтекстСброса = Новый КонтекстПарсеров(); КонтекстСброса.СбросОпций = Истина; Результат = О_Парсера.Поиск(АргументыТеста, КонтекстСброса); - Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Любые опции не должны быть найдены"); + Утверждения.ПроверитьЛожь(Результат.Найден, "Любые опции не должны быть найдены"); КонецЦикла; @@ -174,11 +174,11 @@ Контекст = Новый КонтекстПарсеров(); Результат = О_Парсера.Поиск(АргументыТеста, Контекст); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опции должны быть найдены"); + Утверждения.ПроверитьИстину(Результат.Найден, "Опции должны быть найдены"); Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); Результат = О_Парсера.Поиск(АргументыТеста, Контекст); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опции должны быть найдены"); + Утверждения.ПроверитьИстину(Результат.Найден, "Опции должны быть найдены"); Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны"); @@ -195,7 +195,7 @@ КонтекстСброса = Новый КонтекстПарсеров(); КонтекстСброса.СбросОпций = Истина; Результат = О_Парсера.Поиск(АргументыТеста, КонтекстСброса); - Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Любые опции не должны быть найдены"); + Утверждения.ПроверитьЛожь(Результат.Найден, "Любые опции не должны быть найдены"); КонецЦикла; diff --git "a/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" "b/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" index 6002abb..8ed0847 100644 --- "a/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" +++ "b/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" @@ -52,6 +52,7 @@ ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКоманды"); ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеОпцийИАргументовРодителяКомандыПервогоУровня"); + ИменаТестов.Добавить("ТестДолжен_ПроверитьТекстОшибок"); Возврат ИменаТестов; @@ -427,6 +428,109 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьТекстОшибок() Экспорт + + РазделительОшибок = "; "; + + Команда = ПодготовитьТестовуюКоманду(); + Команда.Аргумент("ARG", "", "Тест").ТСтрока(); + Команда.Опция("f force", "", "Тест").ТСтрока(); + Команда.Опция("b bool", "", "Тест").ТБулево(); + Команда.Опция("s string", "", "Тест").ТСтрока(); + + ТестовыеСлучаи = Новый Массив(); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x", "-f", ОшибкиПарсера.ОшибкаНеожидаемаяОпция("x"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val -x", "-f", ОшибкиПарсера.ОшибкаНеожидаемаяОпция("x"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-xb", "-f", ОшибкиПарсера.ОшибкаНеожидаемаяОпция("x"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-bx", "-f", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("f", "b"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b", "-f -s", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("f", "b"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val -b", "-f -s", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("s", "b"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-s", "-f", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("f", "s"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val -s", "-f -b", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("b", "s"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val -s val", "-f -b", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("b", "s"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val", "-f -s", ОшибкиПарсера.ОшибкаОжидаетсяОпция("s"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f", "-f", ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции("f"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f", "[-f]", ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции("f"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f", "-f | -s", ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции("f"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b=", "-b", ОшибкиПарсера.ОшибкаТребуетсяЗначениеПослеЗнакаРавноДляОпции("b"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b=", "[-b]", ОшибкиПарсера.ОшибкаТребуетсяЗначениеПослеЗнакаРавноДляОпции("b"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x=false", "-b", ОшибкиПарсера.ОшибкаНеожидаемаяОпция("x"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG", "-f", ОшибкиПарсера.ОшибкаНеожидаемыйПараметр("ARG"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[-f | -b] -s", ОшибкиПарсера.ОшибкаОжидаетсяОпция("s"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b", "[-b] -s", ОшибкиПарсера.ОшибкаОжидаетсяОпция("s"))); + + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--long", "--force", ОшибкиПарсера.ОшибкаНеожидаемаяОпция("long"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force val --long", "--force", ОшибкиПарсера.ОшибкаНеожидаемаяОпция("long"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--bool", "--force", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("f", "bool"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--string", "--force", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("f", "string"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force val --bool", "--force --string", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("s", "bool"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force val --string", "--force --bool", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("b", "string"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force val --string val", "--force --bool", ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо("b", "string"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force val", "--force --string", ОшибкиПарсера.ОшибкаОжидаетсяОпция("s"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--force", "--force", ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции("force"))); + + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x", "[ОПЦИИ]", ОшибкиПарсера.ОшибкаНеожидаемаяОпция("x"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f", "[ОПЦИИ]", ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции("f"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b=", "[ОПЦИИ]", ОшибкиПарсера.ОшибкаТребуетсяЗначениеПослеЗнакаРавноДляОпции("b"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG", "[ОПЦИИ]", ОшибкиПарсера.ОшибкаНеожидаемыйПараметр("ARG"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b ARG", "[ARG] [ОПЦИИ]", ОшибкиПарсера.ОшибкаНеожидаемыйПараметр("ARG"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b ARG", "ARG [ОПЦИИ]", ОшибкиПарсера.ОшибкаОжидаетсяАргументВместоОпции("ARG", "b"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[ОПЦИИ] ARG", ОшибкиПарсера.ОшибкаОжидаетсяАргумент("ARG"))); + + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "ARG", ОшибкиПарсера.ОшибкаОжидаетсяАргумент("ARG"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -x", "ARG", ОшибкиПарсера.ОшибкаНеожидаемаяОпция("x"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x ARG", "ARG", ОшибкиПарсера.ОшибкаОжидаетсяАргументВместоОпции("ARG", "x"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG SRC", "ARG", ОшибкиПарсера.ОшибкаНеожидаемыйПараметр("SRC"))); + + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -x", "ARG -f", ОшибкиПарсера.ОшибкаНеожидаемаяОпция("x"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG", "ARG -f", ОшибкиПарсера.ОшибкаОжидаетсяОпция("f"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[ARG] -f", ОшибкиПарсера.ОшибкаОжидаетсяОпция("f"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val", "-f ARG", ОшибкиПарсера.ОшибкаОжидаетсяАргумент("ARG"))); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[-f] ARG", ОшибкиПарсера.ОшибкаОжидаетсяАргумент("ARG"))); + + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "(-f | -b) -s", + ОшибкиПарсера.ОшибкаОжидаетсяОпция("f").Текст + + РазделительОшибок + + ОшибкиПарсера.ОшибкаОжидаетсяОпция("b").Текст)); + + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[ARG] [-s] ((-f [-s | ARG]) | -b) -s", + ОшибкиПарсера.ОшибкаОжидаетсяОпция("f").Текст + + РазделительОшибок + + ОшибкиПарсера.ОшибкаОжидаетсяОпция("b").Текст)); + + Для Каждого ТестовыйСлучай Из ТестовыеСлучаи Цикл + + Команда.Спек = ТестовыйСлучай.Спек; + Команда.НачалоЗапуска(); + + ПараметрыМетода = Новый Массив(); + ПараметрыМетода.Добавить(ТестовыйСлучай.Аргументы); + + ТекстИсключения = ""; + Попытка + Рефлектор = Новый Рефлектор; + Рефлектор.ВызватьМетод(Команда, "Запуск", ПараметрыМетода); + Исключение + ТекстИсключения = ОписаниеОшибки(); + + ПодстрокаПоиска = "Ошибка чтения параметров команды: "; + НачальныйНомер = СтрНайти(ТекстИсключения, ПодстрокаПоиска) + СтрДлина(ПодстрокаПоиска); + КоличествоСимволов = СтрДлина(ТекстИсключения) - НачальныйНомер; + ТекстИсключения = Сред(ТекстИсключения, НачальныйНомер, КоличествоСимволов); + КонецПопытки; + + Если ТипЗнч(ТестовыйСлучай.Результат) = Тип("Структура") Тогда + Результат = ТестовыйСлучай.Результат.Текст; + Иначе + Результат = ТестовыйСлучай.Результат; + КонецЕсли; + + Ожидаем.Что(ТекстИсключения).Равно(Результат); + + КонецЦИкла; + +КонецПроцедуры + Функция ПодготовитьТестовуюКоманду(Спек = "") Команда = Новый КомандаПриложения("testapp", "Тестовое приложения", ЭтотОбъект); @@ -554,6 +658,5 @@ КонецПроцедуры - Лог = Логирование.ПолучитьЛог("oscript.lib.cli_command"); //Лог.УстановитьУровень(УровниЛога.Отладка); \ No newline at end of file diff --git "a/tests/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" "b/tests/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" index ceb64c3..c8c1333 100644 --- "a/tests/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" +++ "b/tests/\320\236\320\277\321\206\320\270\321\217\320\237\320\260\321\200\321\201\320\265\321\200\320\260_test.os" @@ -57,7 +57,7 @@ Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.Аргументы, " ")); Контекст = Новый КонтекстПарсеров(); Результат = О_Парсера.Поиск(Тест.Аргументы, Контекст); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должен быть найдена"); + Утверждения.ПроверитьИстину(Результат.Найден, "Опция (-f) должен быть найдена"); Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны"); @@ -67,7 +67,7 @@ КонтекстСброса = Новый КонтекстПарсеров(); КонтекстСброса.СбросОпций = Истина; Результат = О_Парсера.Поиск(Тест.Аргументы, КонтекстСброса); - Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Опция (-f) не должена быть найдена"); + Утверждения.ПроверитьЛожь(Результат.Найден, "Опция (-f) не должена быть найдена"); КонецЦикла; @@ -114,11 +114,11 @@ Контекст = Новый КонтекстПарсеров(); Результат = О_Парсера.Поиск(Тест.Аргументы, Контекст); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должен быть найдена"); + Утверждения.ПроверитьИстину(Результат.Найден, "Опция (-f) должен быть найдена"); Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); Результат = О_Парсера.Поиск(Результат.Аргументы, Контекст); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должен быть найдена"); + Утверждения.ПроверитьИстину(Результат.Найден, "Опция (-f) должен быть найдена"); Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); МассивЗначений = Новый Массив; @@ -132,7 +132,7 @@ КонтекстСброса = Новый КонтекстПарсеров(); КонтекстСброса.СбросОпций = Истина; Результат = О_Парсера.Поиск(Тест.Аргументы, КонтекстСброса); - Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Опция (-f) не должена быть найдена"); + Утверждения.ПроверитьЛожь(Результат.Найден, "Опция (-f) не должена быть найдена"); КонецЦикла; @@ -193,7 +193,7 @@ Контекст = Новый КонтекстПарсеров(); Результат = О_Парсера.Поиск(АргументыТеста, Контекст); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должна быть найдена"); + Утверждения.ПроверитьИстину(Результат.Найден, "Опция (-f) должна быть найдена"); Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); Утверждения.ПроверитьРавенство(СтрСоединить(Результат.Аргументы, " "), СтрСоединить(Тест.АргументыВыхода, " "), "Аргументы выходные должны быть равны"); @@ -203,7 +203,7 @@ КонтекстСброса = Новый КонтекстПарсеров(); КонтекстСброса.СбросОпций = Истина; Результат = О_Парсера.Поиск(АргументыТеста, КонтекстСброса); - Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Опция (-f) не должна быть найдена"); + Утверждения.ПроверитьЛожь(Результат.Найден, "Опция (-f) не должна быть найдена"); КонецЦикла; @@ -259,11 +259,11 @@ Контекст = Новый КонтекстПарсеров(); Результат = О_Парсера.Поиск(АргументыТеста, Контекст); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должна быть найдена"); + Утверждения.ПроверитьИстину(Результат.Найден, "Опция (-f) должна быть найдена"); Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); Результат = О_Парсера.Поиск(Результат.Аргументы, Контекст); - Утверждения.ПроверитьИстину(Результат.РезультатПоиска, "Опция (-f) должна быть найдена"); + Утверждения.ПроверитьИстину(Результат.Найден, "Опция (-f) должна быть найдена"); Утверждения.ПроверитьРавенство(НачальноеКоличество, Тест.Аргументы.Количество(), "Количество аргументов не должно измениться"); @@ -273,7 +273,7 @@ КонтекстСброса = Новый КонтекстПарсеров(); КонтекстСброса.СбросОпций = Истина; Результат = О_Парсера.Поиск(АргументыТеста, КонтекстСброса); - Утверждения.ПроверитьЛожь(Результат.РезультатПоиска, "Опция (-f) не должна быть найдена"); + Утверждения.ПроверитьЛожь(Результат.Найден, "Опция (-f) не должна быть найдена"); КонецЦикла;