From 425ef692da7e74112f88f0b368f3286dba84f846 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Thu, 18 Jun 2020 19:45:40 -0700 Subject: feat: working parser for rc shell language --- sys/cmd/rc/rc.h | 254 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 sys/cmd/rc/rc.h (limited to 'sys/cmd/rc/rc.h') diff --git a/sys/cmd/rc/rc.h b/sys/cmd/rc/rc.h new file mode 100644 index 0000000..ad46a77 --- /dev/null +++ b/sys/cmd/rc/rc.h @@ -0,0 +1,254 @@ +#pragma once + +#include +#include + +#include +#include + +#define alloc(ptr) ptr = emalloc(sizeof(*ptr)) + +// ----------------------------------------------------------------------- +// main enums + +#define GLOB 0x01 + +/* TODO: make sure there are no collisions */ +enum +{ + /* keywords */ + Kstart=11, Kfor, Kin, Kwhile, Kif, Kelse, + Kswitch, Kcase, Kfunc, Ktwiddle, + Kbang, Ksubsh, Kend, + + /* tokens */ + Aword='w', Aredir='r', Adup='d', Asimple='s', + Aargs='A', Awords='W', Abrace='b', Aparen='p', Asub='S', + Apcmd='c', Apipefd='-', Aandand='%', Aoror='@', Acount='#', + + Atick='`', Apipe = '|', Adol='$', Aquote='"', Aand='&', + Alparen = '(', Arparen = ')', Albrace='{', Arbrace='}', + Asemi=';', Acarot='^', Aeq='=', +}; + +enum +{ + Rappend = 1, + Rwrite = 2, + Rread = 3, + Rhere = 4, + Rdupfd = 5, + Rclose = 6, + Rrdwr = 7, +}; + +// ----------------------------------------------------------------------- +// main types + +typedef union Code Code; +typedef struct Word Word; +typedef struct List List; +typedef struct Var Var; +typedef struct Tree Tree; +typedef struct Builtin Builtin; +typedef struct Thread Thread; +typedef struct Io Io; + +union Code +{ + int i; + char *s; + void (*f)(void); +}; + +struct Word +{ + char *word; + Word *link; +}; + +struct List +{ + Word *words; + List *link; +}; + +struct Var +{ + string name; + Word *val; + Code *func; + Var *link; +}; + +struct Tree +{ + ushort type; + uchar quoted : 1; + union { + char *str; + struct { + ushort type; + int fd[2]; + } redir; + }; + + Tree *child[3], *link; +}; + +struct Builtin +{ + char *cmd; + void (*func)(void); +}; + +struct Thread +{ + Code *code, *ip; + List *stack; + Var *local; + struct { + uchar eof : 1; + int line; + char *name; + Io *io; + } cmd; + + int pid; + Tree *nodes; + Thread *link; /* continuation */ +}; + +struct Io +{ + int fd; + uchar *b, *e, buf[]; +}; + +// ----------------------------------------------------------------------- +// global interpreter variables + +extern Thread *shell; +extern int ntrap; +extern int status; + +extern Io *errio; + +extern Builtin builtins[]; +extern Var *globals[1021]; /* for now must be prime */ + +// ----------------------------------------------------------------------- +// interpreter functions (defined in exec.c) + +/* + * notation: + * (var1, var2, ...) : items from stack + * [var1, var2, ...] : items from code stream + * -> moves value + */ +extern void Xmark(void); /* Xmark: delimit stack with new list */ +extern void Xword(void); /* Xword[val] -> (val) */ +extern void Xassign(void); /* Xassign(name, val): assign name to val */ +extern void Xdol(void); /* Xdol(name): get variable value */ +extern void Xsimple(void); /* Xsimple(args): run command */ +extern void Xexit(void); /* Xexit: exit with status */ +extern void Xerror(char *s); /* Xerror: report an error */ +extern void Xparse(void); + +// ----------------------------------------------------------------------- +// shell functions + +/* + * util.c + */ +void *emalloc(uintptr size); +void *erealloc(void *ptr, uintptr size); +void efree(void *); +void panic(char *msg, int n); + +/* + * io.c + */ +Io *openfd(int fd); +Io *openstr(void); +Io *opencore(int len, char *s); +void rewindio(Io *f); +void closeio(Io *f); +void flush(Io **fp); + +/* reads */ +int rchr(Io *f); + +/* writes */ +int pchr(Io *f, int c); +void pquo(Io *f, char *s); +void pwrd(Io *f, char *s); +void pptr(Io *f, void *v); +void pstr(Io *f, char *s); +void pdec(Io *f, int n); +void poct(Io *f, uint n); +void pval(Io *f, Word *a); +void pcmd(Io *f, Tree *t); +void pfmt(Io *f, char *fmt, ...); +void vpfmt(Io *f, char *fmt, va_list args); + +/* + * word.c + */ +void pushlist(void); +void freelist(Word *w); +void poplist(void); + +int count(Word *w); +Word *newword(char *w, Word *link); +void pushword(char *w); + +/* + * tree.c + */ + +Tree *newtree(void); +void freetree(Tree *t); +Tree *tree3(int type, Tree *c0, Tree *c1, Tree *c2); +Tree *tree2(int type, Tree *c0, Tree *c1); +Tree *tree1(int type, Tree *c0); + +Tree *hang1(Tree *p, Tree *c0); +Tree *hang2(Tree *p, Tree *c0, Tree *c1); +Tree *hang3(Tree *p, Tree *c0, Tree *c1, Tree *c2); +Tree *epihang(Tree *c, Tree *epi); +Tree *simplehang(Tree *t); +Tree *wordnode(char *w); + +/* + * var.c + */ + +Var *newvar(char *name, Var *link); +Var *gvlookup(char *name); +Var *vlookup(char *name); + +int kwlookup(char *name); +void initkw(void); + +/* + * lex.c + */ + +void skipnl(void); +int wordchr(char c); + +void rcerror(char *msg, ...); +int lex(Tree **node); + +/* + * parse.c + */ + +int parse(void); + +/* + * main.c + */ + +void dotrap(void); -- cgit v1.2.1