Commit f0cba1de authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Create VCC_SymbolGetTok() variant

parent 5d3d3eea
...@@ -356,6 +356,8 @@ extern const char SYMTAB_NOERR[]; ...@@ -356,6 +356,8 @@ extern const char SYMTAB_NOERR[];
extern const char SYMTAB_CREATE[]; extern const char SYMTAB_CREATE[];
struct symbol *VCC_SymbolGet(struct vcc *, vcc_kind_t, const char *, struct symbol *VCC_SymbolGet(struct vcc *, vcc_kind_t, const char *,
const char *); const char *);
struct symbol *VCC_SymbolGetTok(struct vcc *, vcc_kind_t, const char *, const char *, struct token *);
typedef void symwalk_f(struct vcc *tl, const struct symbol *s); typedef void symwalk_f(struct vcc *tl, const struct symbol *s);
void VCC_WalkSymbols(struct vcc *tl, symwalk_f *func, vcc_kind_t); void VCC_WalkSymbols(struct vcc *tl, symwalk_f *func, vcc_kind_t);
......
...@@ -198,30 +198,31 @@ const char SYMTAB_NOERR[] = "sym_noerror"; ...@@ -198,30 +198,31 @@ const char SYMTAB_NOERR[] = "sym_noerror";
const char SYMTAB_CREATE[] = "sym_create"; const char SYMTAB_CREATE[] = "sym_create";
struct symbol * struct symbol *
VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x) VCC_SymbolGetTok(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x,
struct token *t)
{ {
struct symbol *sym; struct symbol *sym;
AN(e); AN(e);
if (tl->syntax >= VCL_41 && e == SYMTAB_CREATE && kind != SYM_SUB && if (tl->syntax >= VCL_41 && e == SYMTAB_CREATE && kind != SYM_SUB &&
(tl->t->b[0] == 'v'|| tl->t->b[0] == 'V') && (t->b[0] == 'v'|| t->b[0] == 'V') &&
(tl->t->b[1] == 'c'|| tl->t->b[1] == 'C') && (t->b[1] == 'c'|| t->b[1] == 'C') &&
(tl->t->b[2] == 'l'|| tl->t->b[2] == 'L') && (t->b[2] == 'l'|| t->b[2] == 'L') &&
(tl->t->b[3] == '_')) { (t->b[3] == '_')) {
VSB_printf(tl->sb, VSB_printf(tl->sb,
"Symbols named 'vcl_*' are reserved.\nAt:"); "Symbols named 'vcl_*' are reserved.\nAt:");
vcc_ErrWhere(tl, tl->t); vcc_ErrWhere(tl, t);
return (NULL); return (NULL);
} }
sym = VCC_Symbol(tl, NULL, tl->t->b, tl->t->e, kind, sym = VCC_Symbol(tl, NULL, t->b, t->e, kind,
e == SYMTAB_CREATE ? 1 : 0, tl->syntax, tl->syntax); e == SYMTAB_CREATE ? 1 : 0, tl->syntax, tl->syntax);
if (sym == NULL && e == SYMTAB_NOERR) if (sym == NULL && e == SYMTAB_NOERR)
return (sym); return (sym);
if (sym == NULL) { if (sym == NULL) {
VSB_printf(tl->sb, "%s: ", e); VSB_printf(tl->sb, "%s: ", e);
vcc_ErrToken(tl, tl->t); vcc_ErrToken(tl, t);
sym = VCC_Symbol(tl, NULL, tl->t->b, tl->t->e, kind, 0, sym = VCC_Symbol(tl, NULL, t->b, t->e, kind, 0,
VCL_LOW, VCL_HIGH); VCL_LOW, VCL_HIGH);
if (sym != NULL) { if (sym != NULL) {
VSB_printf(tl->sb, " (Only available when"); VSB_printf(tl->sb, " (Only available when");
...@@ -233,16 +234,16 @@ VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x) ...@@ -233,16 +234,16 @@ VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x)
VSB_printf(tl->sb, ")"); VSB_printf(tl->sb, ")");
} }
VSB_cat(tl->sb, "\nAt: "); VSB_cat(tl->sb, "\nAt: ");
vcc_ErrWhere(tl, tl->t); vcc_ErrWhere(tl, t);
return (NULL); return (NULL);
} }
assert (sym->lorev <= tl->syntax && sym->hirev >= tl->syntax); assert (sym->lorev <= tl->syntax && sym->hirev >= tl->syntax);
if (kind != SYM_NONE && kind != sym->kind) { if (kind != SYM_NONE && kind != sym->kind) {
VSB_printf(tl->sb, "Symbol "); VSB_printf(tl->sb, "Symbol ");
vcc_ErrToken(tl, tl->t); vcc_ErrToken(tl, t);
VSB_printf(tl->sb, " has wrong type (%s): ", sym->kind->name); VSB_printf(tl->sb, " has wrong type (%s): ", sym->kind->name);
VSB_cat(tl->sb, "\nAt: "); VSB_cat(tl->sb, "\nAt: ");
vcc_ErrWhere(tl, tl->t); vcc_ErrWhere(tl, t);
if (sym->def_b != NULL) { if (sym->def_b != NULL) {
VSB_printf(tl->sb, "Symbol was defined here: "); VSB_printf(tl->sb, "Symbol was defined here: ");
vcc_ErrWhere(tl, sym->def_b); vcc_ErrWhere(tl, sym->def_b);
...@@ -256,22 +257,30 @@ VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x) ...@@ -256,22 +257,30 @@ VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x)
} }
if (x == XREF_DEF) { if (x == XREF_DEF) {
if (sym->def_b == NULL) if (sym->def_b == NULL)
sym->def_b = tl->t; sym->def_b = t;
sym->ndef++; sym->ndef++;
} else if (x == XREF_REF) { } else if (x == XREF_REF) {
if (sym->ref_b == NULL) if (sym->ref_b == NULL)
sym->ref_b = tl->t; sym->ref_b = t;
sym->nref++; sym->nref++;
} else { } else {
assert (x == XREF_NONE); assert (x == XREF_NONE);
} }
vcc_NextToken(tl);
return (sym); return (sym);
} }
struct symbol * struct symbol *
VCC_MkSym(struct vcc *tl, const char *b, vcc_kind_t kind, VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x)
int vlo, int vhi) {
struct symbol *sym;
sym = VCC_SymbolGetTok(tl, kind, e, x, tl->t);
if (sym != NULL)
vcc_NextToken(tl);
return (sym);
}
struct symbol *
VCC_MkSym(struct vcc *tl, const char *b, vcc_kind_t kind, int vlo, int vhi)
{ {
struct symbol *sym; struct symbol *sym;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment