UNIX — универсальная среда программирования
Шрифт:
}
double integer(x)
double x;
{
return (double)(long)x;
}
double errcheck(d, s) /* check result of library call */
double d;
char *s;
{
if (errno == EDOM) {
errno = 0;
execerror(s, "argument out of domain");
} else if (errno == ERANGE) {
errno = 0;
execerror(s, "result out of range");
}
return d;
}
3.6.9
symbol.c
#include "hoc.h"
#include "y.tab.h"
static Symbol *symlist =0; /* symbol table: linked list */
Symbol *lookup(s) /* find s in symbol table */
char *s;
{
Symbol *sp;
for (sp = symlist; sp != (Symbol*)0; sp = sp->next)
if (strcmp(sp->name, s) == 0)
return sp;
return 0; /* 0 ==> not found */
}
Symbol *install(s, t, d) /* install s in symbol table */
char *s;
int t;
double d;
{
Symbol *sp;
char *emalloc;
sp = (Symbol*)emalloc(sizeof(Symbol));
sp->name = emalloc(strlen(s)+1); /* +1 for '\0' */
strcpy(sp->name, s);
sp->type = t;
sp->u.val = d;
sp->next = symlist; /* put at front of list */
symlist = sp;
return sp;
}
char *emalloc(n) /* check return from malloc */
unsigned n;
{
char *p, *malloc;
p = malloc(n);
if (p == 0)
execerror("out of memory", (char*)0);
return p;
}
3.7
hoc6
3.7.1
ack
func ack {
n = n+1
if ($1 == 0) return ($2+1)
if ($2 == 0) return (ack($1 - 1, 1))
return (ack($1 - 1, ack($1, $2 - 1)))
}
n=0
ack(3,3)
print n, "calls\n"
3.7.2
ack1
func ack {
n = n+1
if ($1 == 0) return ($2+1)
if ($2 == 0) return (ack($1 - 1, 1))
return (ack($1 - 1, ack($1, $2 - 1)))
}
n=0
while (read(x)) {
read(y)
print ack(x,y), "\n"
}
print n,"\n"
3.7.3
code.c
#include "hoc.h"
#include "y.tab.h"
#include <stdio.h>
#define NSTACK 256
static Datum stack[NSTACK]; /* the stack */
static Datum *stackp; /* next free spot on stack */
#define NPROG 2000
Inst prog[NPROG]; /* the machine */
Inst *progp; /* next free spot for code generation */
Inst *pc; /* program counter during execution */
Inst *progbase = prog; /* start of current subprogram */
int returning; /* 1 if return stmt seen */
typedef struct Frame { /* proc/func call stack frame */
Symbol *sp; /* symbol table entry */
Inst *retpc; /* where to resume after return */
Datum *argn; /* n-th argument on stack */
int nargs; /* number of arguments */
} Frame;
#define NFRAME 100
Frame frame[NFRAME];
Frame *fp; /* frame pointer */
initcode {
progp = progbase;
stackp = stack;
fp = frame;
returning = 0;
}
push(d)
Поделиться:
Популярные книги
Дракон - не подарок
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Бастард Императора. Том 8
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Чужая дочь
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Эра Мангуста. Том 2
2. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Один на миллион. Трилогия
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Помещицы из будущего
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Шлейф сандала
Фантастика:
фэнтези
6.00
рейтинг книги
Черный маг императора 2
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Император
7. Прометей
Фантастика:
фэнтези
7.11
рейтинг книги
Бандит 2
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
На границе империй. Том 9. Часть 2
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Князь Серединного мира
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Чайлдфри
Любовные романы:
современные любовные романы
6.51