Ну это я уже писал. Мой парсер каждую строку переводит во внутреннее представление:
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)