var.c

来自「Object-Oriented Programming With ANSI-C这」· C语言 代码 · 共 82 行

C
82
字号
#include <assert.h>#include <stdlib.h>#include <string.h>#include "Name.h"#include "Name.r"#include "parse.h"#include "Var.h"#include "value.h"#include "value.r"/* *	variables *	tree -> struct Var	(also located in symbol table) */struct Var { struct Name _; double value; };#define	value(tree)	(((struct Var *) tree) -> value)static void * mkVar (va_list ap){	struct Var * node = calloc(1, sizeof(struct Var));	const char * name = va_arg(ap, const char *);	size_t len = strlen(name);	assert(node);	node -> _.name = malloc(len+1);	assert(node -> _.name);	strcpy((void *) node -> _.name, name);	node -> _.token = VAR;	return node;}static double doVar (const void * tree){	return value(tree);}static void freeVar (void * tree){}/* *	assignment *	reuses struct Bin, mkBin() */static double doAssign (const void * tree){	return value(left(tree)) = exec(right(tree));}/* *	variable types */static struct Type _Var = { mkVar, doVar, freeVar };static struct Type _Assign = { mkBin, doAssign, freeBin };const void * Var = & _Var;const void * Assign = & _Assign;/* *	constants *	like variables, but with a distinct token */void initConst (void){	static const struct Var constants [] = {	/* like hoc */		{ { &_Var, "PI",    CONST },  3.14159265358979323846 },		{ { &_Var, "E",     CONST },  2.71828182845904523536 },		{ { &_Var, "GAMMA", CONST },  0.57721566490153286060 }, /* Euler */		{ { &_Var, "DEG",   CONST }, 57.29577951308232087680 }, /* deg/radian */		{ { &_Var, "PHI",   CONST },  1.61803398874989484820 }, /* gold ratio */		{ { 0 } } };	const struct Var * vp;	for (vp = constants; vp -> _.name; ++ vp)		install(vp);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?