Правило ввода для этого будет выглядеть примерно так: для любого идентификатора memberName
и любого выражения exp
: если exp
является выражением типа T
, где T
является структурой с членом с именемmemberName
, тогда выражение exp.memberName
хорошо напечатано и имеет тип T.memberName
.В противном случае выражение имеет неверный тип.
С точки зрения реализации, это мало чем отличается от реализации других частей средства проверки типов: вы проверяете подвыражение, проверяете, что оно имеет соответствующий тип,создайте ошибку типа, если нет, и верните правильный тип в противном случае.Единственное, что нужно учитывать, это то, что вы должны отслеживать, какие типы структур определяют, какие члены.Код может выглядеть примерно так:
TypeInfo visitDotExpression(MemberAccess exp) {
TypeInfo leftType = visit(exp.leftOperand);
if (leftType.isStructType()) {
if (leftType.memberTypes.containsKey(exp.memberName)) {
return leftType.memberTypes.get(exp.memberName);
} else {
// produce a type error because the struct doesn't have a member
// with the given name
}
} else {
// Produce a type error because left operand of `.` is not a struct
}
}