ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Идея двойного синтаксиса

Сообщений 1 страница 5 из 5

1

utkin написал(а):

Уткин предлагает два синтаксиса - рабочий короткий, для чтения и обмена текстами нормальный, естественный.

Ну двух синтаксисов мало. Как писать утилиты, преобразующие один в другой, если нет формального описания процесса преобразования?

Отредактировано Лис (2018-07-18 07:16:37)

0

2

Как писать утилиты, преобразующие один в другой, если нет формального описания процесса преобразования?

Он как раз есть :). Примитивный, но есть.

0

3

utkin написал(а):

Он как раз есть :). Примитивный, но есть.

Отредактировано Лис (2018-07-18 09:31:16)

0

4

Ну это я уже писал. Мой парсер каждую строку переводит во внутреннее представление:

id
param1
param2
param3
param4

Это не теория, это практика. Именно так это работает. Вы задаете шаблон (есть на ремдеве), вот например фрагмент настроек синтаксиса (помните - из-за Ваших претензий к русскости я переделывал разбор для восприятия и русских команд тоже):

Шаблон
Описание=Присваивание строковой константы для простой системы
№=28
Слово1=1
Слово2=-->
Слово3=2

Это означает, что если парсер встречает конструкцию типа
х --> "всем привет" он внутри представит это как:

id=28
param1='x'
param2='всем привет'
param3=''
param4=''

Ну и что нам мешает, имея данную информацию, развернуть все обратно?
Берем цикл и идем по данным записям. Встретилось 28? Значит в case id of написать возвращаемое значение: "Внести в указанную систему "+param1+" строковое значение <"+param2+">"? В результате трансляции

х --> "всем привет"

будет преобразовано в

Внести в указанную систему х строковое значение <всем привет>

Это делается с полпинка, а все операции однотипны по своей сути. Трансляция из внутреннего промежуточного представления во внешнее вообще автоматно (ну может чуть сложней, если Вы, опять же, рассчитываете, как и я, менять генерируемый синтаксис). Иное дело гонять синтаксис обратно - когда Вам нужно из развернутого коболовского описания вогнать в короткую форму записи. Мой парсер это может не всегда (всему есть предел же), нужно будет очень грамотно составлять полную запись текста программы, чтобы был возможен однозначный перевод в короткую форму без лишних телодвижений. Потому что всегда есть вероятность, что человек вдруг не просто прочитает и перегонит обратно, но и сделает там свои правки в текст.
У Вас есть версия исходников. Откройте parser.pas, там почти в самом начале объявление структуры:

// Описание конструкции
type
  TTemplateConstr=record

    Remark: UnicodeString;                    // Описание конструкции
    Id:     Integer;                          // Семнатический идентификатор конструкции
    Words:  Array [1..8] of UnicodeString     // Слова-шаблоны для распознавания
  end;

Так объявляются шаблоны конструкций (то что хранится в файле).
А так уже то о чем я пишу:

// Внутреннее представление конструкции
type
  TInternalConstr=record

    id: Integer;                               // Идентификатор конструкции
    Param1: UnicodeString;                     // Параметр1
    Param2: UnicodeString;                     // Параметр2
    Param3: UnicodeString;                     // Параметр3
    param4: UnicodeString;                     // Параметр4
    Original: Integer;                         // Положение строки в исходном коде
  end;
////////////////////////////////////////////////////////////////////////////////////////////

Именно в это преобразовывается текст человека для работы интерпретатора. Интерпретатор уже встречая id "знает" что нужно делать с представленными параметрами. В парсере есть функция Lexer - она получает строки текста программы и рожает такие вот TInternalConstr (когда все хорошо).

Отредактировано utkin (2018-07-18 10:05:35)

0

5

http://s8.uploads.ru/0o7RI.jpg
Гонять можно и другие синтаксисы с учетом того, что целевое представление не должно быть кастомизированным. В общем исходный синтаксис не должен иметь конструкций, отсутствующих в целевом синтаксисе. Интерпретатор не следит за ID - если его нет в синтаксисе, значит и не надо :). Это позволяет обрезать любой синтаксис (зачем только?).

Отредактировано utkin (2018-07-19 14:21:02)

0