code: func (p *Parser) listType() (*ast.ListType, error) {
  	defer un(trace(p, "ParseListType"))
  
  	// we assume that the currently scanned token is a LBRACK
  	l := &ast.ListType{}
  
  	for {
  		tok := p.scan()
  		switch tok.Type {
  		case token.NUMBER, token.FLOAT, token.STRING:
  			node, err := p.literalType()
  			if err != nil {
  				return nil, err
  			}
  
  			l.Add(node)
  		case token.COMMA:
  			continue
  		case token.LBRACE:
  			node, err := p.objectType()
  			if err != nil {
  				return nil, err
  			}
  
  			l.Add(node)
  		case token.BOOL:
  			// TODO(arslan) should we support? not supported by HCL yet
  		case token.LBRACK:
  			// TODO(arslan) should we support nested lists? Even though it's
  			// written in README of HCL, it's not a part of the grammar
  			// (not defined in parse.y)
  		case token.RBRACK:
  			// finished
  			return l, nil
  		default:
  			return nil, fmt.Errorf("unexpected token while parsing list: %s", tok.Type)
  		}
  
  	}
  }
docs: // listType parses a list type and returns a ListType AST