Алгоритм определения регистра и значения в кадре текста управляющей программы
На этапе распознавания кадра текста управляющей программы ядро CAM системы оперирует лексемами - последовательностями допустимых символов языка, имеющих смысл для транслятора.
Алгоритм определения регистра и значения:
- Для определения регистра ядро считывает лексему из строки управляющей программы (порядок чтения лексемы приведён ниже).
- Если лексема не является регистром, то работа алгоритма завершается. Полученная из текста управляющей программы лексема будет считаться обработанной и нераспознанной.
- Если лексема является регистром без значения (т.е. функция INCT_Register.Get_ValueAvail регистра возвращает vatOnlyAddr), то работа алгоритма завершается. Полученная из текста управляющей программы лексема будет считаться обработанной, регистр определён.
- В ином случае ядро считывает лексемы последовательно, ожидая встретить число (со знаком или без) или символ '=' (если он разрешён настройкой INCT_Analyzer.CanUseEqualToAssignRegister), после которого ожидается число или строка в кавычках. Скобки (настройка INCT_Analyzer.Brackets) при определении значения регистра не используются. Чтение лексем производится до тех пор, пока ядро не определит значение регистра или встретит некорректную лексему. В обоих случаях работа алгоритма завершается, лексемы будут считаться обработанными. В первом случае успешно — регистр найден, значение определено. Во втором — неуспешно, лексемы считаются нераспознанными.
Порядок чтения лексемы:
- Из текста управляющей программы считывается первый символ строки;
- Если символ является числом или точкой, считается, что вычитываемая лексема - число, далее из текста управляющей программы считываются символы, до тех пор, пока они являются числами. Чтение лексемы закончено успешно;
- Если символ является одним из элементов списка: '+', '-', '=', ',' (а при включённой настройке INCT_Analyzer.CanUseEqualToAssignRegister - ещё и одной из скобок, заданных в настройке INCT_Analyzer.Brackets), считается, что лексема состоит из одного символа. Чтение лексемы закончено успешно.
- Если символ является кавычкой (т.е. включен в список INCT_Analyzer.Quotes), то ядро ищет вторую кавычку в текущем кадре управляющей программы. При её нахождении, считает лексему строкой, чтение которой закончено успешно. Если вторая кавычка не найдена, весь текст до конца кадра считается обработанным, а чтение лексемы признаётся неуспешным.
- Если символ является первым символом комментария (т.е. включен в список INCT_Analyzer.Comments), то ядро ищет закрывающий символ комментария. При его нахождении, считает лексему комментарием, чтение которого закончено успешно. Если закрывающий символ не найден, весь текст до конца кадра считается обработанным и нераспознанным, а чтение лексемы признаётся неуспешным.
- Если символ является строчной или прописной буквой латинского алфавита, то ядро попытается определить регистр. Ядро считывает подряд идущие буквы. Если в сформированном (базовом) списке регистров есть составные адреса (например, 'TOOL CALL', 'DL+', 'DR2'), ядро продолжает считывать следующие части кадра (буквы, числа, '+' или '-', пробелы), пока они совпадают с частями этих адресов. Настройки INCT_Analyzer.RegistersContainSpaces, INCT_Analyzer.RegistersCanEndWithPlusOrMinus и INCT_Analyzer.RegistersCanEndWithNumber устарели и на чтение лексемы не влияют. Полученный набор символов направляется интерпретатору для определения регистра (функция INCT_Interpreter.DefineRegister). Если интерпретатор вернул отрицательный ответ (регистр не определён), ядро ищет регистр в сформированном (базовом) списке регистров по полю "Адрес". Если регистр найден в списке или на предыдущем шаге интерпретатор вернул положительный ответ (регистр найден), то лексема считается определённой — это регистр. Чтение лексемы закончилось успешно, в ином случае считанные символы считаются обработанными, а чтение лексемы признаётся неуспешным.
Примечание.
При реализации функции (INCT_Interpreter.DefineRegister) рекомендуется выполнять поиск только тех регистров, которые не могут быть определены ядром CAM системы однозначно. В остальных случаях поиск не выполнять, возвращать отрицательный результат.