Наследование интерпретатора
Механизм наследования предназначен для повторного использования уже разработанных интерпретаторов при трансляции и интерпретации управляющих программ с похожим, но отличающимся синтаксисом. Степень необходимого отличия управляющей программы от оригинальной для реализации наследника, а не нового интерпретатора, определяется разработчиком самостоятельно.
Предназначение интерпретатора-наследника состоит в трансляции и интерпретации различий в управляющей программе, а так же передаче управления интерпретатору-родителю для трансляции и интерпретации похожих участков текста управляющей программы.
Отличия реализации интерпретатора-наследника от обычного интерпретатора, заключаются в следующем:
В файле настроек интерпретатора (SNCI) заполняются поля ParentID, ParentFileName.
Если присутствует необходимость, переопределяются существующие или добавляются новые регистры. Сделать это можно добавив изменения в список регистров SNCI-файла или в список регистров, возвращаемых функцией INCT_Interpreter.GetRegisters программной библиотеки интерпретатора-наследника.
Реализуется программная библиотека интерпретатора-наследника. При реализации библиотеки, вызов функций и методов программной библиотеки интерпретатора-родителя осуществляется или не осуществляется наследником в зависимости от алгоритмов, закладываемых для трансляции и интерпретации текста управляющей программы. Интерфейс интерпретатора-родителя (INCT_Interpreter) передаётся наследнику при инициализации.
Наследование возможно только от одного родителя. Количество интерпретаторов-наследников от одного родителя и глубина наследования не имеют ограничений.
Наследование регистров.
Регистры интерпретаторов-наследников переопределяют регистры интерпретаторов-родителей. Наследование регистров реализовано таким образом, что в результирующий список (список базовых регистров) производится:
Загрузка списка регистров из файла настроек интерпретатора-наследника.
Загрузка списка регистров из программной библиотеки интерпретатора-наследника (INCT_Interpreter.GetRegisters). Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.
Загрузка списка регистров из файла настроек интерпретатора-родителя. Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.
Загрузка списка регистров из программной библиотеки интерпретатора-родителя. Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.
Загрузка списка регистров из файла настроек родителя интерпретатора-родителя. Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.
Загрузка списка регистров из программной библиотеки родителя интерпретатора-родителя. Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.
И так далее, до самого первого родителя.
Наследование программной библиотеки.
При инициализации программной библиотеки интерпретатора-родителя, ряд методов и функций вызывается ядром SprutCAM и не требует вызова этих функций из наследника:
INCT_Interpreter.GetIdentifier.
INCT_Interpreter.GetRegisters.
INCT_Interpreter.SetInterface.
INCT_Interpreter.Initialize.
Вызов остальных функций и методов программной библиотеки интерпретатора-родителя осуществляется или не осуществляется наследником в зависимости от алгоритмов, закладываемых для трансляции и интерпретации текста управляющей программы. Для вызова методов родителя, при инициализации программной библиотеки интерпретатора-наследника, ему в том числе передаётся интерфейс интерпретатора-родителя (функция INCT_Interpreter.SetInterface).
Ниже представлены рекомендации по вызову функций и методов интерпретатора-родителя из интерпретатора-наследника.
INCT_Interpreter.TransLine - вызывать TransLine родителя в случае, если анализ строки управляющей программы не привёл к уменьшению исходной строки. Все параметры, которые вернул метод родителя (ProcessedChars, NextLine, BreakLine) передать в выходные параметры метода наследника.
INCT_Interpreter.DefineRegister - вызывать DefineRegister родителя в случае, если определение регистра по адресу не произведено в наследнике. Параметр Index и результат работы, которые вернула функция родителя передать в выходной параметр и результат работы функции наследника.
INCT_Interpreter.BeforeInterprete - вызывать BeforeInterprete родителя всегда.
INCT_Interpreter.Interprete - вызывать Interprete родителя в случае, если интерпретация объекта интерпретации не производится наследником.
INCT_Interpreter.AfterInterprete - вызывать AfterInterprete родителя всегда.
INCT_Interpreter.EndOfProgram - вызывать EndOfProgram родителя всегда, если наследником не определён конец управляющей программы. Результат работы функции родителя передавать в качестве результата работы функции наследника.
На странице Пример интерпретатора приведён пример исходных кодов библиотеки интерпретатора-наследника, собранной из них 'dll', и пример файла настроек.