double (*func)();} builtins[] = { "sin", sin, "cos", cos, "atan", atan, "log", Log, /* checks argument */ "log10", Log10, /* checks argument */ "exp", Exp, /* checks argument */ "sqrt", Sqrt, /* checks argument */ "int", integer, "abs", fabs, 0, 0};init() /* install constants and built-ins in table */{ int i; Symbol *s; for (i = 0; consts[i].name; i++) install(consts[i].name, VAR, consts[i].eval); for (i = 0; builtins[i].name; i++) { s = install(builtins[i].name, BLTIN, 0.0); s->u.ptr = builtins[i].func; }}3.4.4.
lex.l%{#include "hoc.h"#include "y.tab.h"extern int lineno;%}%%[ \t] { ; } /* skip blanks and tabs */[0-9]+\.?|[0-9][0-9]+ { sscanf(yytext, "%lf", &yylval.val); return NUMBER;}[a-zA-Z][a-zA-Z0-9]* { Symbol *s; if ((s=lookup(yytext)) == 0) s = install(yytext, UNDEF, 0.0); yylval.sym = s; return s->type == UNDEF ? VAR : s->type;}\n { lineno++; return '\n';} /* everything else */. { return yytext[0]; }3.4.5
makefileYFLAGS = -dOBJS = hoc.o lex.o init.o math.o symbol.ohoc3: $(OBJS) cc $(OBJS) -lm -ll -o hoc3hoc.o: hoc.hlex.o init.o symbol.o: hoc.h y.tab.h3.4.6
math.c#include <math.h>#include <errno.h>extern int errno;double errcheck();double Log(x) double x;{ return errcheck(log(x), "log");}double Log10(x) double x;{ return errcheck(log10(x), "log10");}double Sqrt(x) double x;{ return errcheck(sqrt(x), "sqrt");}double Exp(x) double x;{ return errcheck(exp(x), "exp");}double Pow(x, y) double x, y;{ return errcheck(pow(x,y), "exponentiation");}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.4.7
symbol.c#include "hoc.h"#include "y.tab.h"