Во многих случаях возникает необходимость в функциях, которые не могут быть описаны средствами
. Для вывода информации на экран используются операции print, prout, которые различаются
Функция осуществляется вызовом
k/card/ .
и дает возможность читать
Функция print осуществляется вызовом
k/print/ <E>.
где E - произвольное
Например, функция
k/print/ 'функция'(/f1/).
возвратит выражение
'функция'(/f1/).
При этом на устройство вывода будет выдана строка
'функция'('f1') ,
Функция prout осуществляется вызовом
k/prout/ <E>.
где E - произвольное print является то, что всегда возвращается пустое выражение.
Функции работают только с целыми числами, каковыми являются в представлении '-'/7/, /0/, /2007/. Нуль представляется либо нулевым
Все
К
add - сложение;mul - умножение;sub - dr - деление нацело с остатком;div - деление нацело;p1 - m1 - Для преобразования целых чисел в символьный вид и обратно используются функции symb и numb.
Функции add, mul, sub осуществляются вызовом
k/op/ (<N1>) <N2>. ,
где - одна из операций add, mul, sub, а N1 и N2 - N1-N2 в зависимости от операции. Например, следующие вызовы функции приведут к таким результатам:
k/add/ ('-'/5/) /3/. -> '-'/2/
k/add/ () /2/. -> /2/
k/mul/ ('-'/5/) /3/. -> '-'/15/
k/mul/ (/2/). -> /0/
k/sub/ ('-'/5/) /3/. -> /8/
k/sub/ () /2/. -> '-'/2/
Функция dr осуществляется вызовом
k/dr/ (<N1>) <N2>. ,
где N1 - делимое, а N2 -
<Q> (<R>) ,
где Q - частное, а R - остаток. Попытка делить на 0 приводит к аварийному завершению. Знаки частного и остатка определяются следующим образом: сначала производится деление нацело без учета знаков
N1 = Q*N2 + R
т. е. остаток (не равный нулю) всегда имеет знак
k/dr/ (/5/) /3/. -> /1/ (/2/)
k/dr/ (/5/) '–'/3/. -> '–'/1/ (/2/)
k/dr/ ('–'/5/) /3/. -> '–'/1/ '–'(/2/)
k/dr/ ('–'/5/) '–'/3/. -> /1/ '–'(/2/)
Функция div в отличие от функции dr возвращает только частное. В остальном же подобна ей. Например, следующие вызовы функции приведут к таким результатам:
k/div/ (/5/) /3/. -> /1/
k/div/ (/5/) '–'/3/. -> '–'/1/
k/div/ ('–'/5/) /3/. -> '–'/1/
k/div/ ('–'/5/) '–'/3/. -> /1/
Функции p1, m1 имеют 1 аргумент и возвращают соответственно
k/p1/ '–'/2007/. -> '–' /2006/ k/p1/. -> /1/ k/m1/ /2007/. -> /2006/ k/m1/. -> '–'/1/
Функция symb преобразует
k/symb/ '–'/2007/. -> '–2007' k/symb/. -> '0'
Функция numb преобразует
k/numb/ '–2007'. -> '–'/2007/ k/numb/ '0'. -> /0/
Функции предназначены для лексического
k/first/ /2/ 'A'('B')'C'. -> ('A'('B')) 'C'
k/first/ /5/ 'A'('B')'C'. -> '*A'('B')'C'
k/last/ /2/ 'A'('B')'C'. -> 'A' (('B')'C')
k/last/ /5/ 'A'('B')'C'. -> 'A'('B')'C*'
k/lengw/ 'A' () ('A'). -> /3/ 'A' () ('A')
k/lengw/ . -> /0/
k/lengr/ 'A' () ('A'). -> /6/ 'A' () ('A')
k/lengr/ . -> /0/
k/multe/ /5/ 'A'. -> 'AAAAA'
k/multe/ /2/ 'A'('B'). -> 'A'('B')'A'('B')
| Имя функции | Выражение аргумента | Назначение функции | Возвращаемое значение |
|---|---|---|---|
first |
<N> <E> | отщепляет от начала выражения E часть, имеющую длину N термов |
(E1) E2, где E = E1E2, указанную или '*'E, если длины мало |
last |
<N> <E> | отщепляет от конца выражения E часть, имеющую указанную длину N термов | E1 (E2), где E = E1E2, или E'*', если длины мало |
lengw |
<E> | определяет длину выражения в |
N E, где N – |
lengr |
<E> | определяет длину выражения в символах вместе со скобками | N E, где N – |
multe |
<N> <E> | размножает выражение E в N экземплярах |
EE...E если N = 0, то пустое выражен. |
Иногда требуется превратить
k/ftochar/ /aaaa3434/. -> 'aaaa3434' k/ftochar/ /ABCD/. -> 'ABCD' k/chartof/ 'aaaa3434'. -> /aaaa3434/ k/chartof/ 'ABCD'. -> /ABCD/ k/functab/ /func1/. ->
| Имя функции | Выражение аргумента | Назначение функции | Возвращаемое значение |
|---|---|---|---|
ftochar |
/<F>/ |
превращает /<F>/ в |
<F> |
chartof |
<F> |
превращает F в |
/<F>/ |
functab |
/<F>/ |
регистрирует /<F>/ |
<пусто> |
Рассмотрим упрощенный язык
<арифмвыр> ::= <арифмвыр>+<множитель>|
<множитель>
<множитель> ::= <множитель>*<первичное>|
<первичное>
<первичное> ::= (<арифмвыраж>)|<число>|
<имяпеременной>
<число> ::= <цифра>|<число><цифра>
<имяпеременной> ::= <буква>|<имяпеременной><буква>|
<имяпеременной><цифра>
<цифра> ::= 0|1|2|3|4|5|6|7|8|9
<буква> ::= A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|
S|T|U|V|W|X|Y|Z|a|b|c|d|e|f|g|h|i|j|k|l|
p|q|r|s|t|u|v|w|x|y|z
Например, правильным арифметическим выражением является следующее
a+(2+c*d)*(d+(a+c)*2),
а выражение
a+(2+c*d*(d+)(a+c)*2)
не является правильным, так как его часть (d+)(a+c) не является множителем (выражение в первых скобках не является правильным арифметическим выражением - нет множителя после знака '+' и между первым и вторым '*' ).
Необходимо построить для этого языка синтаксический анализатор, который бы проверял вводимое арифметическое выражение и в случае правильности выдавал бы в качестве результата на экран строку "Выражение верно", а в случае ошибочности указывал бы ошибочное место и диагностику ошибки (например, "ошибка: d+ - не ).
Программа анализатора на Рефале будет выглядеть следующим образом:
ANALYZE START
ENTRY ArExpr
EXTRN prout, card
ArExpr = k/pr/ k/арифмвыр/ k/prout/'Введите: '. k/card/...
арифмвыр R V1'+'V2 = k/арифмвыр/V1. k/множитель/V2.
E1 = k/множитель/ E1.
множитель R V1'*'V2 = k/множитель/V1. k/первичное/V2.
V1 = k/первичное/ V1.
= '?' – пропущен множитель
первичное '('E1')' = k/арифмвыраж/ E1.
S(D)1 E2 = k/число/ S1 E2.
S(L)1 E2 = k/имяпеременной/ S1 E2.
V1 = '?'V1 – не первичное выражение
число V(D)1 =
E1 = '?'E1 – не число
имяпеременной S(L)1 E(LD)2 =
E1 = '?'E1 – не имя переменной
pr '?' E1 = к/prout/ 'ошибка: ' E1.
E1 = k/prout/ – является выражением.
END
В этой программе вслед за директивой начала START идет директива , определяющая в качестве входа программы функцию ArExpr, и директива , определяющая использование внешних модулей с первичными функциями ввода и вывода prout.
Функция ArExpr, с которой начинается выполнение программы, выводит функцией prout приглашение "Введите: ", затем вводит функцией арифмвыр и, наконец, выводит функцией pr результат синтаксического анализа.
Описание функций арифмвыр, множитель и первичное соответствует
С буква и цифра языка мы не связываем функций программы, так как в Рефале им соответствуют множество L символов букв и множество D символов цифр. Поэтому функции число и имяпеременной определены
В описаниях функций, соответствующих pr идентифицировать ошибку и вывести диагностику. Второе pr выводит сообщение о верности арифметического выражения, т. е. соответствии с приведенным синтаксисом языка
Этот пример показывает, что для построения синтаксического анализатора любого языка надо записать все
Рассмотрим пример разработки программы суммирования последовательности чисел. Числа вводятся с клавиатуры и суммируются до тех пор, пока не будет введен нуль. В этом случае сумма чисел выдается на экран.
Из постановки задачи следует, что каждое вводимое число должно анализироваться на нулевое значение - признак окончания суммирования и, если оно не нуль, накапливаться в сумме. В качестве начального значения суммы возьмем нуль, а ввод очередного слагаемого будем делать в самой функции суммирования. Таким образом, функция sum суммирования:
Эти 2 действия можно осуществить двумя
SUMMA START
ENTRY Summ
EXTRN prout, card, numb, symb, add
Summ = k/pr/ k/sum/(/0/) k/prout/'Добавьте число '.
k/numb/ k/card/....
sum (S(N)1) /0/ = S1
(S(N)1) S(N)2 = k/sum/ (k/add/ (S1) S2.)
k/prout/'Добавьте число '.
k/numb/ k/card/...
pr S(N)1 = к/prout/ 'Сумма=' k/symb/ S1.
E1 = k/prout/ 'ошибка: 'E1.
END
Первичная функция numb преобразует вводимое число из цепочки символов в символ-число, add - добавляет в накапливаемую сумму очередное число, а symb - преобразует полученный результат к выводимой цепочке символов.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.