ref: a89ada0279a41c1bd6664dc385044702f78fffb4
parent: 172f8ee76f139634c66d22bb910b848d198a5c00
author: rodri <rgl@antares-labs.eu>
date: Tue Mar 25 18:39:23 EDT 2025
parse declarations
--- a/builtin.c
+++ b/builtin.c
@@ -72,6 +72,24 @@
return -1;
}
+int
+vartype(int tt)
+{
+ switch(tt){
+ case TDOUBLE: return TYPDOUBLE;
+ case TPT2: return TYPPT2;
+ case TPT3: return TYPPT3;
+ case TVEC2: return TYPVEC2;
+ case TVEC3: return TYPVEC3;
+ case TNORMAL2: return TYPNORMAL2;
+ case TNORMAL3: return TYPNORMAL3;
+ case TQUAT: return TYPQUAT;
+ case TMAT3: return TYPMAT3;
+ case TMAT4: return TYPMAT4;
+ }
+ return -1;
+}
+
void
initsyms(void)
{
@@ -78,7 +96,8 @@
int i;
for(i = 0; i < nelem(consts); i++)
- declsym(consts[i].name, SYMCONST, consts[i].val);
+ if(declsym(consts[i].name, SYMCONST, consts[i].val) == nil)
+ sysfatal("could not declare constant: %r");
}
char *
@@ -85,30 +104,30 @@
gettokenname(Token *t)
{
static char *tab[] = {
- [TDOUBLE-TEOF] "TDOUBLE",
- [TPT2-TEOF] "TPT2",
- [TPT3-TEOF] "TPT3",
- [TVEC2-TEOF] "TVEC2",
- [TVEC3-TEOF] "TVEC3",
- [TNORMAL2-TEOF] "TNORMAL2",
- [TNORMAL3-TEOF] "TNORMAL3",
- [TQUAT-TEOF] "TQUAT",
- [TMAT3-TEOF] "TMAT3",
- [TMAT4-TEOF] "TMAT4",
- [TNUM-TEOF] "TNUM",
- [TSTR-TEOF] "TSTR",
- [TPP-TEOF] "TPP",
- [TMM-TEOF] "TMM",
- [TEQ-TEOF] "TEQ",
- [TLAND-TEOF] "TLAND",
- [TLOR-TEOF] "TLOR",
- [TID-TEOF] "TID",
+ [TDOUBLE-TDOUBLE] "TDOUBLE",
+ [TPT2-TDOUBLE] "TPT2",
+ [TPT3-TDOUBLE] "TPT3",
+ [TVEC2-TDOUBLE] "TVEC2",
+ [TVEC3-TDOUBLE] "TVEC3",
+ [TNORMAL2-TDOUBLE] "TNORMAL2",
+ [TNORMAL3-TDOUBLE] "TNORMAL3",
+ [TQUAT-TDOUBLE] "TQUAT",
+ [TMAT3-TDOUBLE] "TMAT3",
+ [TMAT4-TDOUBLE] "TMAT4",
+ [TNUM-TDOUBLE] "TNUM",
+ [TSTR-TDOUBLE] "TSTR",
+ [TPP-TDOUBLE] "TPP",
+ [TMM-TDOUBLE] "TMM",
+ [TEQ-TDOUBLE] "TEQ",
+ [TLAND-TDOUBLE] "TLAND",
+ [TLOR-TDOUBLE] "TLOR",
+ [TID-TDOUBLE] "TID",
};
- if(t->type < TEOF || t->type >= TEOF + nelem(tab))
+ if(t->type < TDOUBLE || t->type >= TDOUBLE + nelem(tab))
return nil;
- return tab[t->type-TEOF];
+ return tab[t->type-TDOUBLE];
}
void
--- a/dat.h
+++ b/dat.h
@@ -58,9 +58,12 @@
enum {
TYPDOUBLE,
- TYPPOINT,
- TYPVECTOR,
- TYPNORMAL,
+ TYPPT2,
+ TYPPT3,
+ TYPVEC2,
+ TYPVEC3,
+ TYPNORMAL2,
+ TYPNORMAL3,
TYPQUAT,
TYPMAT3,
TYPMAT4,
--- a/fns.h
+++ b/fns.h
@@ -4,13 +4,15 @@
char *estrdup(char*);
/* sym */
-Symbol *declsym(char*, int, double);
+Symbol *declsym(char*, int, ...);
Symbol *getsym(char*);
+void printsymtab(void);
/* builtin */
int lookupkw(char*);
int opstart(int);
int findop(char*);
+int vartype(int);
void initsyms(void);
char *gettokenname(Token*);
void printtoken(Token*);
@@ -18,3 +20,5 @@
/* lexer */
int lex(Lexer*);
int peek(Lexer*);
+int expect(Lexer*, int);
+int gottype(Lexer*);
--- a/lexer.c
+++ b/lexer.c
@@ -178,3 +178,34 @@
l->peektok = scan(l);
return l->peektok.type;
}
+
+int
+expect(Lexer *l, int t)
+{
+ if(lex(l) != t){
+ werrstr("expected '%C', got '%C' (%s)",
+ t, l->tok.type, gettokenname(&l->tok));
+ return 0;
+ }
+ return 1;
+}
+
+int
+gottype(Lexer *l)
+{
+ switch(peek(l)){
+ case TDOUBLE:
+ case TPT2:
+ case TPT3:
+ case TVEC2:
+ case TVEC3:
+ case TNORMAL2:
+ case TNORMAL3:
+ case TQUAT:
+ case TMAT3:
+ case TMAT4:
+ lex(l);
+ return 1;
+ }
+ return 0;
+}
--- a/sym.c
+++ b/sym.c
@@ -8,17 +8,35 @@
static Symbol *symtab;
Symbol *
-declsym(char *s, int t, double v)
+declsym(char *s, int t, ...)
{
Symbol *sym;
+ va_list a;
+ va_start(a, t);
+
sym = emalloc(sizeof(Symbol));
sym->name = estrdup(s);
sym->type = t;
- sym->cval = v;
- sym->var.type = -1;
+
+ switch(t){
+ case SYMVAR:
+ sym->var = va_arg(a, Var);
+ break;
+ case SYMCONST:
+ sym->cval = va_arg(a, double);
+ break;
+ default:
+ va_end(a);
+ free(sym->name);
+ free(sym);
+ werrstr("unknown symbol type");
+ return nil;
+ }
sym->next = symtab;
symtab = sym;
+
+ va_end(a);
return sym;
}
@@ -31,4 +49,26 @@
if(strcmp(sym->name, s) == 0)
return sym;
return nil;
+}
+
+void
+printsymtab(void)
+{
+ Symbol *sym;
+
+ for(sym = symtab; sym != nil; sym = sym->next){
+ print("sym name '%s' type", sym->name);
+ switch(sym->type){
+ case SYMVAR:
+ print(" var %d [%g,%g,%g,%g]\n",
+ sym->var.type,
+ sym->var.val[0], sym->var.val[1],
+ sym->var.val[2], sym->var.val[3]);
+ break;
+ case SYMCONST:
+ print(" const [%g]\n", sym->cval);
+ break;
+ }
+ print("\n");
+ }
}
--
⑨