AttributeType
attribute_type(path, type).
Real DynamoDB accepts the type operand only as an expression attribute value - attribute_type(#a, :t) with :t bound to a string holding the type name - so that form is parsed here and resolved through the request's ExpressionAttributeValues. The bare-name form (attribute_type(a, S)), which this fake has always accepted and real DynamoDB rejects, still parses so existing expressions keep working.
An unresolvable or non-type operand is reported as a DynamoDbConditionError, which the endpoints map onto the ValidationException the real service answers with. DynamoDB treats that as a request error rather than a data-dependent result, so the operand is resolved in Expr.validate as well as in eval: without it attribute_not_exists(#a) OR attribute_type(#a, :missing) would quietly succeed whenever the left operand happened to be true, and the bad token would never be reported.