Синтаксические языковые конструкции
Back Home Up Next

адача 46. Составить программу-функцию проверяющую, является ли данная последовательность символов идентификатором языка Фортран?

Решение. Будем считать, что речь идет о версиях Фортрана, где идентификатор определялся как последовательность из шести заглавных латинских букв и (или) цифр, начинающаяся с буквы, и для символов была принята ASCII-кодировка. Превратить последовательность символов в вектор соответствующих им ASCII-кодов можно с помощью встроенной функции str2vec(). Например:

 str2vec("AZ")T = [65    90],            str2vec("09")T = [48    57].

Дополнительное ограничение на первый символ идентификатора (буква, но не цифра) усложняет общую проверку (или буква, или цифра). Чтобы действия были стандартными для всех символов, проверку первого из них будем осуществлять на допустимость отдельно в головной программе. Естественно там же располагать и проверку длины слова, которая должна находиться в пределах от 1 до 6. Тогда в подпрограмме останется решить вполне рекурсивную подзадачу: если первый символ исходного слова не буква и не цифра, то формируем ответ “не идентификатор”. В противном случае, если длина слова равна единице, то возвращаем ответ “идентификатор”, а иначе укорачиваем слово на первый символ и снова решаем эту же подзадачу. Все сказанное и реализуется головной программой identity(word) и рекурсивной подпрограммой iden(v):

Контрольные примеры:

 identi("M23")T = "yes",         identi("M # HU")T = "no",        identi("1M23")T = "no".

Замечание. В любом языке программирования все базовые языковые конструкции (идентификаторы, константы, переменные, выражения, метки, типы и т. п.) определяются рекурсивно. Особенно наглядно это видно, когда они представлены с помощью синтаксических диаграмм [17, c. 685-703] или в форме Бэкуса - Наура. Подобные определения в рамках конкретного языка программирования могут служить наборами тренировочных заданий по написанию рекурсивных программ и даже простейших рекурсивных трансляторов.

Приведем пример. Идентификатор в Паскале определяется, как и в Фортране, но без ограничений на длину последовательности символов. С помощью синтаксической диаграммы это выглядит так, как указано на рис. 11, а в форме Бэкуса - Наура следующим образом (значок “::=” читается как “есть по определению”):

 < идентификатор> ::=< буква>

< идентификатор> ::=< идентификатор> < буква>

< идентификатор> ::=< идентификатор> < цифра>

Рис. 11. Синтаксическая диаграмма идентификатора (Паскаль)

И в том и в другом случаях идентификатор определяется сам через себя.

Home Содержание Схемы ООД Доска объявлений Поиск