Наследование интерпретатора

Механизм наследования предназначен для повторного использования уже разработанных интерпретаторов при трансляции и интерпретации управляющих программ с похожим, но отличающимся синтаксисом. Степень необходимого отличия управляющей программы от оригинальной для реализации наследника, а не нового интерпретатора, определяется разработчиком самостоятельно.

Предназначение интерпретатора-наследника состоит в трансляции и интерпретации различий в управляющей программе, а так же передаче управления интерпретатору-родителю для трансляции и интерпретации похожих участков текста управляющей программы.

Отличия реализации интерпретатора-наследника от обычного интерпретатора, заключаются в следующем:

  1. В файле настроек интерпретатора (SNCI) заполняются поля ParentID, ParentFileName.

  2. Если присутствует необходимость, переопределяются существующие или добавляются новые регистры. Сделать это можно добавив изменения в список регистров SNCI-файла или в список регистров, возвращаемых функцией INCT_Interpreter.GetRegisters программной библиотеки интерпретатора-наследника.

  3. Реализуется программная библиотека интерпретатора-наследника. При реализации библиотеки, вызов функций и методов программной библиотеки интерпретатора-родителя осуществляется или не осуществляется наследником в зависимости от алгоритмов, закладываемых для трансляции и интерпретации текста управляющей программы. Интерфейс интерпретатора-родителя (INCT_Interpreter) передаётся наследнику при инициализации.

Наследование возможно только от одного родителя. Количество интерпретаторов-наследников от одного родителя и глубина наследования не имеют ограничений.


Наследование регистров.

Регистры интерпретаторов-наследников переопределяют регистры интерпретаторов-родителей. Наследование регистров реализовано таким образом, что в результирующий список (список базовых регистров) производится:

  1. Загрузка списка регистров из файла настроек интерпретатора-наследника.

  2. Загрузка списка регистров из программной библиотеки интерпретатора-наследника (INCT_Interpreter.GetRegisters). Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.

  3. Загрузка списка регистров из файла настроек интерпретатора-родителя. Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.

  4. Загрузка списка регистров из программной библиотеки интерпретатора-родителя. Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.

  5. Загрузка списка регистров из файла настроек родителя интерпретатора-родителя. Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.

  6. Загрузка списка регистров из программной библиотеки родителя интерпретатора-родителя. Если регистр с таким именем уже существует в списке базовых регистров, то он не загружается.

  7. И так далее, до самого первого родителя.


Наследование программной библиотеки.

При инициализации программной библиотеки интерпретатора-родителя, ряд методов и функций вызывается ядром SprutCAM и не требует вызова этих функций из наследника:

  1. INCT_Interpreter.GetIdentifier.

  2. INCT_Interpreter.GetRegisters.

  3. INCT_Interpreter.SetInterface.

  4. INCT_Interpreter.Initialize.

Вызов остальных функций и методов программной библиотеки интерпретатора-родителя осуществляется или не осуществляется наследником в зависимости от алгоритмов, закладываемых для трансляции и интерпретации текста управляющей программы. Для вызова методов родителя, при инициализации программной библиотеки интерпретатора-наследника, ему в том числе передаётся интерфейс интерпретатора-родителя (функция INCT_Interpreter.SetInterface).

Ниже представлены рекомендации по вызову функций и методов интерпретатора-родителя из интерпретатора-наследника.

  1. INCT_Interpreter.TransLine - вызывать TransLine родителя в случае, если анализ строки управляющей программы не привёл к уменьшению исходной строки. Все параметры, которые вернул метод родителя (ProcessedChars, NextLine, BreakLine) передать в выходные параметры метода наследника.

  2. INCT_Interpreter.DefineRegister - вызывать DefineRegister родителя в случае, если определение регистра по адресу не произведено в наследнике. Параметр Index и результат работы, которые вернула функция родителя передать в выходной параметр и результат работы функции наследника.

  3. INCT_Interpreter.BeforeInterprete - вызывать BeforeInterprete родителя всегда.

  4. INCT_Interpreter.Interprete - вызывать Interprete родителя в случае, если интерпретация объекта интерпретации не производится наследником.

  5. INCT_Interpreter.AfterInterprete - вызывать AfterInterprete родителя всегда.

  6. INCT_Interpreter.EndOfProgram - вызывать EndOfProgram родителя всегда, если наследником не определён конец управляющей программы. Результат работы функции родителя передавать в качестве результата работы функции наследника.

На странице Пример интерпретатора приведён пример исходных кодов библиотеки интерпретатора-наследника, собранной из них 'dll', и пример файла настроек.