$ cat init.с...static struct { /* Keywords */ char *name; int kval;} keywords [] = { "if", IF, "else", ELSE, "while", WHILE, "print", PRINT, 0, 0,};...Для занесения в таблицу имен ключевых слов нужно организовать еще один цикл в функции
init...for (i = 0; keywords[i].name; i++) install(keywords[i].name, keywords[i].kval, 0.0);...Изменения в функциях, управляющих таблицей имен, не требуются; в файле
code.cprexprprintprexpr() /* print numeric value */{ Datum d; d = pop(); printf ('"%.8g\n", d.val);}Это не та функция печати, которая автоматически вызывается для вывода окончательного результата вычислений. Здесь выбирается число из стека и добавляется символ перевода строки к выходному потоку.
Теперь
hoc5Добавьте для отладки к
hoc5Введите в свою программу операции присваивания из языка Си вида
+=*=++--&&||Введите в
hoc5forbreakcontinueКак бы вы изменили грамматику или лексический анализатор
hoc5Добавьте к
hoc5Неудобно создавать программный файл, запускать его на выполнение, а затем редактировать с целью внесения небольших изменений. Как бы вы изменили
hoc5hoc8.6 Этап 6: функции и процедуры; ввод-вывод
На последнем из описываемых здесь этапе развития программа значительно разрастается: в нее добавляются процедуры и функции, средства печати строк символов наряду с числами и чтения чисел из стандартного входного потока. Кроме того, в язык
hoc6"-"hocВ грамматике вызовы функции определяются как выражения, а вызовы процедур как операторы. И то, и другое детально поясняется в приложении 2, где дается еще несколько примеров. Так, определение и использование процедуры печати всех чисел Фибоначчи, меньших заданного параметра, происходят следующим образом:
$ cat fibproc 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 facfunc fac() { if ($1 <= 0) return 1 else return $1 * fac($1-1)}$ hoc6 fac -fac(0) 1fac(7) 5040fac(10) 3628800...Внутри процедуры или функции к параметрам можно обращаться с помощью
$1