*****************************************************************************/
static void init_item(Item* item, Symbol* sym)
{
+ item->type = sym->type;
if (SYM_VAR == sym->class)
{
item->mode = (sym->global ? ITEM_MVAR : ITEM_VAR);
+ item->imm.s = sym->name;
+ }
+ else if (SYM_PROC == sym->class)
+ {
+ item->mode = ITEM_MVAR;
+ item->imm.s = sym->name;
}
else
{
item->mode = ITEM_CONST;
+ item->imm = sym->imm;
}
- item->imm = sym->imm;
- item->type = sym->type;
}
/* Grammar Definition
char* name = expect_text(p, IDENT);
Symbol* sym = symbol_get(p, -1, name);
init_item(item, sym);
- if (sym->class == SYM_VAR || sym->class == SYM_PROC)
- {
- item->imm.s = sym->name;
- }
// if (accept(p, '.'))
// {
if (item->type->form == FORM_ARRAY)
{
codegen_index(p, item, &index);
-// item->type = item->type->base;
}
else
{
}
else if (accept(p, RECORD))
{
+
+
+// do
+// {
+// int nsyms = 0;
+// Symbol* first = NULL;
+// Symbol* sym = NULL;
+//// Symbol* type = NULL;
+// char* name = NULL;
+// bool export = false;
+//
+// do
+// {
+// name = expect_text(p, IDENT);
+// export = accept(p, '*');
+// sym = symbol_new(p, name, SYM_VAR, export);
+// first = (nsyms == 0 ? sym : first);
+// sym->global = (p->level <= 1 ? 1 : 0);
+// nsyms++;
+// }
+// while (accept(p, ','));
+//
+// Item base_type = {0};
+// expect(p, ':');
+// type(p, &base_type);
+//
+//// name = expect_text(p, IDENT);
+//// type = symbol_get(p, SYM_TYPE, name);
+//
+// /* apply the type to the newly created symbols */
+// for (int i = 0; i < nsyms; i++)
+// {
+// first->type = base_type.type;
+// codegen_var(p, first);
+// sym = first->next;
+// }
+// }
+// while (matches(p, IDENT));
+
+ while (peek(p)->type != END)
+ {
+ int nsyms = 0;
+ Symbol head = {0};
+ Symbol **prev = &(head.next);
+ do
+ {
+ char* name = expect_text(p, IDENT);
+ bool export = accept(p, '*');
+ *prev = symbol_new(p, name, SYM_VAR, export);
+ nsyms++;
+ }
+ while (accept(p, ','));
+
+ Item base_type = {0};
+ expect(p, ':');
+ type(p, &base_type);
+
+// /* apply the type to the newly created symbols */
+// for (int i = 0; i < nsyms; i++)
+// {
+// first->type = base_type.type;
+// codegen_var(p, first);
+// sym = first->next;
+// }
+ }
+
expect(p, END);
}
else