From 895ac828a4db095470c2bbebdbb444e65b6b5f0c Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Thu, 21 Nov 2024 01:20:03 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=B5=D1=82=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=D0=B5=20=D0=BE=D0=BF=D1=86=D0=B8=D0=B9=20=D0=B8=20=D0=B0?= =?UTF-8?q?=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20#78?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\200\321\201\320\265\321\200\320\260.os" | 43 ++-- ...21\200\321\201\320\265\321\200\320\260.os" | 36 +-- ...20\270\320\274\320\262\320\276\320\273.os" | 10 +- ...21\200\321\201\320\265\321\200\320\260.os" | 10 +- ...21\200\321\201\320\265\321\200\320\260.os" | 243 ++++++++++++------ ...20\260\321\200\321\201\320\265\321\200.os" | 15 +- ...20\274\320\265\321\202\321\200\320\260.os" | 25 ++ ...20\264\320\265\320\275\320\270\320\265.os" | 75 ++++-- ...20\266\320\265\320\275\320\270\321\217.os" | 14 +- ...0\321\201\320\265\321\200\320\260_test.os" | 6 +- ...0\321\201\320\265\321\200\320\260_test.os" | 10 +- ...6\320\265\320\275\320\270\321\217_test.os" | 66 +++++ ...0\321\201\320\265\321\200\320\260_test.os" | 20 +- 13 files changed, 388 insertions(+), 185 deletions(-) create mode 100644 "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" 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..670bbb2 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" @@ -2,24 +2,24 @@ // Ссылка на класс аргумента Перем Аргумент Экспорт; +Перем Обязательный Экспорт; // Булево Перем Лог; -Процедура ПриСозданииОбъекта(КлассОпции) +Процедура ПриСозданииОбъекта(КлассОпции, ОбязательныйАргумент = Истина) Аргумент = КлассОпции; + Обязательный = ОбязательныйАргумент; КонецПроцедуры // Выполняет поиск аргумента в массиве входящих аргументов // // Параметры: -// ВходящиеАргументы - массив - входящие аргументы приложения -// КонтекстПоиска - Объект - класс "КонтекстПарсера" +// ВходящиеАргументы - Массив - входящие аргументы приложения +// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера // // Возвращаемое значение: -// Структура - структура описания токена -// * РезультатПоиска - булево - признак успешного поиска -// * Аргументы - Массив - массив оставшихся аргументов после поиска +// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра // Функция Поиск(Знач ВходящиеАргументы, КонтекстПоиска) Экспорт @@ -29,7 +29,8 @@ Аргументы.Добавить(Арг); КонецЦикла; - Результат = Новый Структура("РезультатПоиска, Аргументы", Аргумент.УстановленаИзПеременнойОкружения, Аргументы); + Результат = Новый РезультатПоискаПараметра(Аргументы, Аргумент.УстановленаИзПеременнойОкружения); + Лог.Отладка(" АргументыПарсера: |УстановленаИзПеременнойОкружения <%1> |УстановленаПользователем <%2>", Аргумент.УстановленаИзПеременнойОкружения, Аргумент.УстановленаПользователем); @@ -37,22 +38,31 @@ Если Аргумент.УстановленаИзПеременнойОкружения И КонтекстПоиска.НеВключенныеАргументы[Аргумент] = Истина Тогда - Результат.РезультатПоиска = Ложь; + Результат.Найден = Ложь; Иначе КонтекстПоиска.НеВключенныеАргументы.Вставить(Аргумент, Истина); КонецЕсли; + + Если Обязательный И НЕ (Результат.Найден ИЛИ Аргумент.УстановленаИзПеременнойОкружения) Тогда + Результат.Ошибка = СтрШаблон("Ожидается аргумент %1", Аргумент.Имя); + КонецЕсли; Возврат Результат; КонецЕсли; - Если (НЕ КонтекстПоиска.СбросОпций И - СтрНачинаетсяС(Аргументы[0], "-") - И НЕ Аргументы[0] = "-") - ИЛИ ПустаяСтрока(Аргументы[0]) - Тогда + Если ПустаяСтрока(Аргументы[0]) Тогда + Если Обязательный Тогда + Результат.Ошибка = СтрШаблон("Ожидается аргумент %1", Аргумент.Имя); + КонецЕсли; Возврат Результат; - + КонецЕсли; + + Если НЕ КонтекстПоиска.СбросОпций И СтрНачинаетсяС(Аргументы[0], "-") И НЕ Аргументы[0] = "-" Тогда + Если Обязательный Тогда + Результат.Ошибка = СтрШаблон("Ожидается аргумент %1 вместо опции %2", Аргумент.Имя, Аргументы[0]); + КонецЕсли; + Возврат Результат; КонецЕсли; АргументКонтекст = КонтекстПоиска.Аргументы[Аргумент]; @@ -63,10 +73,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..7e7033f 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,12 @@ КонецЕсли; - Возврат Новый Структура("РезультатПоиска, Аргументы", Истина, РезультатПоиска.Аргументы); + Возврат РезультатПоиска; КонецЕсли; КонецЦикла; - Возврат Новый Структура("РезультатПоиска, Аргументы", Ложь, Аргументы); + Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь); КонецФункции 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..5dca1e9 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" @@ -2,27 +2,27 @@ Перем Опция Экспорт; // ПараметрКоманды - Ссылка на класс опции Перем ОпцииИндекс Экспорт; // Соответствие - Ссылка на текущий индекс опций +Перем Обязательный Экспорт; // Булево Перем Лог; -Процедура ПриСозданииОбъекта(КлассОпции, Индекс) +Процедура ПриСозданииОбъекта(КлассОпции, Индекс, ОбязательнаяОпция = Истина) Лог.Отладка("Создан парсер для опции %1", КлассОпции.Имя); Опция = КлассОпции; ОпцииИндекс = Индекс; + Обязательный = ОбязательнаяОпция; КонецПроцедуры -// Выполняет поиск парсера в массиве входящих аргументов +// Выполняет поиск опции в массиве входящих аргументов // // Параметры: -// ВходящиеАргументы - массив - входящие аргументы приложения -// КонтекстПоиска - Объект - класс "КонтекстПарсера" +// ВходящиеАргументы - Массив - входящие аргументы приложения +// КонтекстПоиска - Объект - ссылка на класс КонтекстПарсера // // Возвращаемое значение: -// Структура - структура описания токена -// * РезультатПоиска - булево - признак успешного поиска -// * Аргументы - Массив - массив оставшихся аргументов после поиска +// Объект.РезультатПоискаПараметра - ссылка на класс РезультатПоискаПараметра // Функция Поиск(Знач ВходящиеАргументы, КонтекстПоиска) Экспорт @@ -32,7 +32,7 @@ Аргументы.Добавить(Арг); КонецЦикла; - Результат = Новый Структура("РезультатПоиска, Аргументы", Ложь, Аргументы); + Результат = Новый РезультатПоискаПараметра(Аргументы); Лог.Отладка("Начало поиска опции"); Лог.Отладка("Количество входящих аргументов %1", Аргументы.Количество()); @@ -40,9 +40,13 @@ ИЛИ КонтекстПоиска.СбросОпций Тогда Лог.Отладка("Не найдено аргументов <%1> или СбросОпций <%2>", Аргументы.Количество(), КонтекстПоиска.СбросОпций ); - Результат.РезультатПоиска = Опция.УстановленаИзПеременнойОкружения; - Возврат Результат; + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; + + Если Обязательный И НЕ (Результат.Найден ИЛИ КонтекстПоиска.СбросОпций) Тогда + Результат.Ошибка = ОшибкаОжидаетсяОпция(Опция.Имя); + КонецЕсли; + Возврат Результат; КонецЕсли; Индекс = 0; @@ -55,50 +59,52 @@ Индекс = Индекс + 1; Продолжить; ИначеЕсли ТекущийАргумент = "--" Тогда - Результат.РезультатПоиска = Опция.УстановленаИзПеременнойОкружения; + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; Возврат Результат; ИначеЕсли СтрНачинаетсяС(ТекущийАргумент, "--") Тогда - РезультатПоискаДлиннойОпции = НайтиДлиннуюОпцию(Аргументы, Индекс, КонтекстПоиска); - Лог.Отладка("Длинная опция найдена: %1", РезультатПоискаДлиннойОпции.Найден); - Если РезультатПоискаДлиннойОпции.Найден Тогда - Результат.РезультатПоиска = Истина; - Результат.Аргументы = РезультатПоискаДлиннойОпции.Аргументы; - Возврат Результат; - + РезультатПоиска = НайтиДлиннуюОпцию(Аргументы, Индекс, КонтекстПоиска); + Лог.Отладка("Длинная опция найдена: %1", РезультатПоиска.Найден); + Если РезультатПоиска.Найден Тогда + Возврат РезультатПоиска; КонецЕсли; - Если РезультатПоискаДлиннойОпции.ПрибавочныйИндекс = 0 Тогда - Возврат Новый Структура("РезультатПоиска, Аргументы", Опция.УстановленаИзПеременнойОкружения, Аргументы); + Результат.Ошибка = РезультатПоиска.Ошибка; + + Если РезультатПоиска.ДополнительныеСвойства.ПрибавочныйИндекс = 0 Тогда + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; + Результат.Аргументы = Аргументы; + Возврат Результат; КонецЕсли; - Индекс = Индекс + РезультатПоискаДлиннойОпции.ПрибавочныйИндекс; + Индекс = Индекс + РезультатПоиска.ДополнительныеСвойства.ПрибавочныйИндекс; ИначеЕсли СтрНачинаетсяС(ТекущийАргумент, "-") Тогда - РезультатПоискаКороткойОпции = НайтиКороткуюОпцию(Аргументы, Индекс, КонтекстПоиска); - Лог.Отладка("Короткая опция найдена: %1", РезультатПоискаКороткойОпции.Найден); - Если РезультатПоискаКороткойОпции.Найден Тогда - Результат.РезультатПоиска = Истина; - Результат.Аргументы = РезультатПоискаКороткойОпции.Аргументы; - Возврат Результат; - + РезультатПоиска = НайтиКороткуюОпцию(Аргументы, Индекс, КонтекстПоиска); + Лог.Отладка("Короткая опция найдена: %1", РезультатПоиска.Найден); + Если РезультатПоиска.Найден Тогда + Возврат РезультатПоиска; КонецЕсли; - Если РезультатПоискаКороткойОпции.ПрибавочныйИндекс = 0 Тогда - Возврат Новый Структура("РезультатПоиска, Аргументы", Опция.УстановленаИзПеременнойОкружения, Аргументы); + Результат.Ошибка = РезультатПоиска.Ошибка; + + Если РезультатПоиска.ДополнительныеСвойства.ПрибавочныйИндекс = 0 Тогда + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; + Результат.Аргументы = Аргументы; + Возврат Результат; КонецЕсли; - Индекс = Индекс + РезультатПоискаКороткойОпции.ПрибавочныйИндекс; + Индекс = Индекс + РезультатПоиска.ДополнительныеСвойства.ПрибавочныйИндекс; Иначе - Результат.РезультатПоиска = Опция.УстановленаИзПеременнойОкружения; + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; Возврат Результат; КонецЕсли; КонецЦикла; - Результат.РезультатПоиска = Опция.УстановленаИзПеременнойОкружения; + Результат.Найден = Опция.УстановленаИзПеременнойОкружения; Возврат Результат; КонецФункции @@ -109,28 +115,33 @@ ТекущийАргумент = Аргументы[Индекс]; - Результат = Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); - - Если СтрДлина(ТекущийАргумент) < 2 Тогда - - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); - + Если СтрДлина(ТекущийАргумент) < 2 Тогда + Возврат РезультатПоискаОтрицательный(Аргументы); КонецЕсли; Если Сред(ТекущийАргумент, 3, 1) = "=" Тогда + Результат = РезультатПоискаОтрицательный(Аргументы); + Имя = Лев(ТекущийАргумент, 2); КлассОпции = ОпцииИндекс[Имя]; - Если Не КлассОпции.имя = Опция.Имя Тогда - Результат.ПрибавочныйИндекс = 1; + Если КлассОпции = Неопределено Тогда + Лог.Отладка("Неопределенная опция: %1", Строка(Имя)); + Результат.Ошибка = ОшибкаНеожидаемаяОпция(Имя); Возврат Результат; + КонецЕсли; + Если Не КлассОпции.Имя = Опция.Имя Тогда + Результат.Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, Имя); + Результат.ДополнительныеСвойства.ПрибавочныйИндекс = 1; + Возврат Результат; КонецЕсли; Значение = Сред(ТекущийАргумент, 4); Если ПустаяСтрока(СокрЛП(Значение)) Тогда + Результат.Ошибка = СтрШаблон("Опция %1 должна содержать значение после знака =", Имя); Возврат Результат; КонецЕсли; @@ -142,9 +153,9 @@ КонтекстПоиска.Опции.Вставить(Опция, ОпцииКонтекст); Аргументы.Удалить(Индекс); - Результат.ПрибавочныйИндекс = 1; - Результат.Аргументы = Аргументы; - Результат.Найден = Истина; + Результат.ДополнительныеСвойства.ПрибавочныйИндекс = 1; + Результат.Аргументы = Аргументы; + Результат.Найден = Истина; Возврат Результат; @@ -157,6 +168,7 @@ Лог.Отладка("Строка опции: %1", ИщемОпцию.ВСтроку(ИИ)); + Ошибка = Неопределено; Пока Не ПустаяСтрока(ИщемОпцию.ВСтрокуС(ИИ)) Цикл ИмяОпции = ИщемОпцию.ВСтроку(ИИ, ИИ); @@ -167,8 +179,8 @@ Если КлассОпции = Неопределено Тогда Лог.Отладка("Неопределенная опция: %1", Строка(ИмяОпции)); - - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); + Ошибка = ?(Ошибка = Неопределено, ОшибкаНеожидаемаяОпция(ИмяОпции), Ошибка); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; Лог.Отладка("КлассОпции.ТипОпции: %1 ", КлассОпции.ТипОпции); @@ -178,7 +190,8 @@ Если Не КлассОпции.Имя = Опция.Имя Тогда ИИ = ИИ + 1; - Лог.Отладка("Не нашли опцию %1, %2 <> %3", ИмяОпции, КлассОпции.Имя, Опция.Имя); + Лог.Отладка("Не нашли опцию %1, %2 <> %3", ИмяОпции, КлассОпции.Имя, Опция.Имя); + Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); Продолжить; КонецЕсли; @@ -190,7 +203,6 @@ Лог.Отладка("Добавили.значение <%2> опции <%1> в контекст", Опция.Имя , Истина); КонтекстПоиска.Опции.Вставить(Опция, ОпцииКонтекст); - Результат.Найден = Истина; Лог.Отладка("Вычисление остаточного ими от <%1> до индекса <%2> после индекса <%3> ", ИщемОпцию.ВСтроку(), ИщемОпцию.ВСтрокуПо(ИИ - 1), @@ -199,11 +211,11 @@ Лог.Отладка("Остаточное имя <%1> опции ", ОстаточноеИмя ); Если ПустаяСтрока(ОстаточноеИмя) Тогда Аргументы.Удалить(Индекс); - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 1); КонецЕсли; Аргументы[Индекс] = "-" + ОстаточноеИмя; - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 0, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы); КонецЕсли; @@ -212,18 +224,24 @@ Если ПустаяСтрока(Значение) Тогда Если Аргументы.Вграница() - Индекс = 0 Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); - КонецЕсли; + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Иначе + Ошибка = ОшибкаТребуетсяЗначение(ИмяОпции); + КонецЕсли; + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); + КонецЕсли; - Если Не КлассОпции.имя = Опция.Имя Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 2, Аргументы); - КонецЕсли; + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 2); + КонецЕсли; Значение = Аргументы[Индекс + 1]; - Лог.Отладка("Значение найденной опции равно <%1>", Значение ); + Лог.Отладка("Значение найденной опции равно <%1>", Значение); Если СтрНачинаетсяС(Значение, "-") Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 0, Аргументы); + Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкаТребуетсяЗначение(ИмяОпции)); КонецЕсли; ОпцииКонтекст = КонтекстПоиска.Опции[Опция]; @@ -239,20 +257,21 @@ Аргументы.Удалить(Индекс); Аргументы.Удалить(Индекс); - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 2, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 2); КонецЕсли; НовыйАргумент = СтрЗаменить(ИщемОпцию.ВСтроку(), ИмяОпции, ""); Аргументы[Индекс] = "-" + НовыйАргумент; - Аргументы.Удалить(Индекс + 1); // удаление значения, + Аргументы.Удалить(Индекс + 1); // удаление значения - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 1, Аргументы); + Возврат РезультатПоискаПоложительный(Аргументы, 1); КонецЕсли; - Если Не КлассОпции.имя = Опция.Имя Тогда - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Ложь, 1, Аргументы); + Если Не КлассОпции.Имя = Опция.Имя Тогда + Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1); КонецЕсли; ОпцииКонтекст = КонтекстПоиска.Опции[Опция]; @@ -270,17 +289,19 @@ Если ПустаяСтрока(ОстатокИмени) Тогда Аргументы.Удалить(Индекс); // удаление значения, т.к. индекс уже сдвинулся. - Возврат Новый Структура("Найден, ПрибавочныйИндекс, Аргументы", Истина, 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,52 @@ Возврат "-" + Опция.Имя; КонецФункции +Функция РезультатПоискаОтрицательный(Аргументы, Ошибка = Неопределено, ПрибавочныйИндекс = 0) + РезультатПоиска = Новый РезультатПоискаПараметра(Аргументы, Ложь, Ошибка); + РезультатПоиска.ДополнительныеСвойства.Вставить("ПрибавочныйИндекс", ПрибавочныйИндекс); + Возврат РезультатПоиска; +КонецФункции + +Функция РезультатПоискаПоложительный(Аргументы, ПрибавочныйИндекс = 0) + РезультатПоиска = Новый РезультатПоискаПараметра(Аргументы, Истина); + РезультатПоиска.ДополнительныеСвойства.Вставить("ПрибавочныйИндекс", ПрибавочныйИндекс); + Возврат РезультатПоиска; +КонецФункции + +Функция ОшибкаТребуетсяЗначение(Имя) + Возврат СтрШаблон("Опция %1 должна содержать значение", ВосстановитьТиреПередОпцией(Имя)); +КонецФункции + +Функция ОшибкаНеожидаемаяОпция(Имя) + Возврат СтрШаблон("Неожидаемая опция %1", ВосстановитьТиреПередОпцией(Имя)); +КонецФункции + +Функция ОшибкаОжидаетсяОпция(Имя) + Возврат СтрШаблон("Ожидается опция %1", ВосстановитьТиреПередОпцией(Имя)); +КонецФункции + +Функция ОшибкаОжидаетсяВместо(Имя, ИмяВместо) + Если Не Обязательный Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат СтрШаблон("Ожидается опция %1 вместо %2", + ВосстановитьТиреПередОпцией(Имя), + ВосстановитьТиреПередОпцией(ИмяВместо)); +КонецФункции + +Функция ВосстановитьТиреПередОпцией(Имя) + + Если СтрНачинаетсяС(Имя, "-") Тогда + Возврат Имя; + КонецЕсли; + + Если СтрДлина(Имя) > 1 Тогда + Возврат "--" + Имя; + Иначе + Возврат "-" + Имя; + КонецЕсли; + +КонецФункции + Лог = Логирование.ПолучитьЛог("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..e127ae3 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" @@ -18,6 +18,8 @@ Перем ОбработчикВыборкиПути; +Перем ОбязательностьАргументов; + Перем Лог; Процедура ПриСозданииОбъекта(Знач ТокеныСпек, Знач ПараметрыПарсера) @@ -35,6 +37,7 @@ ТекущаяПозиция = 0; СкинутьОпции = Ложь; + ОбязательностьАргументов = Истина; ТипыТокенов = Токены.ТипыТокенов(); @@ -123,7 +126,8 @@ ВызватьИсключение "Нашли не объявленный аргумент"; КонецЕсли; - КонечноеСостояние = НачальноеСостояние.Т(Новый АргументыПарсера(КлассОпции), ОбработчикВыборкиПути.НовоеСостояние()); + КонечноеСостояние = НачальноеСостояние.Т(Новый АргументыПарсера(КлассОпции, ОбязательностьАргументов), + ОбработчикВыборкиПути.НовоеСостояние()); ИначеЕсли НашлиТокен(ТипыТокенов.TTOptions) Тогда @@ -155,7 +159,7 @@ ВызватьИсключение "Ошибка"; КонецЕсли; - КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцияПарсера(КлассОпции, ОпцииИндекс), + КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцияПарсера(КлассОпции, ОпцииИндекс, ОбязательностьАргументов), ОбработчикВыборкиПути.НовоеСостояние()); Лог.Отладка(" >> НачальноеСостояние.МассивСоединений: %1", НачальноеСостояние.МассивСоединений.Количество()); @@ -205,14 +209,19 @@ ОжидаюТокен(ТипыТокенов.TTClosePar); ИначеЕсли НашлиТокен(ТипыТокенов.TTOpenSq) Тогда + + ОбязательностьАргументов = Ложь; + РезультатЧтения = ПрочитатьРекурсивно(Истина); НачальноеСостояние = РезультатЧтения.НачальноеСостояние; КонечноеСостояние = РезультатЧтения.КонечноеСостояние; НачальноеСостояние.Т(Новый ЛюбойСимвол(), КонечноеСостояние); - + ОжидаюТокен(ТипыТокенов.TTCloseSq); + ОбязательностьАргументов = Истина; + ИначеЕсли НашлиТокен(ТипыТокенов.TTDoubleDash) Тогда СкинутьОпции = Истина; 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..79d2197 --- /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/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..9f1d9e4 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" @@ -56,31 +56,31 @@ // ВходящиеАргументы - Массив - массив входящих аргументов, типа строка // // Возвращаемое значение: -// булево - результат чтения параметров, -// * истина - все найдено -// * ложь - завершено с ошибками +// Структура: +// * Успешно - Булево - результат поиска параметров: +// * Истина - все найдено +// * Ложь - завершено с ошибками +// * Ошибки - Массив из Строка - массив ошибок // Функция Прочитать(ВходящиеАргументы) Экспорт Контекст = Новый КонтекстПарсеров; - Успех = ПрименитьКонтекст(ВходящиеАргументы, Контекст); + Результат = ПрименитьКонтекст(ВходящиеАргументы, Контекст); - Если Не Успех Тогда - Возврат Ложь; - КонецЕсли; + Если Результат.Успешно Тогда - ОбработчикВыборкиПути = Новый ВыборСовпадений(); - - ОбработчикВыборкиПути.ЗаполнитьЗначения(Контекст.Опции); + ОбработчикВыборкиПути = Новый ВыборСовпадений(); + ОбработчикВыборкиПути.ЗаполнитьЗначения(Контекст.Опции); + ОбработчикВыборкиПути.ЗаполнитьЗначения(Контекст.Аргументы); + + Лог.Отладка("Проверка контекста: + | количество опций: %1 + | количество аргументов %2", Контекст.Опции.Количество(), Контекст.Аргументы.Количество()); - ОбработчикВыборкиПути.ЗаполнитьЗначения(Контекст.Аргументы); - - Лог.Отладка("Проверка контекста: - | количество опций: %1 - | количество аргументов %2", Контекст.Опции.Количество(), Контекст.Аргументы.Количество()); + КонецЕсли; - Возврат истина; + Возврат Результат; КонецФункции @@ -91,9 +91,11 @@ // Контекст - Объект - ссылка на класс "КонтекстПарсеров" // // Возвращаемое значение: -// булево - результат поиска параметров, -// * истина - все найдено -// * ложь - завершено с ошибками +// Структура: +// * Успешно - Булево - результат поиска параметров: +// * Истина - все найдено +// * Ложь - завершено с ошибками +// * Ошибки - Массив из Строка - массив ошибок // Функция ПрименитьКонтекст(Знач ВходящиеАргументы, Контекст) Экспорт @@ -102,9 +104,12 @@ | количество входящих аргументов %2 | Завершено: %3", МассивСоединений.Количество(), ВходящиеАргументы.Количество(), Завершено); + Результат = Новый Структура("Успешно, Ошибки", Ложь, Новый Массив()); + Если Завершено И ВходящиеАргументы.Количество() = 0 Тогда - Возврат Истина; + Результат.Успешно = Истина; + Возврат Результат; КонецЕсли; Если ВходящиеАргументы.Количество() > 0 Тогда @@ -120,7 +125,7 @@ МассивСовпадений = Новый Массив; - Лог.Отладка("Перебираю возможные пути: %1", МассивСоединений.Количество() ); + Лог.Отладка("Перебираю возможные пути: %1", МассивСоединений.Количество()); Номер = 1; Для каждого Соединение Из МассивСоединений Цикл Лог.Отладка("Перебираю путь номер: %1", Номер); @@ -130,14 +135,18 @@ РезультатПоиска = Соединение.Парсер.Поиск(ВходящиеАргументы, ЧистыйКонтекст); - Лог.Отладка("Нашли опцию или аргумент: %2 %1", РезультатПоиска.РезультатПоиска, Соединение.Парсер.ВСтроку() ); + Лог.Отладка("Нашли опцию или аргумент: %2 %1", РезультатПоиска.Найден, Соединение.Парсер.ВСтроку()); лог.Отладка("Количество опций в контексте: %1", ЧистыйКонтекст.Опции.Количество()); лог.Отладка("Количество аргументов после поиска: %1", РезультатПоиска.Аргументы.Количество()); - Если РезультатПоиска.РезультатПоиска Тогда + Если РезультатПоиска.Найден Тогда Лог.Отладка("Добавляю в массив найденное значение"); МассивСовпадений.Добавить(НовоеСовпадение(Соединение, РезультатПоиска.Аргументы, ЧистыйКонтекст)); КонецЕсли; + Если ЗначениеЗаполнено(РезультатПоиска.Ошибка) Тогда + Результат.Ошибки.Добавить(РезультатПоиска.Ошибка); + КонецЕсли; + Номер = Номер + 1; КонецЦикла; @@ -145,14 +154,28 @@ СледующееСостояние = ЭлементСовпадения.Соединение.СледующееСостояние; - Если СледующееСостояние.ПрименитьКонтекст(ЭлементСовпадения.Результат, ЭлементСовпадения.Контекст) Тогда + РезультатСледующего = СледующееСостояние.ПрименитьКонтекст(ЭлементСовпадения.Результат, ЭлементСовпадения.Контекст); + Если РезультатСледующего.Успешно Тогда Контекст.ПрисоединитьКонтекст(ЭлементСовпадения.Контекст); - Возврат Истина; + Возврат РезультатСледующего; КонецЕсли; + Для Каждого Ошибка Из РезультатСледующего.Ошибки Цикл + Результат.Ошибки.Добавить(Ошибка); + КонецЦикла; + КонецЦикла; - Возврат Ложь; + Если Результат.Ошибки.Количество() = 0 И ВходящиеАргументы.Количество() > 0 Тогда + ПервыйАргумент = ВходящиеАргументы[0]; + Если СтрНачинаетсяС(ПервыйАргумент, "-") Тогда + Результат.Ошибки.Добавить(СтрШаблон("Неожидаемая опция %1", ПервыйАргумент)); + Иначе + Результат.Ошибки.Добавить(СтрШаблон("Неожидаемый параметр %1", ПервыйАргумент)); + КонецЕсли; + КонецЕсли; + + Возврат Результат; КонецФункции 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..dda3c71 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..daa06e0 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,71 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьТекстОшибок() Экспорт + + Команда = ПодготовитьТестовуюКоманду(); + Команда.Аргумент("ARG", "", "Тест").ТСтрока(); + Команда.Опция("f force", "", "Тест").ТСтрока(); + Команда.Опция("b bool", "", "Тест").ТБулево(); + Команда.Опция("s string", "", "Тест").ТСтрока(); + + ТестовыеСлучаи = Новый Массив(); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -x", "ARG", "Неожидаемая опция -x")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -y -x", "ARG", "Неожидаемая опция -y")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x ARG", "ARG", "Ожидается аргумент ARG вместо опции -x")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "ARG", "Ожидается аргумент ARG")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG SRC", "ARG", "Неожидаемый параметр SRC")); + + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x", "-f", "Неожидаемая опция -x")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val -x", "-f", "Неожидаемая опция -x")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-xb", "-f", "Неожидаемая опция -x")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-bx", "-f", "Ожидается опция -f вместо -b")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b", "-f -s", "Неожидаемая опция -b")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val -b", "-f -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 должна содержать значение")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b=", "-b", "Опция -b должна содержать значение после знака =")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x=false", "-b", "Неожидаемая опция -x")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG", "-f", "Неожидаемый параметр ARG")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[-f | -b] -s", "Ожидается опция -s")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "(-f | -b) -s", "Ожидается опция -f; Ожидается опция -b")); + + ТестовыеСлучаи.Добавить(ТестовыйСлучай("--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 должна содержать значение")); + + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -x", "ARG -f", "Неожидаемая опция -x")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG", "ARG -f", "Ожидается опция -f")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[ARG] -f", "Ожидается опция -f")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val", "-f ARG", "Ожидается аргумент ARG")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[-f] ARG", "Ожидается аргумент ARG")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[ARG] ((-f [-b | ARG]) | -b) -s", "Ожидается опция -f; Ожидается опция -b")); + + Для Каждого ТестовыйСлучай Из ТестовыеСлучаи Цикл + + Команда.Спек = ТестовыйСлучай.Спек; + Команда.НачалоЗапуска(); + + ПараметрыМетода = Новый Массив(); + ПараметрыМетода.Добавить(ТестовыйСлучай.Аргументы); + + Ожидаем.Что(Команда) + .Метод("Запуск", ПараметрыМетода) + .ВыбрасываетИсключение(ТестовыйСлучай.Результат); + + КонецЦИкла; + +КонецПроцедуры + Функция ПодготовитьТестовуюКоманду(Спек = "") Команда = Новый КомандаПриложения("testapp", "Тестовое приложения", ЭтотОбъект); 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) не должна быть найдена"); КонецЦикла; From b6d03c719f703db1bc2dd275589175f965ea89f8 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Wed, 27 Nov 2024 17:20:57 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=9E=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=81=D0=BE=D0=B5=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9,=20=D1=80=D0=B5=D1=84?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BE=D0=BA=20#78?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\200\321\201\320\265\321\200\320\260.os" | 16 +-- ...21\200\321\201\320\265\321\200\320\260.os" | 6 + ...21\200\321\201\320\265\321\200\320\260.os" | 86 ++++-------- ...20\260\321\200\321\201\320\265\321\200.os" | 58 ++++----- ...20\274\320\265\321\202\321\200\320\260.os" | 8 +- ...21\200\321\201\320\265\321\200\320\260.os" | 99 ++++++++++++++ ...20\264\320\265\320\275\320\270\320\265.os" | 22 ++-- ...20\266\320\265\320\275\320\270\321\217.os" | 2 +- ...6\320\265\320\275\320\270\321\217_test.os" | 123 ++++++++++++------ 9 files changed, 261 insertions(+), 159 deletions(-) create mode 100644 "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" 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 670bbb2..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" @@ -2,13 +2,11 @@ // Ссылка на класс аргумента Перем Аргумент Экспорт; -Перем Обязательный Экспорт; // Булево Перем Лог; -Процедура ПриСозданииОбъекта(КлассОпции, ОбязательныйАргумент = Истина) +Процедура ПриСозданииОбъекта(КлассОпции) Аргумент = КлассОпции; - Обязательный = ОбязательныйАргумент; КонецПроцедуры @@ -43,8 +41,8 @@ КонтекстПоиска.НеВключенныеАргументы.Вставить(Аргумент, Истина); КонецЕсли; - Если Обязательный И НЕ (Результат.Найден ИЛИ Аргумент.УстановленаИзПеременнойОкружения) Тогда - Результат.Ошибка = СтрШаблон("Ожидается аргумент %1", Аргумент.Имя); + Если НЕ (Результат.Найден ИЛИ Аргумент.УстановленаИзПеременнойОкружения) Тогда + Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргумент(Аргумент.Имя); КонецЕсли; Возврат Результат; @@ -52,16 +50,12 @@ КонецЕсли; Если ПустаяСтрока(Аргументы[0]) Тогда - Если Обязательный Тогда - Результат.Ошибка = СтрШаблон("Ожидается аргумент %1", Аргумент.Имя); - КонецЕсли; + Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргумент(Аргумент.Имя); Возврат Результат; КонецЕсли; Если НЕ КонтекстПоиска.СбросОпций И СтрНачинаетсяС(Аргументы[0], "-") И НЕ Аргументы[0] = "-" Тогда - Если Обязательный Тогда - Результат.Ошибка = СтрШаблон("Ожидается аргумент %1 вместо опции %2", Аргумент.Имя, Аргументы[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 7e7033f..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" @@ -86,6 +86,12 @@ КонецЕсли; Возврат РезультатПоиска; + + КонецЕсли; + + Если ЗначениеЗаполнено(РезультатПоиска.Ошибка) + И ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка) Тогда + Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь, РезультатПоиска.Ошибка); КонецЕсли; КонецЦикла; 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 5dca1e9..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" @@ -2,16 +2,14 @@ Перем Опция Экспорт; // ПараметрКоманды - Ссылка на класс опции Перем ОпцииИндекс Экспорт; // Соответствие - Ссылка на текущий индекс опций -Перем Обязательный Экспорт; // Булево Перем Лог; -Процедура ПриСозданииОбъекта(КлассОпции, Индекс, ОбязательнаяОпция = Истина) +Процедура ПриСозданииОбъекта(КлассОпции, Индекс) Лог.Отладка("Создан парсер для опции %1", КлассОпции.Имя); Опция = КлассОпции; ОпцииИндекс = Индекс; - Обязательный = ОбязательнаяОпция; КонецПроцедуры @@ -42,8 +40,8 @@ Результат.Найден = Опция.УстановленаИзПеременнойОкружения; - Если Обязательный И НЕ (Результат.Найден ИЛИ КонтекстПоиска.СбросОпций) Тогда - Результат.Ошибка = ОшибкаОжидаетсяОпция(Опция.Имя); + Если НЕ (Результат.Найден ИЛИ КонтекстПоиска.СбросОпций) Тогда + Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпция(Опция.Имя); КонецЕсли; Возврат Результат; @@ -128,12 +126,12 @@ КлассОпции = ОпцииИндекс[Имя]; Если КлассОпции = Неопределено Тогда Лог.Отладка("Неопределенная опция: %1", Строка(Имя)); - Результат.Ошибка = ОшибкаНеожидаемаяОпция(Имя); + Результат.Ошибка = ОшибкиПарсера.ОшибкаНеожидаемаяОпция(Имя); Возврат Результат; КонецЕсли; Если Не КлассОпции.Имя = Опция.Имя Тогда - Результат.Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, Имя); + Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, Имя); Результат.ДополнительныеСвойства.ПрибавочныйИндекс = 1; Возврат Результат; КонецЕсли; @@ -141,7 +139,7 @@ Значение = Сред(ТекущийАргумент, 4); Если ПустаяСтрока(СокрЛП(Значение)) Тогда - Результат.Ошибка = СтрШаблон("Опция %1 должна содержать значение после знака =", Имя); + Результат.Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеПослеЗнакаРавноДляОпции(Имя); Возврат Результат; КонецЕсли; @@ -179,7 +177,7 @@ Если КлассОпции = Неопределено Тогда Лог.Отладка("Неопределенная опция: %1", Строка(ИмяОпции)); - Ошибка = ?(Ошибка = Неопределено, ОшибкаНеожидаемаяОпция(ИмяОпции), Ошибка); + Ошибка = ?(Ошибка = Неопределено, ОшибкиПарсера.ОшибкаНеожидаемаяОпция(ИмяОпции), Ошибка); Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; @@ -191,7 +189,7 @@ Если Не КлассОпции.Имя = Опция.Имя Тогда ИИ = ИИ + 1; Лог.Отладка("Не нашли опцию %1, %2 <> %3", ИмяОпции, КлассОпции.Имя, Опция.Имя); - Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); Продолжить; КонецЕсли; @@ -225,15 +223,15 @@ Если Аргументы.Вграница() - Индекс = 0 Тогда Если Не КлассОпции.Имя = Опция.Имя Тогда - Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); Иначе - Ошибка = ОшибкаТребуетсяЗначение(ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции); КонецЕсли; Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; Если Не КлассОпции.Имя = Опция.Имя Тогда - Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 2); КонецЕсли; @@ -241,7 +239,7 @@ Лог.Отладка("Значение найденной опции равно <%1>", Значение); Если СтрНачинаетсяС(Значение, "-") Тогда - Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкаТребуетсяЗначение(ИмяОпции)); + Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции)); КонецЕсли; ОпцииКонтекст = КонтекстПоиска.Опции[Опция]; @@ -270,7 +268,7 @@ КонецЕсли; Если Не КлассОпции.Имя = Опция.Имя Тогда - Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1); КонецЕсли; @@ -299,7 +297,9 @@ КонецЦикла; - Ошибка = ?(Обязательный, ОшибкаНеожидаемаяОпция(ТекущийАргумент), Неопределено); + Если Не ЗначениеЗаполнено(Ошибка) Тогда + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпция(Опция.Имя); + КонецЕсли; Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1); @@ -320,7 +320,7 @@ Лог.Отладка("Класс опции по имени %1", КлассОпции); Если КлассОпции = Неопределено Тогда - Ошибка = ОшибкаНеожидаемаяОпция(ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаНеожидаемаяОпция(ИмяОпции); Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; @@ -329,14 +329,14 @@ Лог.Отладка("Строка содержит <=> второй элемент массива %1", МассивСтрокаАргумента[1]); Если Не КлассОпции.Имя = Опция.Имя Тогда - Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1); КонецЕсли; Значение = МассивСтрокаАргумента[1]; Если ПустаяСтрока(Значение) Тогда - Ошибка = ОшибкаТребуетсяЗначение(ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции); Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; @@ -356,7 +356,7 @@ Или КлассОпции.ТипОпции = Тип("Массив") И КлассОпции.ТипЭлементаОпции = Тип("Булево") Тогда Если Не КлассОпции.Имя = Опция.Имя Тогда - Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1); КонецЕсли; @@ -377,28 +377,28 @@ Если Аргументы.Количество() - Индекс < 2 Тогда Если Не КлассОпции.Имя = Опция.Имя Тогда - Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); Иначе - Ошибка = ОшибкаТребуетсяЗначение(ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции); КонецЕсли; Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка); КонецЕсли; Если Не КлассОпции.Имя = Опция.Имя Тогда - Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции); + Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции); Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 2); КонецЕсли; Значение = Аргументы[Индекс + 1]; Если СтрНачинаетсяС(Значение, "-") Тогда - Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкаТребуетсяЗначение(ИмяОпции)); + Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции)); КонецЕсли; Лог.Отладка("Значение длинной опции <%1>", Значение); Если ПустаяСтрока(Значение) Тогда - Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкаТребуетсяЗначение(ИмяОпции)); + Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции)); КонецЕсли; ОпцииКонтекст = КонтекстПоиска.Опции[Опция]; @@ -446,40 +446,4 @@ Возврат РезультатПоиска; КонецФункции -Функция ОшибкаТребуетсяЗначение(Имя) - Возврат СтрШаблон("Опция %1 должна содержать значение", ВосстановитьТиреПередОпцией(Имя)); -КонецФункции - -Функция ОшибкаНеожидаемаяОпция(Имя) - Возврат СтрШаблон("Неожидаемая опция %1", ВосстановитьТиреПередОпцией(Имя)); -КонецФункции - -Функция ОшибкаОжидаетсяОпция(Имя) - Возврат СтрШаблон("Ожидается опция %1", ВосстановитьТиреПередОпцией(Имя)); -КонецФункции - -Функция ОшибкаОжидаетсяВместо(Имя, ИмяВместо) - Если Не Обязательный Тогда - Возврат Неопределено; - КонецЕсли; - - Возврат СтрШаблон("Ожидается опция %1 вместо %2", - ВосстановитьТиреПередОпцией(Имя), - ВосстановитьТиреПередОпцией(ИмяВместо)); -КонецФункции - -Функция ВосстановитьТиреПередОпцией(Имя) - - Если СтрНачинаетсяС(Имя, "-") Тогда - Возврат Имя; - КонецЕсли; - - Если СтрДлина(Имя) > 1 Тогда - Возврат "--" + Имя; - Иначе - Возврат "-" + Имя; - КонецЕсли; - -КонецФункции - Лог = Логирование.ПолучитьЛог("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 e127ae3..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" @@ -18,8 +18,6 @@ Перем ОбработчикВыборкиПути; -Перем ОбязательностьАргументов; - Перем Лог; Процедура ПриСозданииОбъекта(Знач ТокеныСпек, Знач ПараметрыПарсера) @@ -37,7 +35,6 @@ ТекущаяПозиция = 0; СкинутьОпции = Ложь; - ОбязательностьАргументов = Истина; ТипыТокенов = Токены.ТипыТокенов(); @@ -55,7 +52,7 @@ Лог.Отладка("Начинаю чтение спека %1", Спек); Лог.Отладка("Количество токенов %1", ТокеныПарсера.Количество()); - Результат = ПрочитатьРекурсивно(Ложь); + Результат = ПрочитатьРекурсивно(Ложь, Истина); Если Не КонецТокенов() Тогда ВызватьИсключение "Косяк ппц что делать"; @@ -66,12 +63,12 @@ КонечноеСостояние.Завершено = Истина; НачальноеСостояние.Подготовить(); - + Возврат НачальноеСостояние; КонецФункции -Функция ПрочитатьРекурсивно(Требуется) +Функция ПрочитатьРекурсивно(Требуется, Обязательное) Лог.Отладка("Рекурсивное чтение %1", Требуется); @@ -80,10 +77,10 @@ Если Требуется Тогда - Результат = ТокенВыбора(); + Результат = ТокенВыбора(Обязательное); Для каждого Соединение Из Результат.НачальноеСостояние.МассивСоединений Цикл - КонечноеСостояние.Т(Соединение.Парсер, Соединение.СледующееСостояние); + КонечноеСостояние.Т(Соединение.Парсер, Соединение.СледующееСостояние, Соединение.Обязательное); КонецЦикла; КонечноеСостояние = Результат.КонечноеСостояние; @@ -92,10 +89,10 @@ Пока МогуПрочитать() Цикл - РезультатВЦикле = ТокенВыбора(); + РезультатВЦикле = ТокенВыбора(Обязательное); Для каждого Соединение Из РезультатВЦикле.НачальноеСостояние.МассивСоединений Цикл - КонечноеСостояние.Т(Соединение.Парсер, Соединение.СледующееСостояние); + КонечноеСостояние.Т(Соединение.Парсер, Соединение.СледующееСостояние, Соединение.Обязательное); КонецЦикла; КонечноеСостояние = РезультатВЦикле.КонечноеСостояние; @@ -106,7 +103,7 @@ КонецФункции -Функция ЧтениеДалее() +Функция ЧтениеДалее(Обязательное) Лог.Отладка("Вызов <ЧтениеДалее>"); @@ -126,8 +123,9 @@ ВызватьИсключение "Нашли не объявленный аргумент"; КонецЕсли; - КонечноеСостояние = НачальноеСостояние.Т(Новый АргументыПарсера(КлассОпции, ОбязательностьАргументов), - ОбработчикВыборкиПути.НовоеСостояние()); + КонечноеСостояние = НачальноеСостояние.Т(Новый АргументыПарсера(КлассОпции), + ОбработчикВыборкиПути.НовоеСостояние(), + Обязательное); ИначеЕсли НашлиТокен(ТипыТокенов.TTOptions) Тогда @@ -137,7 +135,7 @@ ВызватьИсключение "нет опций после --"; КонецЕсли; КонечноеСостояние = ОбработчикВыборкиПути.НовоеСостояние(); - НачальноеСостояние.Т(Новый ВсеОпцииПарсера(Опции, ОпцииИндекс), КонечноеСостояние); + НачальноеСостояние.Т(Новый ВсеОпцииПарсера(Опции, ОпцииИндекс), КонечноеСостояние, Ложь); ИначеЕсли НашлиТокен(ТипыТокенов.TTShortOpt) ИЛИ НашлиТокен(ТипыТокенов.TTLongOpt) Тогда @@ -159,8 +157,9 @@ ВызватьИсключение "Ошибка"; КонецЕсли; - КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцияПарсера(КлассОпции, ОпцииИндекс, ОбязательностьАргументов), - ОбработчикВыборкиПути.НовоеСостояние()); + КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцияПарсера(КлассОпции, ОпцииИндекс), + ОбработчикВыборкиПути.НовоеСостояние(), + Обязательное); Лог.Отладка(" >> НачальноеСостояние.МассивСоединений: %1", НачальноеСостояние.МассивСоединений.Количество()); НашлиТокен(ТипыТокенов.TTOptValue); // Пропуск значение после "=" @@ -197,35 +196,32 @@ КонецЦикла; - НачальноеСостояние.Т(Новый ВсеОпцииПарсера(МассивДоступныхОпций, ОпцииИндекс), КонечноеСостояние); + НачальноеСостояние.Т(Новый ВсеОпцииПарсера(МассивДоступныхОпций, ОпцииИндекс), КонечноеСостояние, Ложь); ИначеЕсли НашлиТокен(ТипыТокенов.TTOpenPar) Тогда - РезультатЧтения = ПрочитатьРекурсивно(Истина); + РезультатЧтения = ПрочитатьРекурсивно(Истина, Истина); НачальноеСостояние = РезультатЧтения.НачальноеСостояние; КонечноеСостояние = РезультатЧтения.КонечноеСостояние; - + ОжидаюТокен(ТипыТокенов.TTClosePar); - - ИначеЕсли НашлиТокен(ТипыТокенов.TTOpenSq) Тогда - ОбязательностьАргументов = Ложь; + ИначеЕсли НашлиТокен(ТипыТокенов.TTOpenSq) Тогда - РезультатЧтения = ПрочитатьРекурсивно(Истина); + РезультатЧтения = ПрочитатьРекурсивно(Истина, Ложь); НачальноеСостояние = РезультатЧтения.НачальноеСостояние; КонечноеСостояние = РезультатЧтения.КонечноеСостояние; - НачальноеСостояние.Т(Новый ЛюбойСимвол(), КонечноеСостояние); + НачальноеСостояние.Т(Новый ЛюбойСимвол(), КонечноеСостояние, Ложь); ОжидаюТокен(ТипыТокенов.TTCloseSq); - ОбязательностьАргументов = Истина; - ИначеЕсли НашлиТокен(ТипыТокенов.TTDoubleDash) Тогда СкинутьОпции = Истина; - КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцииЗавершениеПарсера(), ОбработчикВыборкиПути.НовоеСостояние()); + КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцииЗавершениеПарсера(), + ОбработчикВыборкиПути.НовоеСостояние(), Ложь); Возврат Новый Структура("НачальноеСостояние, КонечноеСостояние", НачальноеСостояние, КонечноеСостояние); Иначе @@ -233,7 +229,7 @@ КонецЕсли; Если НашлиТокен(ТипыТокенов.TTRep) Тогда - КонечноеСостояние.Т(Новый ЛюбойСимвол(), НачальноеСостояние); + КонечноеСостояние.Т(Новый ЛюбойСимвол(), НачальноеСостояние, Ложь); КонецЕсли; @@ -245,14 +241,14 @@ КонецФункции -Функция ТокенВыбора() +Функция ТокенВыбора(Обязательное) Лог.Отладка("Вызов <ТокенВыбора>"); НачальноеСостояние = ОбработчикВыборкиПути.НовоеСостояние(); КонечноеСостояние = ОбработчикВыборкиПути.НовоеСостояние(); - Результат = ЧтениеДалее(); + Результат = ЧтениеДалее(Обязательное); НачальноеСостояние.Т(Новый ЛюбойСимвол(), Результат.НачальноеСостояние); Результат.КонечноеСостояние.Т(Новый ЛюбойСимвол(), КонечноеСостояние); @@ -260,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" index 79d2197..2627b53 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\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" @@ -5,13 +5,13 @@ // Массив оставшихся аргументов после поиска Перем Аргументы Экспорт; // Массив -// Текст ошибки -Перем Ошибка Экспорт; // Строка +// Ошибка +Перем Ошибка Экспорт; // см. ОшибкиПарсера.НоваяОшибка // Дополнительные свойства Перем ДополнительныеСвойства Экспорт; // Структура -Процедура ПриСозданииОбъекта(АргументыПослеПоиска = Неопределено, ПараметрНайден = Ложь, ОшибкаПоиска = "") +Процедура ПриСозданииОбъекта(АргументыПослеПоиска = Неопределено, ПараметрНайден = Ложь, ОшибкаПоиска = Неопределено) Найден = ПараметрНайден; Ошибка = ОшибкаПоиска; @@ -19,7 +19,7 @@ Аргументы = АргументыПослеПоиска; Если Аргументы = Неопределено Тогда - Аргументы = Новый Масив(); + Аргументы = Новый Массив(); КонецЕсли; КонецПроцедуры \ 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 9f1d9e4..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 @@ КонецПроцедуры -// Процедура добавляет соединению к текущему состоянию +// Процедура добавляет соединение к текущему состоянию // // Параметры: // Парсер - Объект - ссылка на произвольный класс парсера // СледующееСостояние - Объект.Совпадение - ссылка на класс Совпадение, следующего состояния +// Обязательное - Булево - обязательное соединение // // Возвращаемое значение: // Объект.Совпадение - ссылка на класс Совпадение, следующего состояния // -Функция Т(Парсер, СледующееСостояние) Экспорт +Функция Т(Парсер, СледующееСостояние, Обязательное = Ложь) Экспорт - МассивСоединений.Добавить(НовоеСоединениеСовпадений(Парсер, СледующееСостояние)); + МассивСоединений.Добавить(НовоеСоединениеСовпадений(Парсер, СледующееСостояние, Обязательное)); Возврат СледующееСостояние; КонецФункции -Функция НовоеСоединениеСовпадений(Парсер, СледующееСостояние) +Функция НовоеСоединениеСовпадений(Парсер, СледующееСостояние, Обязательное) - Возврат Новый Структура("Парсер, СледующееСостояние", Парсер, СледующееСостояние); + Возврат Новый Структура("Парсер, СледующееСостояние, Обязательное", Парсер, СледующееСостояние, Обязательное); КонецФункции @@ -143,12 +144,17 @@ МассивСовпадений.Добавить(НовоеСовпадение(Соединение, РезультатПоиска.Аргументы, ЧистыйКонтекст)); КонецЕсли; - Если ЗначениеЗаполнено(РезультатПоиска.Ошибка) Тогда + Если ЗначениеЗаполнено(РезультатПоиска.Ошибка) + И (Соединение.Обязательное ИЛИ ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка)) Тогда Результат.Ошибки.Добавить(РезультатПоиска.Ошибка); КонецЕсли; Номер = Номер + 1; КонецЦикла; + + Если МассивСовпадений.Количество() Тогда + Результат.Ошибки.Очистить(); + КонецЕсли; Для каждого ЭлементСовпадения Из МассивСовпадений Цикл @@ -169,9 +175,9 @@ Если Результат.Ошибки.Количество() = 0 И ВходящиеАргументы.Количество() > 0 Тогда ПервыйАргумент = ВходящиеАргументы[0]; Если СтрНачинаетсяС(ПервыйАргумент, "-") Тогда - Результат.Ошибки.Добавить(СтрШаблон("Неожидаемая опция %1", ПервыйАргумент)); + Результат.Ошибки.Добавить(ОшибкиПарсера.ОшибкаНеожидаемаяОпция(ПервыйАргумент)); Иначе - Результат.Ошибки.Добавить(СтрШаблон("Неожидаемый параметр %1", ПервыйАргумент)); + Результат.Ошибки.Добавить(ОшибкиПарсера.ОшибкаНеожидаемыйПараметр(ПервыйАргумент)); КонецЕсли; КонецЕсли; 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 dda3c71..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" @@ -414,7 +414,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 daa06e0..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" @@ -430,6 +430,8 @@ Процедура ТестДолжен_ПроверитьТекстОшибок() Экспорт + РазделительОшибок = "; "; + Команда = ПодготовитьТестовуюКоманду(); Команда.Аргумент("ARG", "", "Тест").ТСтрока(); Команда.Опция("f force", "", "Тест").ТСтрока(); @@ -437,45 +439,64 @@ Команда.Опция("s string", "", "Тест").ТСтрока(); ТестовыеСлучаи = Новый Массив(); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -x", "ARG", "Неожидаемая опция -x")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -y -x", "ARG", "Неожидаемая опция -y")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x ARG", "ARG", "Ожидается аргумент ARG вместо опции -x")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "ARG", "Ожидается аргумент ARG")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG SRC", "ARG", "Неожидаемый параметр SRC")); - - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x", "-f", "Неожидаемая опция -x")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val -x", "-f", "Неожидаемая опция -x")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-xb", "-f", "Неожидаемая опция -x")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-bx", "-f", "Ожидается опция -f вместо -b")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b", "-f -s", "Неожидаемая опция -b")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val -b", "-f -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 должна содержать значение")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-b=", "-b", "Опция -b должна содержать значение после знака =")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-x=false", "-b", "Неожидаемая опция -x")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG", "-f", "Неожидаемый параметр ARG")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[-f | -b] -s", "Ожидается опция -s")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "(-f | -b) -s", "Ожидается опция -f; Ожидается опция -b")); - - ТестовыеСлучаи.Добавить(ТестовыйСлучай("--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 должна содержать значение")); - - ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG -x", "ARG -f", "Неожидаемая опция -x")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("ARG", "ARG -f", "Ожидается опция -f")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[ARG] -f", "Ожидается опция -f")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("-f val", "-f ARG", "Ожидается аргумент ARG")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[-f] ARG", "Ожидается аргумент ARG")); - ТестовыеСлучаи.Добавить(ТестовыйСлучай("", "[ARG] ((-f [-b | ARG]) | -b) -s", "Ожидается опция -f; Ожидается опция -b")); + ТестовыеСлучаи.Добавить(ТестовыйСлучай("-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").Текст)); Для Каждого ТестовыйСлучай Из ТестовыеСлучаи Цикл @@ -485,9 +506,26 @@ ПараметрыМетода = Новый Массив(); ПараметрыМетода.Добавить(ТестовыйСлучай.Аргументы); - Ожидаем.Что(Команда) - .Метод("Запуск", ПараметрыМетода) - .ВыбрасываетИсключение(ТестовыйСлучай.Результат); + ТекстИсключения = ""; + Попытка + Рефлектор = Новый Рефлектор; + Рефлектор.ВызватьМетод(Команда, "Запуск", ПараметрыМетода); + Исключение + ТекстИсключения = ОписаниеОшибки(); + + ПодстрокаПоиска = "Ошибка чтения параметров команды: "; + НачальныйНомер = СтрНайти(ТекстИсключения, ПодстрокаПоиска) + СтрДлина(ПодстрокаПоиска); + КоличествоСимволов = СтрДлина(ТекстИсключения) - НачальныйНомер; + ТекстИсключения = Сред(ТекстИсключения, НачальныйНомер, КоличествоСимволов); + КонецПопытки; + + Если ТипЗнч(ТестовыйСлучай.Результат) = Тип("Структура") Тогда + Результат = ТестовыйСлучай.Результат.Текст; + Иначе + Результат = ТестовыйСлучай.Результат; + КонецЕсли; + + Ожидаем.Что(ТекстИсключения).Равно(Результат); КонецЦИкла; @@ -620,6 +658,5 @@ КонецПроцедуры - Лог = Логирование.ПолучитьЛог("oscript.lib.cli_command"); //Лог.УстановитьУровень(УровниЛога.Отладка); \ No newline at end of file