/* Global definitions of limits and constants */ #define MAX_LINE_LENGTH 1024 #define MAX_LINE_TOKENS 1024 typedef enum { ArrayTag, FunctionTag, HybridTag, MonadicOpTag, DyadicOpTag, BoundFunctionTag, /* Function with left arg bound */ LParTag, RParTag, LCurlTag, RCurlTag, LBracketTag, RBracketTag, ArrowTag, AssignmentTag, NameTag, } datumTag; typedef enum { AtypeInt, AtypeArray, } arrayDataType; /* Data types */ typedef struct Array Array; typedef struct Statement Statement; typedef struct Function Function; typedef struct Datum Datum; typedef struct Symbol Symbol; typedef struct Symtab Symtab; struct Array { arrayDataType type; int rank; int *shape; int size; int stranded; /* 1 if build directly by stranding */ union { char *rawdata; vlong *intdata; Array **arraydata; }; }; struct Statement { int ntoks; Datum *toks; Statement *next; }; struct Function { union { int code; Statement *dfn; }; Array *left; }; struct Datum { datumTag tag; int shy; union { Array *array; Statement stmt; Function func; Symbol *symbol; }; }; struct Symbol { int undefined; Rune *name; Datum value; }; struct Symtab { int nsyms; Symbol **syms; }; typedef Array* (*fnmonad)(Array*); typedef Array* (*fndyad)(Array*, Array*); /* Function prototypes for the different source files */ /* print.c */ Rune *ppdatum(Datum); Rune *ppdatums(Datum *, int); Rune *pparray(Array *); /* lexer.c */ Statement *lexline(Rune *, Symtab *); /* array.c */ Array *mkarray(int, int, int); Array *mkscalarint(vlong); Array *duparray(Array *); int simplearray(Array *); int simplescalar(Array *); /* eval.c */ Datum *eval(Statement *); /* symbol.c */ Symbol *getsym(Symtab *, Rune *); Symtab *newsymtab(void); vlong globalIO(void); /* Monadic functions from functions.h */ Array *fnSame(Array *); Array *fnTally(Array *); Array *fnEnclose(Array *); Array *fnNest(Array *); Array *fnIndexGenerator(Array *); Array *fnRavel(Array *); Array *fnShape(Array *); /* Dyadic functions from functions.h */ Array *fnLeft(Array *, Array *); Array *fnRight(Array *, Array *); Array *fnCatenateFirst(Array *, Array *); Array *fnReshape(Array *, Array *); /* Global variables */ extern int traceeval; /* eval.c */ extern Rune *errormsg; /* eval.c */ extern int datasizes[]; /* array.c */ extern Rune primfuncnames[]; /* function.c */ extern Rune primmonopnames[]; /* lexer.c */ extern Rune primdyadopnames[]; /* lexer.c */ extern Rune primhybridnames[]; /* lexer.c */ extern fnmonad monadfunctiondefs[]; /* function.c */ extern fndyad dyadfunctiondefs[]; /* function.c */ extern Symtab *globalsymtab; /* symbol.c */ extern Symtab *currentsymtab; /* symbol.c */