return sym;
}
+static Symbol* symbol_get(Parser* p, char* name)
+{
+ Symbol* sym = p->scope;
+ for (; sym; sym = sym->next)
+ {
+ if (!strcmp(sym->name, name))
+ {
+ return sym;
+ }
+ }
+ error(p, "unknown identifier '%s'", name);
+ return NULL;
+}
+
/* Type Checking
*****************************************************************************/
static void check_int(Parser* p, Item* item)
check_bool(p, item);
codegen_unop(NOT, item);
break;
-//
-// case IDENT:
-// designator(p, item);
-//// actual_params(p);
-// break;
+
+ case IDENT:
+ designator(p, item);
+// actual_params(p);
+ break;
}
}
-///*
-// designator = qualident {selector}.
-// selector = "." ident | "[" ExpList "]" | "^" | "(" qualident ")".
-// ExpList = expression {"," expression}.
-// qualident = [ident "."] ident.
-//
-// ActualParameters = "(" [ExpList] ")" .
-//*/
-//RULE(designator)
-//{
-// qualident(p);
+/*
+ designator = qualident {selector}.
+ selector = "." ident | "[" ExpList "]" | "^" | "(" qualident ")".
+ ExpList = expression {"," expression}.
+ qualident = [ident "."] ident.
+
+ ActualParameters = "(" [ExpList] ")" .
+*/
+RULE(designator)
+{
+ qualident(p, item);
// /* selector */
// switch ((int)peek(p)->type)
// {
// expect(p, ')');
// break;
// }
-//}
-//
-//RULE(qualident)
-//{
-// expect(p, IDENT);
+}
+
+RULE(qualident)
+{
+ char* name = expect_text(p, IDENT);
+ Symbol* sym = symbol_get(p, name);
+
+ if (sym->class == SYM_CONST)
+ {
+ item->mode = ITEM_CONST;
+ item->imm = sym->imm;
+ }
// if (accept(p, '.'))
// {
// expect(p, IDENT);
// }
-//}
+}
//
//RULE(expr_list)
//{
"FOO = 5 > 3");
parse_rule(const_decl, 0,
"FOO = 5 >= 3");
+ parse_rule(const_decl, 0,
+ "FOO = 5, BAR = FOO - 3");
}
}
#endif