Алгоритм определения регистра и значения в кадре текста управляющей программы

На этапе распознавания кадра текста управляющей программы ядро SprutCAM оперирует лексемами - последовательностями допустимых символов языка, имеющих смысл для транслятора.


Алгоритм определения регистра и значения:

  1. Для определения регистра ядро считывает лексему из строки управляющей программы (порядок чтения лексемы приведён ниже).

  2. Если лексема не является регистром, то работа алгоритма завершается. Полученная из текста управляющей программы лексема будет считаться обработанной и нераспознанной.

  3. Если лексема является регистром без значения (т.е. поле INCT_Register.ValueAvail регистра имеет значение vatOnlyAddr), то работа алгоритма завершается. Полученная из текста управляющей программы лексема будет считаться обработанной, регистр определён.

  4. В ином случае ядро считывает лексемы последовательно, ожидая встретить число (со знаком или без) или символы '=' (если они разрешены настройкой INCT_Analyzer.CanUseEqualToAssignRegister) и символы скобок (если варианты используемых скобок заданы в настройке INCT_Analyzer.Brackets). Чтение лексем производится до тех пор, пока ядро не определит значение регистра или встретит некорректную лексему. В обоих случаях работа алгоритма завершается, лексемы будут считаться обработанными. В первом случае успешно - регистр найден, значение определено. Во втором - неуспешно, лексемы считаются нераспознанными.


Порядок чтения лексемы:

  • Из текста управляющей программы считывается первый символ строки;

  • Если символ является числом или точкой, считается, что вычитываемая лексема - число, далее из текста управляющей программы считываются символы, до тех пор, пока пока они являются числами. Чтение лексемы закончено успешно;

  • Если символ является одним из элементов списка: '+', '-', '=', ',', считается, что лексема состоит из одного символа. Чтение лексемы закончено успешно.

  • Если символ является кавычкой (т.е. включен в список INCT_Analyzer.Quotes), то ядро ищет вторую кавычку в текущем кадре управляющей программы. При её нахождении, считает лексему строкой, чтение которой закончено успешно. Если вторая кавычка не найдена, весь текст до конца кадра считается обработанным, а чтение лексемы признаётся неуспешным.

  • Если символ является первым символом комментария (т.е. включен в список INCT_Analyzer.Comments), то ядро ищет закрывающий символ комментария. При его нахождении, считает лексему комментарием, чтение которого закончено успешно. Если закрывающий символ не найден, весь текст до конца кадра считается обработанным и нераспознанным, а чтение лексемы признаётся неуспешным.

  • Если символ является строчной или прописной буквой латинского алфавита, то ядро попытается определить регистр. На алгоритм чтения следующих символов из кадра управляющей программы влияют следующие настройки: INCT_Analyzer.RegistersContainSpaces (регистр может содержать пробелы), INCT_Analyzer.RegistersCanEndWithPlusOrMinus (регистр может заканчиваться '+' или '-'), INCT_Analyzer.RegistersCanEndWithNumber (регистр может заканчиваться числами). Ядро пытается распознать лексему считывая символы из кадра последовательно с учётом настроек. Чтение продолжается до тех пор, пока ядро не встретит символ не удовлетворяющий шаблону настроек или не закончится кадр управляющей программы. Полученный набор символов направляется интерпретатору для определения регистра (функция INCT_Interpreter.DefineRegister). Если интерпретатор вернул отрицательный ответ (регистр не определён), ядро ищет регистр в сформированном (базовом) списке регистров по полю "Адрес". Если регистр найден в списке или на предыдущем шаге интерпретатор вернул положительный ответ (регистр найден), то лексема считается определённой - это регистр. Чтение лексемы закончилось успешно, в ином случае считанные символы считаются обработанными, а чтение лексемы признаётся неуспешным.


Примечание.

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