Metrolog / ITG.1C.Metrolog

АИС "Метрологическая служба"
0 stars 1 forks source link

Добавить подсистему для трансляции (лексического, семантического анализа и генерации) #76

Open sergey-s-betke opened 7 years ago

sergey-s-betke commented 7 years ago

Эта задача нужна и для #67. Да и не только.

sergey-s-betke commented 7 years ago

Итак, пришла в голову идея построить эту подсистему на базе XSLT в 1С. Необходимо ещё разобраться с версией XSLT в 1С. Хватит и 1.0, но 2.0 куда лучше (есть поддержка регулярных выражений).

Алгоритм реализации вижу следующий:

В итоге, должны получить систему, на вход которой мы отдаём строку, на выходе - структуру 1С или исключение.

sergey-s-betke commented 7 years ago

Пойдём по порядку. Преобразование Unicode16 (строки 1С) в Unicode32. Удастся ли и для этих целей использовать XSLT, или придётся писать код на 1С для этих целей? Записать как текстовый файл, так и XML в UTF-32 1С вполне может. Результат стоит тестировать. Но можно ли избежать записи в файл и обойтись операциями в памяти?..

sergey-s-betke commented 7 years ago

Если забыть про кроссплатформенность, можно и .dotNet использовать:

Текст = Новый COMОбъект("System.Text.UTF8Encoding");
КриптоSHA256 = Новый COMОбъект("System.Security.Cryptography.HMACSHA256");
КриптоSHA256.key = Текст.GetBytes_4(Ключ);
Если ВернутьBase64 Тогда

    Хэш256 = КриптоSHA256.ComputeHash_2(Текст.GetBytes_4(Строка)).Выгрузить();
    СтрокаХэша = Преобразовать64(, Хэш256);

Иначе    

    Хэш256 = КриптоSHA256.ComputeHash_2(Текст.GetBytes_4(Строка));
    оStr = Новый COMОбъект("System.Text.StringBuilder");
    Для Каждого стр Из Хэш256 Цикл
        оStr.AppendFormat("{0:x02}", стр);
    КонецЦикла;

    СтрокаХэша = оStr.ToString; //последовательность байтов

КонецЕсли;

Возврат СтрокаХэша;
sergey-s-betke commented 7 years ago

Можно и с потоками в памяти. С любыми потоками. ЗаписьТекста.Открыть, ЧтениеТекста.Открыть. Строкой указываем кодировку - и всё в порядке. На первый взгляд.

Итак, таким образом мы попробуем конвертировать UTF16 (строки 1С) в UTF32. А далее - уже сравнение...

sergey-s-betke commented 7 years ago

http://pro1c.org.ua/index.php?showtopic=9742

sergey-s-betke commented 7 years ago

http://infostart.ru/public/194784/

sergey-s-betke commented 7 years ago

Ещё можно на Windows использовать через COM System.Char. Но не кроссплатформенно.

sergey-s-betke commented 7 years ago

http://www.w3.org/TR/xslt-10

sergey-s-betke commented 7 years ago

Преобразовать символы в коды символов в XSLT 1.0 невозможно.

sergey-s-betke commented 7 years ago

Отдать лексическому анализатору нам надо что-то типа:

<?xml version="1.0" encoding="UTF-8"?>
<строка>
<символ текст="к" код="" категория="буквы"/>
<символ текст="г" код="" категория="буквы"/>
<символ текст=" " код="" категория="разделители"/>
<символ текст="*" код="" категория="операции"/>
<символ текст="м" код="" категория="буквы"/>
<символ текст="/" код="" категория="операции"/>
<символ текст="с" код="" категория="буквы"/>
<символ текст="^" код="" категория="операции"/>
<символ текст="2" код="" категория="буквы"/>
</строка>

со всеми данными из UnicodeData.

sergey-s-betke commented 7 years ago

https://infostart.ru/public/316338/

sergey-s-betke commented 7 years ago

https://github.com/antlr/antlr4

sergey-s-betke commented 7 years ago

https://en.wikipedia.org/wiki/Coco/R

sergey-s-betke commented 7 years ago

http://goldparser.org/ https://yandex.ru/search/?text=GOLD%20Parsing%20System%201c&lr=24&clid=2233627

sergey-s-betke commented 6 years ago

Ждём http://goldparser.org/doc/engine-pseudo/index.htm