anchor.diff:    static const TagType tripleMustache = const TagType('tripleMustache');
     static const TagType unescapedVariable = const TagType('unescapedVariable');
     static const TagType partial = const TagType('partial');
  -}
  -
  -TagType tagTypeFromString(String s) => const {
  -          '#': TagType.openSection,
  -          '^': TagType.openInverseSection,
  -          '/': TagType.closeSection,
  -          '&': TagType.unescapedVariable,
  -          '>': TagType.partial
  -        }[s];
  +  static const TagType comment = const TagType('comment');
  +}
  +
  +const _tagTypeMap = const {
  +        '#': TagType.openSection,
  +        '^': TagType.openInverseSection,
  +        '/': TagType.closeSection,
  +        '&': TagType.unescapedVariable,
  +        '>': TagType.partial,
  +        '!': TagType.comment};
  +
  +TagType tagTypeFromString(String s) { 
  +  var type = _tagTypeMap[s];
  +  if (type == null) throw 'boom!'; //TODO unreachable.
  +  return type;
  +}
   
   class Parser {
     
  
positive.code:             
        // Return null for close section.
        case TagType.closeSection:
          node = null;
          break;
  
  
negative.code:   //final List<List<String>> arguments;
  }
  
  // Note change delimiter tags are parsed out before they reach this stage.
  class TagType {
    const TagType(this.name);
    final String name;
  