Введите в свою программу операции присваивания из языка Си вида +=
*= и т.п., а также операции инкремента и декремента ++ и --. Измените операции && и || так, чтобы обеспечить вычисление слева направо и условное вычисление, как в Си программах.Введите в hoc5
for, как в Си-программах. Добавьте операторы break и continue.Как бы вы изменили грамматику или лексический анализатор hoc5
Добавьте к hoc5
Неудобно создавать программный файл, запускать его на выполнение, а затем редактировать с целью внесения небольших изменений. Как бы вы изменили hoc5
hoc-программы? 8.6 Этап 6: функции и процедуры; ввод-вывод
На последнем из описываемых здесь этапе развития программа значительно разрастается: в нее добавляются процедуры и функции, средства печати строк символов наряду с числами и чтения чисел из стандартного входного потока. Кроме того, в язык hoc6
"-", обозначающее стандартный входной поток. Все эти изменения увеличивают программу на 235 строк, доводя ее общий размер до 810 строк. В результате hoc преобразуется из калькулятора в интерпретатор языка программирования. Полностью программа приводится в приложении 3.В грамматике вызовы функции определяются как выражения, а вызовы процедур как операторы. И то, и другое детально поясняется в приложении 2, где дается еще несколько примеров. Так, определение и использование процедуры печати всех чисел Фибоначчи, меньших заданного параметра, происходят следующим образом:
$ cat fib
proc fib() {
a = 0
b = 1
while (b < $1) {
print b
с = b
b = a+b
a = с
}
print "\n"
}
$ hoc6 fib -
fib(1000)
1 1 2 3 5 8 13 21 34.55 89 144 233 377 610 987
...
Здесь также показано использование файлов: имя файла "-"
Ниже приведена функция "факториал":
$ cat fac
func fac() {
if ($1 <= 0) return 1 else return $1 * fac($1-1)
}
$ hoc6 fac -
fac(0)
1
fac(7)
5040
fac(10)
3628800
...
Внутри процедуры или функции к параметрам можно обращаться с помощью $1
В языке hoc
Требуется значительное число изменений для преобразования грамматики при переходе от hoc5
hoc6, но все они локальные. Нужны новые лексемы и нетерминальные символы, а в описание %union необходимо ввести новый элемент для хранения числа аргументов:$cat hoc.y
...
%{
#include "hoc.h"
#define code2(c1,c2) code(c1); code(c2)