expr = func_call(expr)
elsif matches("[")
expr = array_or_hash_access(expr)
+ elsif matches(".")
+ expr = record_access(expr)
end
expr
end
make_binop(loc, "[", expr, key)
end
+ def record_access(expr)
+ expect(".")
+ loc = location
+ field = identifier()
+ make_binop(loc, ".", expr, field)
+ end
+
def const_or_ident()
if matches(:new)
record_literal()
else
error(expr.loc, "don't know how to index into type: #{left_type}")
end
+ elsif expr.op == "."
+ rec_type = lookup_type(env, infer(env, expr.left))
+ if rec_type.form != :record
+ error(expr.loc, "left hand side of the '.' operator is not a record type")
+ end
+ if not expr.right.is_a? IR::Var
+ error(expr.loc, "right hand side of '.' operator is not an identifier")
+ end
+ if expr.right.module != nil
+ error(expr.loc, "qualified identifier is not valid right hand operand for the '.' operator")
+ end
+ expr.type = rec_type.fields[expr.right.name]
else
tname = typename(vtype)
optype = BinaryOps[expr.op][tname]