anchor.diff:    }
   
     @override
  +  ng.TemplateAst visitEmbeddedContent(ast.EmbeddedContentAst astNode,
  +          [ParseContext _]) =>
  +      new ng.NgContentAst(
  +          ngContentIndex++, 0 /* ngContentIndex */, astNode.sourceSpan);
  +
  +  @override
     ng.TemplateAst visitEvent(ast.EventAst astNode, [ParseContext _]) {
       var value = parser.parseAction(astNode.value, _location(astNode), const []);
       return new ng.BoundEventAst(astNode.name, value, astNode.sourceSpan);
     }
   
     @override
  -  ng.TemplateAst visitExpression(ast.ExpressionAst astNode, [ParseContext _]) =>
  -      throw new UnimplementedError('Don\'t know how to handle expressions.');
  +  ng.TemplateAst visitAttribute(ast.AttributeAst astNode, [ParseContext _]) =>
  +      new ng.AttrAst(astNode.name, astNode.value ?? '', astNode.sourceSpan);
  +
  +  @override
  +  ng.TemplateAst visitProperty(ast.PropertyAst astNode,
  +      [ParseContext context]) {
  +    var value = parser.parseBinding(astNode.value, _location(astNode), []);
  +    return createElementPropertyAst(
  +        context.elementName,
  +        _getPropertyName(astNode),
  +        value,
  +        astNode.sourceSpan,
  +        schemaRegistry,
  +        (_, __, [___]) {});
  +  }
  +
  +  static String _getPropertyName(ast.PropertyAst astNode) {
  +    if (astNode.unit != null) {
  +      return '${astNode.name}.${astNode.postfix}.${astNode.unit}';
  +    }
  +    if (astNode.postfix != null) {
  +      return '${astNode.name}.${astNode.postfix}';
  +    }
  +    return astNode.name;
  +  }
  +
  +  @override
  +  ng.TemplateAst visitLetBinding(ast.LetBindingAst astNode, [ParseContext _]) =>
  +      new ng.VariableAst(astNode.name, astNode.value, astNode.sourceSpan);
  +
  +  @override
  +  ng.TemplateAst visitReference(ast.ReferenceAst astNode, [ParseContext _]) =>
  +      new ng.ReferenceAst(
  +          astNode.variable, null /* value */, astNode.sourceSpan);
  +
  +  @override
  +  ng.TemplateAst visitText(ast.TextAst astNode, [ParseContext _]) =>
  +      new ng.TextAst(astNode.value, 0 /* ngContentIndex */, astNode.sourceSpan);
   
     @override
     ng.TemplateAst visitInterpolation(ast.InterpolationAst astNode,
  
positive.code:   }
  
    @override
    ng.TemplateAst visitEmbeddedContent(ast.EmbeddedContentAst astNode,
            [ParseContext _]) =>
        new ng.NgContentAst(
            ngContentIndex++, 0 /* ngContentIndex */, astNode.sourceSpan);
  
    @override
    ng.TemplateAst visitEmbeddedTemplate(ast.EmbeddedTemplateAst astNode,
        [ParseContext context]) {
      var matchedDirectives = _matchTemplateDirectives(context, astNode);
  
negative.code:   Visitor(this.parser, this.schemaRegistry);
  
    @override
    ng.TemplateAst visitElement(ast.ElementAst astNode, [ParseContext context]) {
      var matchedDirectives = _matchElementDirectives(context, astNode);
      var directiveAsts = _toAst(matchedDirectives, astNode.sourceSpan);
  